Merge branch 'master' into refactor-mesh-corners-generic

This commit is contained in:
Hans Goudey 2022-12-06 14:26:03 -06:00
commit cfb1705ce1
18 changed files with 182 additions and 2180 deletions

View File

@ -410,10 +410,10 @@ class CYCLES_RENDER_PT_sampling_lights(CyclesButtonsPanel, Panel):
cscene = scene.cycles
col = layout.column(align=True)
#col.prop(cscene, "use_light_tree")
col.prop(cscene, "use_light_tree")
sub = col.row()
sub.prop(cscene, "light_sampling_threshold", text="Light Threshold")
#sub.active = not cscene.use_light_tree
sub.active = not cscene.use_light_tree
class CYCLES_RENDER_PT_subdivision(CyclesButtonsPanel, Panel):

View File

@ -347,7 +347,7 @@ void BlenderSync::sync_integrator(BL::ViewLayer &b_view_layer, bool background)
integrator->set_motion_blur(view_layer.use_motion_blur);
}
bool use_light_tree = false; // get_boolean(cscene, "use_light_tree");
bool use_light_tree = get_boolean(cscene, "use_light_tree");
integrator->set_use_light_tree(use_light_tree);
integrator->set_light_sampling_threshold(
(use_light_tree) ? 0.0f : get_float(cscene, "light_sampling_threshold"));

View File

