Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions model/arc.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
from bpy.utils import register_classes_factory

from ..solver import Solver
from .base_entity import SlvsGenericEntity
from .base_entity import SlvsGenericEntity, tag_update
from .base_entity import Entity2D
from .utilities import slvs_entity_pointer, tag_update
from .utilities import slvs_entity_pointer
from .constants import CURVE_RESOLUTION
from ..utilities.constants import HALF_TURN, FULL_TURN, QUARTER_TURN
from ..utilities.math import range_2pi, pol2cart
Expand Down
52 changes: 33 additions & 19 deletions model/base_entity.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
"""
Base entity classes for CAD Sketcher.

"""

import logging
from typing import List

import gpu
from bpy import app
from bpy.props import IntProperty, StringProperty, BoolProperty
from bpy.types import Context

Expand All @@ -17,6 +23,12 @@
logger = logging.getLogger(__name__)


def tag_update(self, _context=None):
# context argument ignored
if not self.is_dirty:
self.is_dirty = True


class SlvsGenericEntity:
def entity_name_getter(self):
return self.get("name", str(self))
Expand All @@ -34,7 +46,7 @@ def entity_name_setter(self, new_name):
fixed: BoolProperty(name="Fixed", update=update_system_cb)
visible: BoolProperty(name="Visible", default=True, update=update_cb)
origin: BoolProperty(name="Origin")
construction: BoolProperty(name="Construction")
construction: BoolProperty(name="Construction", update=tag_update)
props = ()
dirty: BoolProperty(name="Needs Update", default=True, options={"SKIP_SAVE"})

Expand Down Expand Up @@ -64,8 +76,10 @@ def is_dirty(self, value: bool):
@property
def _shader(self):
if self.is_point():
return Shaders.uniform_color_3d()
return Shaders.uniform_color_line_3d()
return Shaders.point_color_3d()
if self.is_dashed():
return Shaders.uniform_color_line_3d()
return Shaders.polyline_color_3d()

@property
def _id_shader(self):
Expand All @@ -90,7 +104,7 @@ def line_width(self):

@property
def line_width_select(self):
return 4 * preferences.get_scale()
return 4 * self.line_width

def __str__(self):
_, local_index = breakdown_index(self.slvs_index)
Expand Down Expand Up @@ -213,27 +227,32 @@ def is_dashed(self):

def draw(self, context):
if not self.is_visible(context):
return None
return

batch = self._batch
if not batch:
return

shader = self._shader
shader.bind()

gpu.state.blend_set("ALPHA")
gpu.state.point_size_set(self.point_size)

col = self.color(context)
shader.uniform_float("color", col)

if not self.is_point():
shader.uniform_bool("dashed", (self.is_dashed(),))
shader.uniform_float("dash_width", 0.05)
shader.uniform_float("dash_factor", 0.3)
if self.is_point():
gpu.state.point_size_set(self.point_size)
else:
gpu.state.line_width_set(self.line_width)

if self.is_dashed():
shader.uniform_bool("dashed", (self.is_dashed(),))
shader.uniform_float("dash_width", 0.05)
shader.uniform_float("dash_factor", 0.3)
elif app.version >= (4, 5):
shader.uniform_float("lineWidth", self.line_width)
shader.uniform_float("viewportSize", (context.region.width, context.region.height))

batch.draw(shader)
gpu.shader.unbind()
self.restore_opengl_defaults()
Expand All @@ -254,10 +273,10 @@ def draw_id(self, context):

shader.uniform_float("color", (*index_to_rgb(self.slvs_index), 1.0))
if not self.is_point():
# viewport = [context.area.width, context.area.height]
# shader.uniform_float("Viewport", viewport)
shader.uniform_bool("dashed", (False,))
gpu.state.line_width_set(self.line_width_select)
if app.version >= (4, 5):
shader.uniform_float("lineWidth", self.line_width_select)
shader.uniform_float("viewportSize", (context.region.width, context.region.height))

batch.draw(shader)
gpu.shader.unbind()
Expand Down Expand Up @@ -331,11 +350,6 @@ def draw_props(self, layout):

return sub

def tag_update(self, _context=None):
# context argument ignored
if not self.is_dirty:
self.is_dirty = True

def new(self, context: Context, **kwargs):
"""Create new entity based on this instance"""
raise NotImplementedError
Expand Down
4 changes: 2 additions & 2 deletions model/circle.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@

from ..solver import Solver
from ..utilities.math import range_2pi, pol2cart
from .base_entity import SlvsGenericEntity
from .base_entity import SlvsGenericEntity, tag_update
from .base_entity import Entity2D
from .utilities import slvs_entity_pointer, tag_update
from .utilities import slvs_entity_pointer
from .constants import CURVE_RESOLUTION
from ..utilities.constants import HALF_TURN, FULL_TURN
from ..utilities.draw import coords_arc_2d
Expand Down
6 changes: 3 additions & 3 deletions model/normal_3d.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from mathutils import Euler

