docs: v1.0.0

This commit is contained in:
2024-09-11 13:10:50 +08:00
parent 7c71417e5d
commit 20c6393344
89 changed files with 426 additions and 733 deletions

View File

@@ -100,7 +100,8 @@ class ExtractObject():
output_node = get_nodes_by_type(node_group, 'NodeGroupOutput')[0]
fetch_mesh_node = add_node_to_graph(f"Fetch{self.object_type}",
node_group,
get_use_link())
node_label=f"Fetch {self.object_type}",
use_link=get_use_link())
fetch_mesh_node.inputs[0].default_value = container_obj
node_group.links.new(fetch_mesh_node.outputs[0], output_node.inputs[0])
@@ -220,7 +221,7 @@ class AddCutter():
# center = [find_center(axis) for axis in [x, y, z]]
# cutter_obj.location = center
name = self.cutter_type.capitalize()
name = f"{self.cutter_type.capitalize()}_Cutter"
cutter_obj.name = name
cutter_obj.data.name = name
cutter_obj.visible_camera = False
@@ -243,13 +244,14 @@ class AddCutter():
if len(cut_nodes) == 0:
cutter_node = add_node_to_graph("ObjectCutter",
node_group,
get_use_link())
node_label=name,
use_link=get_use_link())
cutter_node.inputs[0].default_value = self.cutter_type.capitalize()
cutter_node.inputs[1].default_value = cutter_obj
cut_node = add_node_to_graph("Cut",
node_group,
get_use_link())
use_link=get_use_link())
output_node = get_nodes_by_type(node_group,
'NodeGroupOutput')[0]
@@ -362,7 +364,7 @@ class AddSlicer(bpy.types.Operator):
slice_node = add_node_to_graph("Slice",
node_group,
get_use_link())
use_link=get_use_link())
slice_node.inputs[1].default_value = slicer_obj
@@ -412,7 +414,8 @@ class AddLocator(bpy.types.Operator):
parent_node = add_node_to_graph("TransformParent",
node_group,
get_use_link())
node_label="Transform Parent",
use_link=get_use_link())
parent_node.inputs[1].default_value = locator_obj

View File

@@ -828,7 +828,7 @@ class ImportVolumetricDataDialog(bpy.types.Operator):
container = Container(name=name,
layers=self.layers)
step_size = container.layers[0].bioxel_size[0]*5
step_size = container.layers[0].bioxel_size[0]*10
container_obj = container_to_obj(container,
scene_scale=self.scene_scale,
step_size=step_size,
@@ -839,8 +839,8 @@ class ImportVolumetricDataDialog(bpy.types.Operator):
# Change render setting for better result
if is_first_import:
bpy.ops.bioxelnodes.render_setting_preset('EXEC_DEFAULT',
preset="preview_c")
# bpy.ops.bioxelnodes.slice_viewer('EXEC_DEFAULT')
preset="balance")
bpy.context.scene.render.engine = 'CYCLES'
self.report({"INFO"}, "Successfully Imported")
return {'FINISHED'}

View File

@@ -3,14 +3,17 @@ import bpy
import numpy as np
from ..exceptions import NoContent
from ..bioxel.layer import Layer
from ..bioxelutils.node import add_node_to_graph
from ..bioxelutils.common import (get_container_obj, get_layer_kind, get_layer_label, get_layer_name,
get_layer_prop_value,
get_container_layer_objs,
get_node_type, is_missing_layer, set_layer_prop_value)
get_node_type, is_missing_layer, move_node_to_node, set_layer_prop_value)
from ..bioxelutils.layer import layer_to_obj, obj_to_layer
from ..utils import get_cache_dir, copy_to_dir
from ..utils import get_cache_dir, copy_to_dir, get_use_link
def get_label_layer_selection(self, context):
@@ -105,12 +108,17 @@ class OutputLayerOperator():
return orig_layer
def add_layer_node(self, context, layer):
orig_node = context.selected_nodes[0]
layer_obj = layer_to_obj(layer,
container_obj=context.object,
cache_dir=get_cache_dir())
bpy.ops.bioxelnodes.fetch_layer('INVOKE_DEFAULT',
layer_obj_name=layer_obj.name)
node_group = context.space_data.edit_tree
fetch_node = add_node_to_graph("FetchLayer",
node_group,
use_link=get_use_link())
fetch_node.label = get_layer_prop_value(layer_obj, "name")
fetch_node.inputs[0].default_value = layer_obj
move_node_to_node(fetch_node, orig_node, (0, -100))
def execute(self, context):
layer_obj = get_selected_layer(context)