@ -58,7 +58,7 @@ ccl_device_inline float4 madd4(const float4 a, const float4 b, const float4 c)
ccl_device_inline int fast_rint(float x)
{
/* used by sin/cos/tan range reduction. */
#ifdef __KERNEL_SSE4__
#ifdef __KERNEL_SSE41__
/* Single `roundps` instruction on SSE4.1+ (for gcc/clang at least). */
return float_to_int(rintf(x));
#else

View File

@ -27,7 +27,13 @@ typedef enum {
} NDOF_DeviceT;
/* NDOF device button event types */
/**
* NDOF device button event types.
*
* \note Button values are stored in DNA as part of key-map items.
* Existing values should not be changed. Otherwise, a mapping must be used,
* see #NDOF_BUTTON_INDEX_AS_EVENT.
*/
typedef enum {
/* Used internally, never sent or used as an index. */
NDOF_BUTTON_NONE = -1,
@ -58,6 +64,11 @@ typedef enum {
NDOF_BUTTON_DOMINANT,
NDOF_BUTTON_PLUS,
NDOF_BUTTON_MINUS,
/* Store Views. */
NDOF_BUTTON_V1,
NDOF_BUTTON_V2,
NDOF_BUTTON_V3,
_NDOF_UNUSED_0,
/* General-purpose buttons.
* Users can assign functions via keymap editor. */
NDOF_BUTTON_1,
@ -74,11 +85,8 @@ typedef enum {
NDOF_BUTTON_A,
NDOF_BUTTON_B,
NDOF_BUTTON_C,
/* Store Views. */
NDOF_BUTTON_V1,
NDOF_BUTTON_V2,
NDOF_BUTTON_V3,
/* Keyboard emulation. */
/* Keyboard emulation (keep last as they are mapped to regular keyboard events). */
NDOF_BUTTON_ESC,
NDOF_BUTTON_ENTER,
NDOF_BUTTON_DELETE,

View File

@ -154,97 +154,14 @@ class DATA_PT_bone_groups(ArmatureButtonsPanel, Panel):
sub.operator("pose.group_deselect", text="Deselect")
class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
bl_label = "Pose Library (Legacy)"
bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
return (context.object and context.object.type == 'ARMATURE' and context.object.pose)
@staticmethod
def get_manual_url():
url_fmt = "https://docs.blender.org/manual/en/%d.%d/animation/armatures/posing/editing/pose_library.html"
return url_fmt % bpy.app.version[:2]
def draw(self, context):
layout = self.layout
col = layout.column(align=True)
col.label(text="This panel is a remainder of the old pose library,")
col.label(text="which was replaced by the Asset Browser")
url = self.get_manual_url()
col.operator("wm.url_open", text="More Info", icon='URL').url = url
layout.separator()
ob = context.object
poselib = ob.pose_library
col = layout.column(align=True)
col.template_ID(ob, "pose_library", new="poselib.new", unlink="poselib.unlink")
if poselib:
if hasattr(bpy.types, "POSELIB_OT_convert_old_object_poselib"):
col.operator("poselib.convert_old_object_poselib",
text="Convert to Pose Assets", icon='ASSET_MANAGER')
else:
col.label(text="Enable the Pose Library add-on to convert", icon='ERROR')
col.label(text="this legacy pose library to pose assets", icon='BLANK1')
# Put the deprecated stuff in its own sub-layout.
dep_layout = layout.column()
dep_layout.active = False
# warning about poselib being in an invalid state
if poselib.fcurves and not poselib.pose_markers:
dep_layout.label(
icon='ERROR',
text="Error: Potentially corrupt library, run 'Sanitize' operator to fix",
)
# list of poses in pose library
row = dep_layout.row()
row.template_list("UI_UL_list", "pose_markers", poselib, "pose_markers",
poselib.pose_markers, "active_index", rows=3)
# column of operators for active pose
# - goes beside list
col = row.column(align=True)
# invoke should still be used for 'add', as it is needed to allow
# add/replace options to be used properly
col.operator("poselib.pose_add", icon='ADD', text="")
col.operator_context = 'EXEC_DEFAULT' # exec not invoke, so that menu doesn't need showing
pose_marker_active = poselib.pose_markers.active
if pose_marker_active is not None:
col.operator("poselib.pose_remove", icon='REMOVE', text="")
col.operator(
"poselib.apply_pose",
icon='ZOOM_SELECTED',
text="",
).pose_index = poselib.pose_markers.active_index
col.operator("poselib.action_sanitize", icon='HELP', text="") # XXX: put in menu?
if pose_marker_active is not None:
col.operator("poselib.pose_move", icon='TRIA_UP', text="").direction = 'UP'
col.operator("poselib.pose_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, Panel):
bl_label = "Inverse Kinematics"
bl_options = {'DEFAULT_CLOSED'}
bl_options = {"DEFAULT_CLOSED"}
@classmethod
def poll(cls, context):
ob = context.object
return (ob and ob.pose)
return ob and ob.pose
def draw(self, context):
layout = self.layout
@ -341,7 +258,6 @@ classes = (
DATA_PT_skeleton,
DATA_MT_bone_group_context_menu,
DATA_PT_bone_groups,
DATA_PT_pose_library,
DATA_PT_motion_paths,
DATA_PT_motion_paths_display,
DATA_PT_display,

View File

@ -851,6 +851,8 @@ static void object_blend_read_lib(BlendLibReader *reader, ID *id)
BLO_read_id_address(reader, ob->id.lib, &ob->parent);
BLO_read_id_address(reader, ob->id.lib, &ob->track);
/* XXX deprecated - old pose library, deprecated in Blender 3.5. */
BLO_read_id_address(reader, ob->id.lib, &ob->poselib);
/* 2.8x drops support for non-empty dupli instances. */

View File

@ -33,7 +33,6 @@ set(SRC
pose_backup.cc
pose_edit.c
pose_group.c
pose_lib.c
pose_lib_2.c
pose_select.c
pose_slide.c

View File

@ -201,21 +201,6 @@ LinkData *poseAnim_mapping_getNextFCurve(ListBase *fcuLinks, LinkData *prev, con
/** \name PoseLib
* \{ */
/* pose_lib.c */
void POSELIB_OT_new(struct wmOperatorType *ot);
void POSELIB_OT_unlink(struct wmOperatorType *ot);
void POSELIB_OT_action_sanitize(struct wmOperatorType *ot);
void POSELIB_OT_pose_add(struct wmOperatorType *ot);
void POSELIB_OT_pose_remove(struct wmOperatorType *ot);
void POSELIB_OT_pose_rename(struct wmOperatorType *ot);
void POSELIB_OT_pose_move(struct wmOperatorType *ot);
void POSELIB_OT_browse_interactive(struct wmOperatorType *ot);
void POSELIB_OT_apply_pose(struct wmOperatorType *ot);
/* pose_lib_2.c */
void POSELIB_OT_apply_pose_asset(struct wmOperatorType *ot);

View File

@ -114,21 +114,9 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(POSE_OT_propagate);
/* POSELIB */
WM_operatortype_append(POSELIB_OT_browse_interactive);
WM_operatortype_append(POSELIB_OT_apply_pose);
WM_operatortype_append(POSELIB_OT_apply_pose_asset);
WM_operatortype_append(POSELIB_OT_blend_pose_asset);
WM_operatortype_append(POSELIB_OT_pose_add);
WM_operatortype_append(POSELIB_OT_pose_remove);
WM_operatortype_append(POSELIB_OT_pose_rename);
WM_operatortype_append(POSELIB_OT_pose_move);
WM_operatortype_append(POSELIB_OT_new);
WM_operatortype_append(POSELIB_OT_unlink);
WM_operatortype_append(POSELIB_OT_action_sanitize);
/* POSE SLIDING */
WM_operatortype_append(POSE_OT_push);
WM_operatortype_append(POSE_OT_relax);

File diff suppressed because it is too large Load Diff

View File

@ -278,9 +278,6 @@ static void outliner_add_object_contents(SpaceOutliner *space_outliner,
outliner_add_element(space_outliner, &te->subtree, ob, te, TSE_ANIM_DATA, 0);
}
/* FIXME: add a special type for this. */
outliner_add_element(space_outliner, &te->subtree, ob->poselib, te, TSE_SOME_ID, 0);
outliner_add_element(space_outliner, &te->subtree, ob->data, te, TSE_SOME_ID, 0);
if (ob->pose) {

View File

@ -266,8 +266,8 @@ typedef struct Object {
/** Old animation system, deprecated for 2.5. */
struct Ipo *ipo DNA_DEPRECATED;
/* struct Path *path; */
struct bAction *action DNA_DEPRECATED; /* XXX deprecated... old animation system */
struct bAction *poselib;
struct bAction *action DNA_DEPRECATED; /* XXX deprecated... old animation system */
struct bAction *poselib DNA_DEPRECATED; /* Pre-Blender 3.0 pose library, deprecated in 3.5. */
/** Pose data, armature objects only. */
struct bPose *pose;
/** Pointer to objects data - an 'ID' or NULL. */

View File

@ -3750,15 +3750,6 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_GPencil_update");
/* pose */
prop = RNA_def_property(srna, "pose_library", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "poselib");
RNA_def_property_struct_type(prop, "Action");
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT);
RNA_def_property_ui_text(prop,
"Pose Library",
"Deprecated, will be removed in Blender 3.3. "
"Action used as a pose library for armatures");
prop = RNA_def_property(srna, "pose", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "pose");
RNA_def_property_struct_type(prop, "Pose");

View File

@ -99,6 +99,10 @@ static const EnumPropertyItem event_ndof_type_items[] = {
{NDOF_BUTTON_DOMINANT, "NDOF_BUTTON_DOMINANT", 0, "Dominant", ""},
{NDOF_BUTTON_PLUS, "NDOF_BUTTON_PLUS", 0, "Plus", ""},
{NDOF_BUTTON_MINUS, "NDOF_BUTTON_MINUS", 0, "Minus", ""},
/* View buttons. */
{NDOF_BUTTON_V1, "NDOF_BUTTON_V1", 0, "View 1", ""},
{NDOF_BUTTON_V2, "NDOF_BUTTON_V2", 0, "View 2", ""},
{NDOF_BUTTON_V3, "NDOF_BUTTON_V3", 0, "View 3", ""},
/* general-purpose buttons */
{NDOF_BUTTON_1, "NDOF_BUTTON_1", 0, "Button 1", ""},
{NDOF_BUTTON_2, "NDOF_BUTTON_2", 0, "Button 2", ""},
@ -113,10 +117,6 @@ static const EnumPropertyItem event_ndof_type_items[] = {
{NDOF_BUTTON_A, "NDOF_BUTTON_A", 0, "Button A", ""},
{NDOF_BUTTON_B, "NDOF_BUTTON_B", 0, "Button B", ""},
{NDOF_BUTTON_C, "NDOF_BUTTON_C", 0, "Button C", ""},
/* View buttons. */
{NDOF_BUTTON_V1, "NDOF_BUTTON_V1", 0, "View 1", ""},
{NDOF_BUTTON_V2, "NDOF_BUTTON_V2", 0, "View 2", ""},
{NDOF_BUTTON_V3, "NDOF_BUTTON_V3", 0, "View 3", ""},
# if 0 /* Never used (converted to keyboard events by GHOST). */
/* keyboard emulation */
{NDOF_BUTTON_ESC, "NDOF_BUTTON_ESC", 0, "Esc"},
@ -347,6 +347,10 @@ const EnumPropertyItem rna_enum_event_type_items[] = {
{NDOF_BUTTON_SHIFT, "NDOF_BUTTON_SHIFT", 0, "NDOF Shift", "NdofShift"},
{NDOF_BUTTON_CTRL, "NDOF_BUTTON_CTRL", 0, "NDOF Ctrl", "NdofCtrl"},
#endif
/* View buttons. */
{NDOF_BUTTON_V1, "NDOF_BUTTON_V1", 0, "NDOF View 1", ""},
{NDOF_BUTTON_V2, "NDOF_BUTTON_V2", 0, "NDOF View 2", ""},
{NDOF_BUTTON_V3, "NDOF_BUTTON_V3", 0, "NDOF View 3", ""},
/* general-purpose buttons */
{NDOF_BUTTON_1, "NDOF_BUTTON_1", 0, "NDOF Button 1", "NdofB1"},
{NDOF_BUTTON_2, "NDOF_BUTTON_2", 0, "NDOF Button 2", "NdofB2"},

View File

@ -372,104 +372,110 @@ static void calculate_cone_faces(const ConeConfig &config,
MutableSpan<MLoop> loops,
MutableSpan<MPoly> polys)
{
int loop_index = 0;
int poly_index = 0;
int rings_poly_start;
int rings_loop_start;
if (config.top_has_center_vert) {
rings_poly_start = config.circle_segments;
rings_loop_start = config.circle_segments * 3;
/* Top cone tip or center triangle fan in the fill. */
const int top_center_vert = 0;
const int top_fan_edges_start = 0;
for (const int i : IndexRange(config.circle_segments)) {
MPoly &poly = polys[poly_index++];
poly.loopstart = loop_index;
const int loop_start = i * 3;
MPoly &poly = polys[i];
poly.loopstart = loop_start;
poly.totloop = 3;
MLoop &loop_a = loops[loop_index++];
loop_a.v = config.first_ring_verts_start + i;
loop_a.e = config.first_ring_edges_start + i;
MLoop &loop_b = loops[loop_index++];
loop_b.v = config.first_ring_verts_start + ((i + 1) % config.circle_segments);
loop_b.e = top_fan_edges_start + ((i + 1) % config.circle_segments);
MLoop &loop_c = loops[loop_index++];
loop_c.v = top_center_vert;
loop_c.e = top_fan_edges_start + i;
loops[loop_start + 0].v = config.first_ring_verts_start + i;
loops[loop_start + 0].e = config.first_ring_edges_start + i;
loops[loop_start + 1].v = config.first_ring_verts_start + ((i + 1) % config.circle_segments);
loops[loop_start + 1].e = top_fan_edges_start + ((i + 1) % config.circle_segments);
loops[loop_start + 2].v = top_center_vert;
loops[loop_start + 2].e = top_fan_edges_start + i;
}
}
else if (config.fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) {
rings_poly_start = 1;
rings_loop_start = config.circle_segments;
/* Center n-gon in the fill. */
MPoly &poly = polys[poly_index++];
poly.loopstart = loop_index;
MPoly &poly = polys[0];
poly.loopstart = 0;
poly.totloop = config.circle_segments;
for (const int i : IndexRange(config.circle_segments)) {
MLoop &loop = loops[loop_index++];
loop.v = i;
loop.e = i;
loops[i].v = i;
loops[i].e = i;
}
}
/* Quads connect one edge ring to the next one. */
if (config.tot_quad_rings > 0) {
for (const int i : IndexRange(config.tot_quad_rings)) {
const int this_ring_vert_start = config.first_ring_verts_start +
(i * config.circle_segments);
const int next_ring_vert_start = this_ring_vert_start + config.circle_segments;
for (const int i : IndexRange(config.tot_quad_rings)) {
const int this_ring_poly_start = rings_poly_start + i * config.circle_segments;
const int this_ring_loop_start = rings_loop_start + i * config.circle_segments * 4;
const int this_ring_vert_start = config.first_ring_verts_start + (i * config.circle_segments);
const int next_ring_vert_start = this_ring_vert_start + config.circle_segments;
const int this_ring_edges_start = config.first_ring_edges_start +
(i * 2 * config.circle_segments);
const int next_ring_edges_start = this_ring_edges_start + (2 * config.circle_segments);
const int ring_connections_start = this_ring_edges_start + config.circle_segments;
const int this_ring_edges_start = config.first_ring_edges_start +
(i * 2 * config.circle_segments);
const int next_ring_edges_start = this_ring_edges_start + (2 * config.circle_segments);
const int ring_connections_start = this_ring_edges_start + config.circle_segments;
for (const int j : IndexRange(config.circle_segments)) {
MPoly &poly = polys[poly_index++];
poly.loopstart = loop_index;
poly.totloop = 4;
for (const int j : IndexRange(config.circle_segments)) {
const int loop_start = this_ring_loop_start + j * 4;
MPoly &poly = polys[this_ring_poly_start + j];
poly.loopstart = loop_start;
poly.totloop = 4;
MLoop &loop_a = loops[loop_index++];
loop_a.v = this_ring_vert_start + j;
loop_a.e = ring_connections_start + j;
MLoop &loop_b = loops[loop_index++];
loop_b.v = next_ring_vert_start + j;
loop_b.e = next_ring_edges_start + j;
MLoop &loop_c = loops[loop_index++];
loop_c.v = next_ring_vert_start + ((j + 1) % config.circle_segments);
loop_c.e = ring_connections_start + ((j + 1) % config.circle_segments);
MLoop &loop_d = loops[loop_index++];
loop_d.v = this_ring_vert_start + ((j + 1) % config.circle_segments);
loop_d.e = this_ring_edges_start + j;
}
loops[loop_start + 0].v = this_ring_vert_start + j;
loops[loop_start + 0].e = ring_connections_start + j;
loops[loop_start + 1].v = next_ring_vert_start + j;
loops[loop_start + 1].e = next_ring_edges_start + j;
loops[loop_start + 2].v = next_ring_vert_start + ((j + 1) % config.circle_segments);
loops[loop_start + 2].e = ring_connections_start + ((j + 1) % config.circle_segments);
loops[loop_start + 3].v = this_ring_vert_start + ((j + 1) % config.circle_segments);
loops[loop_start + 3].e = this_ring_edges_start + j;
}
}
const int bottom_poly_start = rings_poly_start + config.tot_quad_rings * config.circle_segments;
const int bottom_loop_start = rings_loop_start +
config.tot_quad_rings * config.circle_segments * 4;
if (config.bottom_has_center_vert) {
/* Bottom cone tip or center triangle fan in the fill. */
for (const int i : IndexRange(config.circle_segments)) {
MPoly &poly = polys[poly_index++];
poly.loopstart = loop_index;
const int loop_start = bottom_loop_start + i * 3;
MPoly &poly = polys[bottom_poly_start + i];
poly.loopstart = loop_start;
poly.totloop = 3;
MLoop &loop_a = loops[loop_index++];
loop_a.v = config.last_ring_verts_start + i;
loop_a.e = config.last_fan_edges_start + i;
MLoop &loop_b = loops[loop_index++];
loop_b.v = config.last_vert;
loop_b.e = config.last_fan_edges_start + (i + 1) % config.circle_segments;
MLoop &loop_c = loops[loop_index++];
loop_c.v = config.last_ring_verts_start + (i + 1) % config.circle_segments;
loop_c.e = config.last_ring_edges_start + i;
loops[loop_start + 0].v = config.last_ring_verts_start + i;
loops[loop_start + 0].e = config.last_fan_edges_start + i;
loops[loop_start + 1].v = config.last_vert;
loops[loop_start + 1].e = config.last_fan_edges_start + (i + 1) % config.circle_segments;
loops[loop_start + 2].v = config.last_ring_verts_start + (i + 1) % config.circle_segments;
loops[loop_start + 2].e = config.last_ring_edges_start + i;
}
}
else if (config.fill_type == GEO_NODE_MESH_CIRCLE_FILL_NGON) {
/* Center n-gon in the fill. */
MPoly &poly = polys[poly_index++];
poly.loopstart = loop_index;
MPoly &poly = polys[bottom_poly_start];
poly.loopstart = bottom_loop_start;
poly.totloop = config.circle_segments;
for (const int i : IndexRange(config.circle_segments)) {
/* Go backwards to reverse surface normal. */
MLoop &loop = loops[loop_index++];
loop.v = config.last_vert - i;
loop.e = config.last_edge - ((i + 1) % config.circle_segments);
loops[bottom_loop_start + i].v = config.last_vert - i;
loops[bottom_loop_start + i].e = config.last_edge - ((i + 1) % config.circle_segments);
}
}
}

View File

@ -185,71 +185,74 @@ BLI_NOINLINE static void calculate_sphere_corners(MutableSpan<int> corner_verts,
const int segments,
const int rings)
{
int loop_index = 0;
auto segment_next_or_first = [&](const int segment) {
return segment == segments - 1 ? 0 : segment + 1;
};
/* Add the triangles connected to the top vertex. */
const int first_vert_ring_index_start = 1;
const int first_vert_ring_start = 1;
for (const int segment : IndexRange(segments)) {
const int loop_start = segment * 3;
const int segment_next = segment_next_or_first(segment);
MLoop &loop_a = loops[loop_index++];
loop_a.v = 0;
loop_a.e = segment;
MLoop &loop_b = loops[loop_index++];
loop_b.v = first_vert_ring_index_start + segment;
loop_b.e = segments + segment;
MLoop &loop_c = loops[loop_index++];
loop_c.v = first_vert_ring_index_start + segment_next;
loop_c.e = segment_next;
loops[loop_start + 0].v = 0;
loops[loop_start + 0].e = segment;
loops[loop_start + 1].v = first_vert_ring_start + segment;
loops[loop_start + 1].e = segments + segment;
loops[loop_start + 2].v = first_vert_ring_start + segment_next;
loops[loop_start + 2].e = segment_next;
}
int ring_vert_index_start = 1;
int ring_edge_index_start = segments;
for ([[maybe_unused]] const int ring : IndexRange(1, rings - 2)) {
const int next_ring_vert_index_start = ring_vert_index_start + segments;
const int next_ring_edge_index_start = ring_edge_index_start + segments * 2;
const int ring_vertical_edge_index_start = ring_edge_index_start + segments;
const int rings_vert_start = 1;
const int rings_edge_start = segments;
const int rings_loop_start = segments * 3;
for (const int ring : IndexRange(1, rings - 2)) {
const int ring_vert_start = rings_vert_start + (ring - 1) * segments;
const int ring_edge_start = rings_edge_start + (ring - 1) * segments * 2;
const int ring_loop_start = rings_loop_start + (ring - 1) * segments * 4;
const int next_ring_vert_start = ring_vert_start + segments;
const int next_ring_edge_start = ring_edge_start + segments * 2;
const int ring_vertical_edge_start = ring_edge_start + segments;
for (const int segment : IndexRange(segments)) {
const int loop_start = ring_loop_start + segment * 4;
const int segment_next = segment_next_or_first(segment);
MLoop &loop_a = loops[loop_index++];
loop_a.v = ring_vert_index_start + segment;
loop_a.e = ring_vertical_edge_index_start + segment;
MLoop &loop_b = loops[loop_index++];
loop_b.v = next_ring_vert_index_start + segment;
loop_b.e = next_ring_edge_index_start + segment;
MLoop &loop_c = loops[loop_index++];
loop_c.v = next_ring_vert_index_start + segment_next;
loop_c.e = ring_vertical_edge_index_start + segment_next;
MLoop &loop_d = loops[loop_index++];
loop_d.v = ring_vert_index_start + segment_next;
loop_d.e = ring_edge_index_start + segment;
loops[loop_start + 0].v = ring_vert_start + segment;
loops[loop_start + 0].e = ring_vertical_edge_start + segment;
loops[loop_start + 1].v = next_ring_vert_start + segment;
loops[loop_start + 1].e = next_ring_edge_start + segment;
loops[loop_start + 2].v = next_ring_vert_start + segment_next;
loops[loop_start + 2].e = ring_vertical_edge_start + segment_next;
loops[loop_start + 3].v = ring_vert_start + segment_next;
loops[loop_start + 3].e = ring_edge_start + segment;
}
ring_vert_index_start += segments;
ring_edge_index_start += segments * 2;
}
/* Add the triangles connected to the bottom vertex. */
const int bottom_loop_start = rings_loop_start + segments * (rings - 2) * 4;
const int last_edge_ring_start = segments * (rings - 2) * 2 + segments;
const int bottom_edge_fan_start = last_edge_ring_start + segments;
const int last_vert_index = sphere_vert_total(segments, rings) - 1;
const int last_vert_ring_start = last_vert_index - segments;
for (const int segment : IndexRange(segments)) {
const int loop_start = bottom_loop_start + segment * 3;
const int segment_next = segment_next_or_first(segment);
MLoop &loop_a = loops[loop_index++];
loop_a.v = last_vert_index;
loop_a.e = bottom_edge_fan_start + segment_next;
MLoop &loop_b = loops[loop_index++];
loop_b.v = last_vert_ring_start + segment_next;
loop_b.e = last_edge_ring_start + segment;
MLoop &loop_c = loops[loop_index++];
loop_c.v = last_vert_ring_start + segment;
loop_c.e = bottom_edge_fan_start + segment;
loops[loop_start + 0].v = last_vert_index;
loops[loop_start + 0].e = bottom_edge_fan_start + segment_next;
loops[loop_start + 1].v = last_vert_ring_start + segment_next;
loops[loop_start + 1].e = last_edge_ring_start + segment;
loops[loop_start + 2].v = last_vert_ring_start + segment;
loops[loop_start + 2].e = bottom_edge_fan_start + segment;
}
}
@ -261,34 +264,39 @@ BLI_NOINLINE static void calculate_sphere_uvs(Mesh *mesh, const float segments,
"uv_map", ATTR_DOMAIN_CORNER);
MutableSpan<float2> uvs = uv_attribute.span;
int loop_index = 0;
const float dy = 1.0f / rings;
const float segments_inv = 1.0f / segments;
for (const int i_segment : IndexRange(segments)) {
const int loop_start = i_segment * 3;
const float segment = float(i_segment);
uvs[loop_index++] = float2((segment + 0.5f) * segments_inv, 0.0f);
uvs[loop_index++] = float2(segment * segments_inv, dy);
uvs[loop_index++] = float2((segment + 1.0f) * segments_inv, dy);
uvs[loop_start + 0] = float2((segment + 0.5f) * segments_inv, 0.0f);
uvs[loop_start + 1] = float2(segment * segments_inv, dy);
uvs[loop_start + 2] = float2((segment + 1.0f) * segments_inv, dy);
}
const int rings_loop_start = segments * 3;
for (const int i_ring : IndexRange(1, rings - 2)) {
const int ring_loop_start = rings_loop_start + (i_ring - 1) * segments * 4;
const float ring = float(i_ring);
for (const int i_segment : IndexRange(segments)) {
const int loop_start = ring_loop_start + i_segment * 4;
const float segment = float(i_segment);
uvs[loop_index++] = float2(segment * segments_inv, ring / rings);
uvs[loop_index++] = float2(segment * segments_inv, (ring + 1.0f) / rings);
uvs[loop_index++] = float2((segment + 1.0f) * segments_inv, (ring + 1.0f) / rings);
uvs[loop_index++] = float2((segment + 1.0f) * segments_inv, ring / rings);
uvs[loop_start + 0] = float2(segment * segments_inv, ring / rings);
uvs[loop_start + 1] = float2(segment * segments_inv, (ring + 1.0f) / rings);
uvs[loop_start + 2] = float2((segment + 1.0f) * segments_inv, (ring + 1.0f) / rings);
uvs[loop_start + 3] = float2((segment + 1.0f) * segments_inv, ring / rings);
}
}
const int bottom_loop_start = rings_loop_start + segments * (rings - 2) * 4;
for (const int i_segment : IndexRange(segments)) {
const int loop_start = bottom_loop_start + i_segment * 3;
const float segment = float(i_segment);
uvs[loop_index++] = float2((segment + 0.5f) * segments_inv, 1.0f);
uvs[loop_index++] = float2((segment + 1.0f) * segments_inv, 1.0f - dy);
uvs[loop_index++] = float2(segment * segments_inv, 1.0f - dy);
uvs[loop_start + 0] = float2((segment + 0.5f) * segments_inv, 1.0f);
uvs[loop_start + 1] = float2((segment + 1.0f) * segments_inv, 1.0f - dy);
uvs[loop_start + 2] = float2(segment * segments_inv, 1.0f - dy);
}
uv_attribute.finish();
@ -322,6 +330,8 @@ static Mesh *create_uv_sphere_mesh(const float radius, const int segments, const
mesh->loose_edges_tag_none();
BLI_assert(BKE_mesh_is_valid(mesh));
return mesh;
}

View File

@ -115,8 +115,8 @@ static const struct PyC_StringEnumItems pygpu_imagetype_items[] = {
{int(ImageType::FLOAT_1D), "FLOAT_1D"},
{int(ImageType::FLOAT_1D_ARRAY), "FLOAT_1D_ARRAY"},
{int(ImageType::FLOAT_2D), "FLOAT_2D"},
{int(ImageType::FLOAT_2D_ARRAY), "FLOAT"},
{int(ImageType::FLOAT_3D), "FLOAT_2D_ARRAY"},
{int(ImageType::FLOAT_2D_ARRAY), "FLOAT_2D_ARRAY"},
{int(ImageType::FLOAT_3D), "FLOAT_3D"},
{int(ImageType::FLOAT_CUBE), "FLOAT_CUBE"},
{int(ImageType::FLOAT_CUBE_ARRAY), "FLOAT_CUBE_ARRAY"},
{int(ImageType::INT_BUFFER), "INT_BUFFER"},

View File

@ -279,25 +279,25 @@ enum {
NDOF_BUTTON_DOMINANT = 0x01a3, /* 419 */
NDOF_BUTTON_PLUS = 0x01a4, /* 420 */
NDOF_BUTTON_MINUS = 0x01a5, /* 421 */
/* General-purpose buttons. */
NDOF_BUTTON_1 = 0x01a6, /* 422 */
NDOF_BUTTON_2 = 0x01a7, /* 423 */
NDOF_BUTTON_3 = 0x01a8, /* 424 */
NDOF_BUTTON_4 = 0x01a9, /* 425 */
NDOF_BUTTON_5 = 0x01aa, /* 426 */
NDOF_BUTTON_6 = 0x01ab, /* 427 */
NDOF_BUTTON_7 = 0x01ac, /* 428 */
NDOF_BUTTON_8 = 0x01ad, /* 429 */
NDOF_BUTTON_9 = 0x01ae, /* 430 */
NDOF_BUTTON_10 = 0x01af, /* 431 */
/* more general-purpose buttons */
NDOF_BUTTON_A = 0x01b0, /* 432 */
NDOF_BUTTON_B = 0x01b1, /* 433 */
NDOF_BUTTON_C = 0x01b2, /* 434 */
/* Store/restore views. */
NDOF_BUTTON_V1 = 0x01b3, /* 435 */
NDOF_BUTTON_V2 = 0x01b4, /* 436 */
NDOF_BUTTON_V3 = 0x01b5, /* 437 */
NDOF_BUTTON_V1 = 0x01a6, /* 422 */
NDOF_BUTTON_V2 = 0x01a7, /* 423 */
NDOF_BUTTON_V3 = 0x01a8, /* 424 */
/* General-purpose buttons. */
NDOF_BUTTON_1 = 0x01aa, /* 426 */
NDOF_BUTTON_2 = 0x01ab, /* 427 */
NDOF_BUTTON_3 = 0x01ac, /* 428 */
NDOF_BUTTON_4 = 0x01ad, /* 429 */
NDOF_BUTTON_5 = 0x01ae, /* 430 */
NDOF_BUTTON_6 = 0x01af, /* 431 */
NDOF_BUTTON_7 = 0x01b0, /* 432 */
NDOF_BUTTON_8 = 0x01b1, /* 433 */
NDOF_BUTTON_9 = 0x01b2, /* 434 */
NDOF_BUTTON_10 = 0x01b3, /* 435 */
/* more general-purpose buttons */
NDOF_BUTTON_A = 0x01b4, /* 436 */
NDOF_BUTTON_B = 0x01b5, /* 437 */
NDOF_BUTTON_C = 0x01b6, /* 438 */
/* Disabled as GHOST converts these to keyboard events
* which use regular keyboard event handling logic. */
@ -313,8 +313,8 @@ enum {
NDOF_BUTTON_CTRL = 0x01bd, /* 445 */
#endif
#define _NDOF_MAX NDOF_BUTTON_V3
#define _NDOF_BUTTON_MAX NDOF_BUTTON_V3
#define _NDOF_MAX NDOF_BUTTON_C
#define _NDOF_BUTTON_MAX NDOF_BUTTON_C
/* ********** End of Input devices. ********** */