from ..solver import Solver
from .base_entity import SlvsGenericEntity
from .base_entity import SlvsGenericEntity, tag_update


logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -50,7 +50,7 @@ def set_orientation(self, value):
description="Quaternion which describes the orientation of the normal",
subtype="QUATERNION",
size=4,
update=SlvsGenericEntity.tag_update,
update=tag_update,
)

ui_orientation: FloatVectorProperty(
Expand All @@ -60,7 +60,7 @@ def set_orientation(self, value):
get=get_orientation,
set=set_orientation,
options={"SKIP_SAVE"},
update=SlvsGenericEntity.tag_update,
update=tag_update,
)
props = ("ui_orientation",)

Expand Down
7 changes: 4 additions & 3 deletions model/point_2d.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@

from ..utilities.draw import draw_rect_2d
from ..solver import Solver
from .base_entity import SlvsGenericEntity
from .base_entity import Entity2D
from .base_entity import SlvsGenericEntity, Entity2D, tag_update
from .utilities import slvs_entity_pointer, make_coincident
from .line_2d import SlvsLine2D
from ..utilities.constants import HALF_TURN

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -79,8 +79,9 @@ class SlvsPoint2D(Point2D, PropertyGroup):
subtype="XYZ",
size=2,
unit="LENGTH",
update=SlvsGenericEntity.tag_update,
update=tag_update,
)
props = ("co",)

def dependencies(self) -> List[SlvsGenericEntity]:
return [
Expand Down
3 changes: 2 additions & 1 deletion model/point_3d.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from ..utilities.draw import draw_cube_3d
from ..solver import Solver
from .base_entity import SlvsGenericEntity
from .base_entity import tag_update


logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -60,7 +61,7 @@ class SlvsPoint3D(Point3D, PropertyGroup):
description="The location of the point",
subtype="XYZ",
unit="LENGTH",
update=SlvsGenericEntity.tag_update,
update=tag_update,
)
props = ("location",)

Expand Down
28 changes: 25 additions & 3 deletions operators/select_box.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from ..utilities.index import rgb_to_index
from ..utilities.view import refresh
from ..utilities.select import mode_property, deselect_all
from ..shaders import Shaders


def get_start_dist(value1, value2, invert: bool = False):
Expand All @@ -19,9 +20,21 @@ def get_start_dist(value1, value2, invert: bool = False):


def draw_callback_px(self, context):
shader = gpu.shader.from_builtin("UNIFORM_COLOR")
"""Draw selection box with appropriate shader based on GPU backend."""
# Simple backend detection
try:
backend_type = gpu.platform.backend_type_get()
is_vulkan_metal = backend_type in ('VULKAN', 'METAL')
except:
is_vulkan_metal = False

# Use appropriate shader
if is_vulkan_metal:
shader = gpu.shader.from_builtin("UNIFORM_COLOR")
else:
shader = Shaders.uniform_color_line_2d()

gpu.state.blend_set("ALPHA")
gpu.state.line_width_set(2.0)

start = self.start_coords
end = self.mouse_pos
Expand All @@ -30,9 +43,18 @@ def draw_callback_px(self, context):
batch = batch_for_shader(shader, "LINE_STRIP", {"pos": box_path})
shader.bind()
shader.uniform_float("color", (0.0, 0.0, 0.0, 0.5))

# Set line width uniforms for custom shader only
if not is_vulkan_metal:
try:
shader.uniform_float("lineWidth", 2.0)
except:
pass

gpu.state.line_width_set(2.0)
batch.draw(shader)

# restore opengl defaults
# Restore OpenGL defaults
gpu.state.line_width_set(1.0)
gpu.state.blend_set("NONE")

Expand Down
27 changes: 13 additions & 14 deletions operators/update.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
from bpy.types import Operator, Context
import bpy
from bpy.types import Operator
from bpy.utils import register_classes_factory

from ..declarations import Operators
from ..solver import Solver
from ..converters import update_convertor_geometry


class View3D_OT_update(Operator):
"""Solve all sketches and update converted geometry"""
class VIEW3D_OT_update(Operator):
bl_idname = "view3d.slvs_update"
bl_label = "Update"

bl_idname = Operators.Update
bl_label = "Force Update"
def execute(self, context):
update_convertor_geometry()
solvesys = Solver()
solvesys.solve()
return {'FINISHED'}

def execute(self, context: Context):
solver = Solver(context, None, all=True)
solver.solve()

update_convertor_geometry(context.scene)
return {"FINISHED"}


register, unregister = register_classes_factory((View3D_OT_update,))
register, unregister = register_classes_factory((
VIEW3D_OT_update,
))
Loading