View File

@@ -2,10 +2,10 @@ import bpy
from pathlib import Path
import shutil
from ..bioxelutils.common import get_all_layer_objs, is_missing_layer, set_file_prop
from ..bioxelutils.common import get_all_layer_objs, get_node_lib_path, get_node_version, is_missing_layer, set_file_prop
from .layer import RemoveLayers, SaveLayersCache
from ..constants import NODE_LIB_FILEPATH, VERSION
from ..constants import NODE_LIB_DIRPATH, VERSIONS
from ..utils import get_cache_dir
@@ -15,13 +15,12 @@ class ReLinkNodeLib(bpy.types.Operator):
bl_description = "Relink all nodes to addon library source"
bl_options = {'UNDO'}
node_lib_filename: bpy.props.StringProperty(
default=""
) # type: ignore
index: bpy.props.IntProperty() # type: ignore
def execute(self, context):
lib_filepath = Path(NODE_LIB_FILEPATH.parent,
f"{self.node_lib_filename}.blend")
node_version = VERSIONS[self.index]['node_version']
lib_path = get_node_lib_path(node_version)
node_libs = []
for node_group in bpy.data.node_groups:
if node_group.name.startswith("BioxelNodes"):
@@ -32,10 +31,12 @@ class ReLinkNodeLib(bpy.types.Operator):
node_libs = list(set(node_libs))
for node_lib in node_libs:
node_lib.filepath = str(lib_filepath)
node_lib.filepath = str(lib_path)
# FIXME: may cause crash
node_lib.reload()
set_file_prop("node_version", node_version)
self.report({"INFO"}, f"Successfully relinked.")
return {'FINISHED'}
@@ -54,13 +55,22 @@ class SaveNodeLib(bpy.types.Operator):
) # type: ignore
def execute(self, context):
node_version = get_node_version()
if node_version is None:
node_version = VERSIONS[0]["node_version"]
else:
if node_version not in [v["node_version"] for v in VERSIONS]:
node_version = VERSIONS[0]["node_version"]
lib_path = get_node_lib_path(node_version)
lib_dir = bpy.path.abspath(self.lib_dir)
local_lib_path: Path = Path(lib_dir, NODE_LIB_FILEPATH.name).resolve()
addon_lib_path: Path = NODE_LIB_FILEPATH
local_lib_path: Path = Path(lib_dir, lib_path.name).resolve()
node_lib_path: Path = lib_path
blend_path = Path(bpy.path.abspath("//")).resolve()
if local_lib_path != addon_lib_path:
shutil.copy(addon_lib_path, local_lib_path)
if local_lib_path != node_lib_path:
shutil.copy(node_lib_path, local_lib_path)
libs = []
for node_group in bpy.data.node_groups:
@@ -73,8 +83,6 @@ class SaveNodeLib(bpy.types.Operator):
lib.filepath = bpy.path.relpath(str(local_lib_path),
start=str(blend_path))
set_file_prop("addon_version", VERSION)
return {'FINISHED'}
def invoke(self, context, event):
@@ -116,55 +124,64 @@ class RenderSettingPreset(bpy.types.Operator):
bl_options = {'UNDO'}
PRESETS = {
"preview_e": "Preview (EEVEE)",
"preview_c": "Preview (Cycles)",
"production_e": "Production (EEVEE)",
"production_c": "Production (Cycles)"
"performance": "Performance",
"balance": "Balance",
"quality": "Quality",
}
preset: bpy.props.EnumProperty(name="Preset",
default="preview_c",
default="balance",
items=[(k, v, "")
for k, v in PRESETS.items()]) # type: ignore
def execute(self, context):
if self.preset == "preview_e":
bpy.context.scene.render.engine = 'BLENDER_EEVEE_NEXT'
if self.preset == "performance":
# EEVEE
bpy.context.scene.eevee.use_taa_reprojection = False
bpy.context.scene.eevee.taa_samples = 16
bpy.context.scene.eevee.volumetric_tile_size = '2'
bpy.context.scene.eevee.volumetric_shadow_samples = 128
bpy.context.scene.eevee.volumetric_samples = 128
bpy.context.scene.eevee.volumetric_ray_depth = 16
bpy.context.scene.eevee.volumetric_shadow_samples = 32
bpy.context.scene.eevee.volumetric_samples = 64
bpy.context.scene.eevee.volumetric_ray_depth = 1
bpy.context.scene.eevee.use_volumetric_shadows = True
elif self.preset == "production_e":
bpy.context.scene.render.engine = 'BLENDER_EEVEE_NEXT'
# Cycles
bpy.context.scene.cycles.shading_system = True
bpy.context.scene.cycles.volume_bounces = 0
bpy.context.scene.cycles.transparent_max_bounces = 4
bpy.context.scene.cycles.volume_preview_step_rate = 4
bpy.context.scene.cycles.volume_step_rate = 4
elif self.preset == "balance":
# EEVEE
bpy.context.scene.eevee.use_taa_reprojection = False
bpy.context.scene.eevee.taa_samples = 16
bpy.context.scene.eevee.volumetric_tile_size = '1'
bpy.context.scene.eevee.volumetric_tile_size = '2'
bpy.context.scene.eevee.volumetric_shadow_samples = 64
bpy.context.scene.eevee.volumetric_samples = 128
bpy.context.scene.eevee.volumetric_ray_depth = 8
bpy.context.scene.eevee.use_volumetric_shadows = True
# Cycles
bpy.context.scene.cycles.shading_system = True
bpy.context.scene.cycles.volume_bounces = 4
bpy.context.scene.cycles.transparent_max_bounces = 8
bpy.context.scene.cycles.volume_preview_step_rate = 1
bpy.context.scene.cycles.volume_step_rate = 1
elif self.preset == "quality":
# EEVEE
bpy.context.scene.eevee.use_taa_reprojection = False
bpy.context.scene.eevee.volumetric_tile_size = '2'
bpy.context.scene.eevee.volumetric_shadow_samples = 128
bpy.context.scene.eevee.volumetric_samples = 256
bpy.context.scene.eevee.volumetric_ray_depth = 16
bpy.context.scene.eevee.use_volumetric_shadows = True
elif self.preset == "preview_c":
bpy.context.scene.render.engine = 'CYCLES'
# Cycles
bpy.context.scene.cycles.shading_system = True
bpy.context.scene.cycles.volume_bounces = 12
bpy.context.scene.cycles.volume_bounces = 8
bpy.context.scene.cycles.transparent_max_bounces = 16
bpy.context.scene.cycles.volume_preview_step_rate = 1
bpy.context.scene.cycles.volume_step_rate = 1
# bpy.context.scene.cycles.use_fast_gi = True
elif self.preset == "production_c":
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.shading_system = True
bpy.context.scene.cycles.volume_bounces = 16
bpy.context.scene.cycles.transparent_max_bounces = 32
bpy.context.scene.cycles.volume_preview_step_rate = 0.5
bpy.context.scene.cycles.volume_step_rate = 0.5
# bpy.context.scene.cycles.use_fast_gi = False
return {'FINISHED'}
@@ -177,7 +194,6 @@ class SliceViewer(bpy.types.Operator):
def execute(self, context):
bpy.context.scene.eevee.use_taa_reprojection = False
bpy.context.scene.eevee.taa_samples = 4
bpy.context.scene.eevee.volumetric_tile_size = '2'
bpy.context.scene.eevee.volumetric_shadow_samples = 128
bpy.context.scene.eevee.volumetric_samples = 128

View File

@@ -1,8 +1,6 @@
import bpy
from ..bioxelutils.common import get_file_prop, is_incompatible, local_lib_not_updated
from ..constants import VERSION
from ast import literal_eval
from ..bioxelutils.common import is_incompatible, local_lib_not_updated
from ..bioxelutils.node import assign_node_group, get_node_group
from ..utils import get_use_link
@@ -57,6 +55,6 @@ class AddNode(bpy.types.Operator):
if local_lib_not_updated():
self.report({"WARNING"},
"Local library version does not match the current addon version, which may cause problems, please save the node library again.")
"Local node library version does not match the current addon version, which may cause problems, please save the node library again.")
return {"FINISHED"}