TexFace removal part 3
- MTexPoly structure & layer type. - The 'Mesh.uv_textures' layers. - DerivedMesh TexFace drawing. - Scripts & UI.
This commit is contained in:
parent
c7c6070a64
commit
bdbf4471a6
Notes:
blender-bot
2023-02-14 07:00:24 +01:00
Referenced by commit f4fe3f1975
, RNA: Cleanup - remove no longer needed get/set functions
Referenced by issue #51382, Proposal for removing TexFace in 2.8x
|
@ -418,7 +418,7 @@ static void attr_create_uv_map(Scene *scene,
|
|||
int i = 0;
|
||||
|
||||
for(b_mesh.uv_layers.begin(l); l != b_mesh.uv_layers.end(); ++l, ++i) {
|
||||
bool active_render = b_mesh.uv_textures[i].active_render();
|
||||
bool active_render = b_mesh.uv_layers[i].active_render();
|
||||
AttributeStandard std = (active_render)? ATTR_STD_UV: ATTR_STD_NONE;
|
||||
ustring name = ustring(l->name().c_str());
|
||||
|
||||
|
|
|
@ -10,7 +10,6 @@ op.include_armatures = False
|
|||
op.include_shapekeys = False
|
||||
op.deform_bones_only = False
|
||||
op.active_uv_only = True
|
||||
op.include_uv_textures = True
|
||||
op.use_texture_copies = True
|
||||
op.triangulate = True
|
||||
op.use_object_instantiation = False
|
||||
|
|
|
@ -79,7 +79,7 @@ def add_torus(major_rad, minor_rad, major_seg, minor_seg):
|
|||
def add_uvs(mesh, minor_seg, major_seg):
|
||||
from math import fmod
|
||||
|
||||
mesh.uv_textures.new()
|
||||
mesh.uv_layers.new()
|
||||
uv_data = mesh.uv_layers.active.data
|
||||
polygons = mesh.polygons
|
||||
u_step = 1.0 / major_seg
|
||||
|
@ -286,4 +286,4 @@ class AddTorus(Operator, object_utils.AddObjectHelper):
|
|||
|
||||
classes = (
|
||||
AddTorus,
|
||||
)
|
||||
)
|
||||
|
|
|
@ -50,7 +50,7 @@ class MeshMirrorUV(Operator):
|
|||
@classmethod
|
||||
def poll(cls, context):
|
||||
obj = context.active_object
|
||||
return (obj and obj.type == 'MESH' and obj.data.uv_textures.active)
|
||||
return (obj and obj.type == 'MESH' and obj.data.uv_layers.active)
|
||||
|
||||
def execute(self, context):
|
||||
DIR = (self.direction == 'NEGATIVE')
|
||||
|
|
|
@ -515,7 +515,7 @@ class JoinUVs(Operator):
|
|||
if is_editmode:
|
||||
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
|
||||
|
||||
if not mesh.uv_textures:
|
||||
if not mesh.uv_layers:
|
||||
self.report({'WARNING'},
|
||||
"Object: %s, Mesh: '%s' has no UVs"
|
||||
% (obj.name, mesh.name))
|
||||
|
@ -553,7 +553,7 @@ class JoinUVs(Operator):
|
|||
else:
|
||||
uv_other = mesh_other.uv_layers.active
|
||||
if not uv_other:
|
||||
mesh_other.uv_textures.new()
|
||||
mesh_other.uv_layers.new()
|
||||
uv_other = mesh_other.uv_layers.active
|
||||
if not uv_other:
|
||||
self.report({'ERROR'}, "Could not add "
|
||||
|
|
|
@ -222,7 +222,7 @@ class QuickExplode(Operator):
|
|||
|
||||
if self.fade:
|
||||
explode.show_dead = False
|
||||
uv = obj.data.uv_textures.new("Explode fade")
|
||||
uv = obj.data.uv_layers.new("Explode fade")
|
||||
explode.particle_uv = uv.name
|
||||
|
||||
mat = object_ensure_material(obj, "Explode Fade")
|
||||
|
|
|
@ -30,8 +30,8 @@ def extend(obj, operator, EXTEND_MODE):
|
|||
import bmesh
|
||||
me = obj.data
|
||||
# script will fail without UVs
|
||||
if not me.uv_textures:
|
||||
me.uv_textures.new()
|
||||
if not me.uv_layers:
|
||||
me.uv_layers.new()
|
||||
|
||||
bm = bmesh.from_edit_mesh(me)
|
||||
|
||||
|
@ -252,4 +252,4 @@ class FollowActiveQuads(Operator):
|
|||
|
||||
classes = (
|
||||
FollowActiveQuads,
|
||||
)
|
||||
)
|
||||
|
|
|
@ -275,12 +275,12 @@ def lightmap_uvpack(meshes,
|
|||
face_groups.append(faces)
|
||||
|
||||
if PREF_NEW_UVLAYER:
|
||||
me.uv_textures.new()
|
||||
me.uv_layers.new()
|
||||
|
||||
# Add face UV if it does not exist.
|
||||
# All new faces are selected.
|
||||
if not me.uv_textures:
|
||||
me.uv_textures.new()
|
||||
if not me.uv_layers:
|
||||
me.uv_layers.new()
|
||||
|
||||
for face_sel in face_groups:
|
||||
print("\nStarting unwrap")
|
||||
|
@ -538,6 +538,9 @@ def lightmap_uvpack(meshes,
|
|||
print("done")
|
||||
|
||||
if PREF_APPLY_IMAGE:
|
||||
pass
|
||||
# removed with texface
|
||||
'''
|
||||
if not PREF_PACK_IN_ONE:
|
||||
image = bpy.data.images.new(name="lightmap",
|
||||
width=PREF_IMG_PX_SIZE,
|
||||
|
@ -545,8 +548,8 @@ def lightmap_uvpack(meshes,
|
|||
)
|
||||
|
||||
for f in face_sel:
|
||||
# f.image = image
|
||||
f.id_data.uv_textures.active.data[f.index].image = image # XXX25
|
||||
f.image = image
|
||||
'''
|
||||
|
||||
for me in meshes:
|
||||
me.update()
|
||||
|
@ -672,4 +675,4 @@ class LightMapPack(Operator):
|
|||
|
||||
classes = (
|
||||
LightMapPack,
|
||||
)
|
||||
)
|
||||
|
|
|
@ -810,8 +810,8 @@ def main(context,
|
|||
# Tag as used
|
||||
me.tag = True
|
||||
|
||||
if not me.uv_textures: # Mesh has no UV Coords, don't bother.
|
||||
me.uv_textures.new()
|
||||
if not me.uv_layers: # Mesh has no UV Coords, don't bother.
|
||||
me.uv_layers.new()
|
||||
|
||||
uv_layer = me.uv_layers.active.data
|
||||
me_verts = list(me.vertices)
|
||||
|
|
|
@ -332,7 +332,7 @@ class DATA_PT_uv_texture(MeshButtonsPanel, Panel):
|
|||
row = layout.row()
|
||||
col = row.column()
|
||||
|
||||
col.template_list("MESH_UL_uvmaps_vcols", "uvmaps", me, "uv_textures", me.uv_textures, "active_index", rows=1)
|
||||
col.template_list("MESH_UL_uvmaps_vcols", "uvmaps", me, "uv_layers", me.uv_layers, "active_index", rows=1)
|
||||
|
||||
col = row.column(align=True)
|
||||
col.operator("mesh.uv_texture_add", icon='ZOOMIN', text="")
|
||||
|
|
|
@ -355,7 +355,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
|||
col.prop(md, "texture_coords_object", text="")
|
||||
elif md.texture_coords == 'UV' and ob.type == 'MESH':
|
||||
col.label(text="UV Map:")
|
||||
col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
|
||||
col.prop_search(md, "uv_layer", ob.data, "uv_layers", text="")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
@ -387,7 +387,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
|||
sub.active = bool(md.vertex_group)
|
||||
sub.prop(md, "protect")
|
||||
col.label(text="Particle UV")
|
||||
col.prop_search(md, "particle_uv", ob.data, "uv_textures", text="")
|
||||
col.prop_search(md, "particle_uv", ob.data, "uv_layers", text="")
|
||||
|
||||
col = split.column()
|
||||
col.prop(md, "use_edge_cut")
|
||||
|
@ -985,7 +985,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
|||
|
||||
col = split.column()
|
||||
col.label(text="UV Map:")
|
||||
col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
|
||||
col.prop_search(md, "uv_layer", ob.data, "uv_layers", text="")
|
||||
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
|
@ -1042,7 +1042,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
|||
if md.texture_coords == 'OBJECT':
|
||||
layout.prop(md, "texture_coords_object", text="Object")
|
||||
elif md.texture_coords == 'UV' and ob.type == 'MESH':
|
||||
layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
|
||||
layout.prop_search(md, "uv_layer", ob.data, "uv_layers")
|
||||
|
||||
def WAVE(self, layout, ob, md):
|
||||
split = layout.split()
|
||||
|
@ -1088,7 +1088,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
|||
col.template_ID(md, "texture", new="texture.new")
|
||||
layout.prop(md, "texture_coords")
|
||||
if md.texture_coords == 'UV' and ob.type == 'MESH':
|
||||
layout.prop_search(md, "uv_layer", ob.data, "uv_textures")
|
||||
layout.prop_search(md, "uv_layer", ob.data, "uv_layers")
|
||||
elif md.texture_coords == 'OBJECT':
|
||||
layout.prop(md, "texture_coords_object")
|
||||
|
||||
|
@ -1155,7 +1155,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
|||
if md.mask_tex_mapping == 'OBJECT':
|
||||
layout.prop(md, "mask_tex_map_object", text="Object")
|
||||
elif md.mask_tex_mapping == 'UV' and ob.type == 'MESH':
|
||||
layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures")
|
||||
layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_layers")
|
||||
|
||||
def VERTEX_WEIGHT_EDIT(self, layout, ob, md):
|
||||
split = layout.split()
|
||||
|
@ -1324,7 +1324,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
|||
|
||||
col = split.column()
|
||||
col.label(text="UV Map:")
|
||||
col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
|
||||
col.prop_search(md, "uv_layer", ob.data, "uv_layers", text="")
|
||||
|
||||
def WIREFRAME(self, layout, ob, md):
|
||||
has_vgroup = bool(md.vertex_group)
|
||||
|
|
|
@ -745,7 +745,7 @@ class MATERIAL_PT_strand(MaterialButtonsPanel, Panel):
|
|||
col.prop(tan, "width_fade")
|
||||
ob = context.object
|
||||
if ob and ob.type == 'MESH':
|
||||
col.prop_search(tan, "uv_layer", ob.data, "uv_textures", text="")
|
||||
col.prop_search(tan, "uv_layer", ob.data, "uv_layers", text="")
|
||||
else:
|
||||
col.prop(tan, "uv_layer", text="")
|
||||
col.separator()
|
||||
|
|
|
@ -96,8 +96,8 @@ class VIEW3D_MT_tools_projectpaint_clone(Menu):
|
|||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
for i, tex in enumerate(context.active_object.data.uv_textures):
|
||||
props = layout.operator("wm.context_set_int", text=tex.name, translate=False)
|
||||
for i, uv_layer in enumerate(context.active_object.data.uv_layers):
|
||||
props = layout.operator("wm.context_set_int", text=uv_layer.name, translate=False)
|
||||
props.data_path = "active_object.data.uv_texture_clone_index"
|
||||
props.value = i
|
||||
|
||||
|
|
|
@ -1058,8 +1058,8 @@ class PARTICLE_PT_render(ParticleButtonsPanel, Panel):
|
|||
|
||||
if psys:
|
||||
col = layout.column()
|
||||
col.prop_search(psys, "billboard_normal_uv", ob.data, "uv_textures")
|
||||
col.prop_search(psys, "billboard_time_index_uv", ob.data, "uv_textures")
|
||||
col.prop_search(psys, "billboard_normal_uv", ob.data, "uv_layers")
|
||||
col.prop_search(psys, "billboard_time_index_uv", ob.data, "uv_layers")
|
||||
|
||||
split = layout.split(percentage=0.33)
|
||||
split.label(text="Split UVs:")
|
||||
|
@ -1068,7 +1068,7 @@ class PARTICLE_PT_render(ParticleButtonsPanel, Panel):
|
|||
if psys:
|
||||
col = layout.column()
|
||||
col.active = part.billboard_uv_split > 1
|
||||
col.prop_search(psys, "billboard_split_uv", ob.data, "uv_textures")
|
||||
col.prop_search(psys, "billboard_split_uv", ob.data, "uv_layers")
|
||||
|
||||
row = col.row()
|
||||
row.label(text="Animate:")
|
||||
|
|
|
@ -276,7 +276,7 @@ class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, Panel):
|
|||
# image format outputs
|
||||
if surface.surface_format == 'IMAGE':
|
||||
layout.operator("dpaint.bake", text="Bake Image Sequence", icon='MOD_DYNAMICPAINT')
|
||||
layout.prop_search(surface, "uv_layer", ob.data, "uv_textures", text="UV Map")
|
||||
layout.prop_search(surface, "uv_layer", ob.data, "uv_layers", text="UV Map")
|
||||
layout.separator()
|
||||
|
||||
layout.prop(surface, "image_output_path", text="")
|
||||
|
@ -337,7 +337,7 @@ class PHYSICS_PT_dp_canvas_initial_color(PhysicButtonsPanel, Panel):
|
|||
|
||||
elif surface.init_color_type == 'TEXTURE':
|
||||
layout.prop(surface, "init_texture")
|
||||
layout.prop_search(surface, "init_layername", ob.data, "uv_textures", text="UV Map")
|
||||
layout.prop_search(surface, "init_layername", ob.data, "uv_layers", text="UV Map")
|
||||
|
||||
elif surface.init_color_type == 'VERTEX_COLOR':
|
||||
layout.prop_search(surface, "init_layername", ob.data, "vertex_colors", text="Color Layer")
|
||||
|
|
|
@ -158,7 +158,7 @@ class PHYSICS_PT_smoke_flow_advanced(PhysicButtonsPanel, Panel):
|
|||
sub.label(text="Mapping:")
|
||||
sub.prop(flow, "texture_map_type", expand=False, text="")
|
||||
if flow.texture_map_type == 'UV':
|
||||
sub.prop_search(flow, "uv_layer", ob.data, "uv_textures", text="")
|
||||
sub.prop_search(flow, "uv_layer", ob.data, "uv_layers", text="")
|
||||
if flow.texture_map_type == 'AUTO':
|
||||
sub.prop(flow, "texture_size")
|
||||
sub.prop(flow, "texture_offset")
|
||||
|
|
|
@ -963,7 +963,7 @@ class TEXTURE_PT_mapping(TextureSlotPanel, Panel):
|
|||
split.label(text="Map:")
|
||||
ob = context.object
|
||||
if ob and ob.type == 'MESH':
|
||||
split.prop_search(tex, "uv_layer", ob.data, "uv_textures", text="")
|
||||
split.prop_search(tex, "uv_layer", ob.data, "uv_layers", text="")
|
||||
else:
|
||||
split.prop(tex, "uv_layer", text="")
|
||||
|
||||
|
|
|
@ -481,7 +481,7 @@ class IMAGE_HT_header(Header):
|
|||
row.prop(toolsettings, "snap_target", text="")
|
||||
|
||||
mesh = context.edit_object.data
|
||||
layout.prop_search(mesh.uv_textures, "active", mesh, "uv_textures", text="")
|
||||
layout.prop_search(mesh.uv_layers, "active", mesh, "uv_layers", text="")
|
||||
|
||||
if ima:
|
||||
if ima.is_stereo_3d:
|
||||
|
|
|
@ -1174,9 +1174,9 @@ class VIEW3D_MT_tools_projectpaint_uvlayer(Menu):
|
|||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
for i, tex in enumerate(context.active_object.data.uv_textures):
|
||||
props = layout.operator("wm.context_set_int", text=tex.name, translate=False)
|
||||
props.data_path = "active_object.data.uv_textures.active_index"
|
||||
for i, uv_layer in enumerate(context.active_object.data.uv_layers):
|
||||
props = layout.operator("wm.context_set_int", text=uv_layer.name, translate=False)
|
||||
props.data_path = "active_object.data.uv_layers.active_index"
|
||||
props.value = i
|
||||
|
||||
|
||||
|
@ -1234,11 +1234,11 @@ class VIEW3D_PT_slots_projectpaint(View3DPanel, Panel):
|
|||
|
||||
if slot and slot.index != -1:
|
||||
col.label("UV Map")
|
||||
col.prop_search(slot, "uv_layer", ob.data, "uv_textures", text="")
|
||||
col.prop_search(slot, "uv_layer", ob.data, "uv_layers", text="")
|
||||
|
||||
elif settings.mode == 'IMAGE':
|
||||
mesh = ob.data
|
||||
uv_text = mesh.uv_textures.active.name if mesh.uv_textures.active else ""
|
||||
uv_text = mesh.uv_layers.active.name if mesh.uv_layers.active else ""
|
||||
col.label("Canvas Image")
|
||||
col.template_ID(settings, "canvas")
|
||||
col.operator("image.new", text="New").gen_context = 'PAINT_CANVAS'
|
||||
|
@ -1876,8 +1876,8 @@ class VIEW3D_MT_tools_projectpaint_stencil(Menu):
|
|||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
for i, tex in enumerate(context.active_object.data.uv_textures):
|
||||
props = layout.operator("wm.context_set_int", text=tex.name, translate=False)
|
||||
for i, uv_layer in enumerate(context.active_object.data.uv_layers):
|
||||
props = layout.operator("wm.context_set_int", text=uv_layer.name, translate=False)
|
||||
props.data_path = "active_object.data.uv_texture_stencil_index"
|
||||
props.value = i
|
||||
|
||||
|
|
|
@ -917,12 +917,6 @@ static void *add_customdata_cb(void *user_data, const char *name, int data_type)
|
|||
numloops = dm->getNumLoops(dm);
|
||||
cd_ptr = CustomData_add_layer_named(loopdata, cd_data_type, CD_DEFAULT,
|
||||
NULL, numloops, name);
|
||||
if (cd_data_type == CD_MLOOPUV) {
|
||||
CustomData_add_layer_named(dm->getPolyDataLayout(dm),
|
||||
CD_MTEXPOLY, CD_DEFAULT,
|
||||
NULL, numloops, name);
|
||||
}
|
||||
|
||||
return cd_ptr;
|
||||
}
|
||||
|
||||
|
|
|
@ -376,15 +376,14 @@ void CustomData_validate_layer_name(const struct CustomData *data, int type, con
|
|||
bool CustomData_verify_versions(struct CustomData *data, int index);
|
||||
|
||||
/*BMesh specific customdata stuff*/
|
||||
void CustomData_to_bmeshpoly(struct CustomData *fdata, struct CustomData *pdata,
|
||||
struct CustomData *ldata, int totloop, int totpoly);
|
||||
void CustomData_from_bmeshpoly(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata, int total);
|
||||
void CustomData_bmesh_update_active_layers(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata);
|
||||
void CustomData_bmesh_do_versions_update_active_layers(struct CustomData *fdata, struct CustomData *pdata, struct CustomData *ldata);
|
||||
void CustomData_to_bmeshpoly(struct CustomData *fdata, struct CustomData *ldata, int totloop);
|
||||
void CustomData_from_bmeshpoly(struct CustomData *fdata, struct CustomData *ldata, int total);
|
||||
void CustomData_bmesh_update_active_layers(struct CustomData *fdata, struct CustomData *ldata);
|
||||
void CustomData_bmesh_do_versions_update_active_layers(struct CustomData *fdata, struct CustomData *ldata);
|
||||
void CustomData_bmesh_init_pool(struct CustomData *data, int totelem, const char htype);
|
||||
|
||||
#ifndef NDEBUG
|
||||
bool CustomData_from_bmeshpoly_test(CustomData *fdata, CustomData *pdata, CustomData *ldata, bool fallback);
|
||||
bool CustomData_from_bmeshpoly_test(CustomData *fdata, CustomData *ldata, bool fallback);
|
||||
#endif
|
||||
|
||||
/* External file storage */
|
||||
|
|
|
@ -88,7 +88,6 @@ BMEditMesh *BKE_editmesh_copy(BMEditMesh *em);
|
|||
BMEditMesh *BKE_editmesh_from_object(struct Object *ob);
|
||||
void BKE_editmesh_free_derivedmesh(BMEditMesh *em);
|
||||
void BKE_editmesh_free(BMEditMesh *em);
|
||||
void BKE_editmesh_update_linked_customdata(BMEditMesh *em);
|
||||
|
||||
void BKE_editmesh_color_free(BMEditMesh *em);
|
||||
void BKE_editmesh_color_ensure(BMEditMesh *em, const char htype);
|
||||
|
|
|
@ -287,7 +287,7 @@ void BKE_mesh_loops_to_mface_corners(
|
|||
const int numTex, const int numCol,
|
||||
const bool hasPCol, const bool hasOrigSpace, const bool hasLNor);
|
||||
void BKE_mesh_loops_to_tessdata(
|
||||
struct CustomData *fdata, struct CustomData *ldata, struct CustomData *pdata, struct MFace *mface,
|
||||
struct CustomData *fdata, struct CustomData *ldata, struct MFace *mface,
|
||||
int *polyindices, unsigned int (*loopindices)[4], const int num_faces);
|
||||
void BKE_mesh_tangent_loops_to_tessdata(
|
||||
struct CustomData *fdata, struct CustomData *ldata, struct MFace *mface,
|
||||
|
@ -365,7 +365,6 @@ void BKE_mesh_calc_relative_deform(
|
|||
/* *** mesh_validate.c *** */
|
||||
|
||||
int BKE_mesh_validate(struct Mesh *me, const int do_verbose, const int cddata_check_mask);
|
||||
void BKE_mesh_cd_validate(struct Mesh *me);
|
||||
int BKE_mesh_validate_material_indices(struct Mesh *me);
|
||||
|
||||
bool BKE_mesh_validate_arrays(
|
||||
|
|
|
@ -533,7 +533,6 @@ void DM_update_tessface_data(DerivedMesh *dm)
|
|||
MLoop *ml = dm->getLoopArray(dm);
|
||||
|
||||
CustomData *fdata = dm->getTessFaceDataLayout(dm);
|
||||
CustomData *pdata = dm->getPolyDataLayout(dm);
|
||||
CustomData *ldata = dm->getLoopDataLayout(dm);
|
||||
|
||||
const int totface = dm->getNumTessFaces(dm);
|
||||
|
@ -546,7 +545,7 @@ void DM_update_tessface_data(DerivedMesh *dm)
|
|||
if (!polyindex)
|
||||
return;
|
||||
|
||||
CustomData_from_bmeshpoly(fdata, pdata, ldata, totface);
|
||||
CustomData_from_bmeshpoly(fdata, ldata, totface);
|
||||
|
||||
if (CustomData_has_layer(fdata, CD_MTFACE) ||
|
||||
CustomData_has_layer(fdata, CD_MCOL) ||
|
||||
|
@ -578,7 +577,7 @@ void DM_update_tessface_data(DerivedMesh *dm)
|
|||
* 0 for quads (because our quads may have been rotated compared to their org poly, see tessellation code).
|
||||
* So we pass the MFace's, and BKE_mesh_loops_to_tessdata will use MFace->v4 index as quad test.
|
||||
*/
|
||||
BKE_mesh_loops_to_tessdata(fdata, ldata, pdata, mface, polyindex, loopindex, totface);
|
||||
BKE_mesh_loops_to_tessdata(fdata, ldata, mface, polyindex, loopindex, totface);
|
||||
|
||||
MEM_freeN(loopindex);
|
||||
}
|
||||
|
@ -596,7 +595,6 @@ void DM_generate_tangent_tessface_data(DerivedMesh *dm, bool generate)
|
|||
MLoop *ml = dm->getLoopArray(dm);
|
||||
|
||||
CustomData *fdata = dm->getTessFaceDataLayout(dm);
|
||||
CustomData *pdata = dm->getPolyDataLayout(dm);
|
||||
CustomData *ldata = dm->getLoopDataLayout(dm);
|
||||
|
||||
const int totface = dm->getNumTessFaces(dm);
|
||||
|
@ -613,7 +611,7 @@ void DM_generate_tangent_tessface_data(DerivedMesh *dm, bool generate)
|
|||
for (int j = 0; j < ldata->totlayer; j++) {
|
||||
if (ldata->layers[j].type == CD_TANGENT) {
|
||||
CustomData_add_layer_named(fdata, CD_TANGENT, CD_CALLOC, NULL, totface, ldata->layers[j].name);
|
||||
CustomData_bmesh_update_active_layers(fdata, pdata, ldata);
|
||||
CustomData_bmesh_update_active_layers(fdata, ldata);
|
||||
|
||||
if (!loopindex) {
|
||||
loopindex = MEM_mallocN(sizeof(*loopindex) * totface, __func__);
|
||||
|
@ -643,7 +641,7 @@ void DM_generate_tangent_tessface_data(DerivedMesh *dm, bool generate)
|
|||
}
|
||||
if (loopindex)
|
||||
MEM_freeN(loopindex);
|
||||
BLI_assert(CustomData_from_bmeshpoly_test(fdata, pdata, ldata, true));
|
||||
BLI_assert(CustomData_from_bmeshpoly_test(fdata, ldata, true));
|
||||
}
|
||||
|
||||
if (G.debug & G_DEBUG)
|
||||
|
|
|
@ -1784,7 +1784,7 @@ void CDDM_recalc_tessellation_ex(DerivedMesh *dm, const bool do_face_nor_cpy)
|
|||
|
||||
/* Tessellation recreated faceData, and the active layer indices need to get re-propagated
|
||||
* from loops and polys to faces */
|
||||
CustomData_bmesh_update_active_layers(&dm->faceData, &dm->polyData, &dm->loopData);
|
||||
CustomData_bmesh_update_active_layers(&dm->faceData, &dm->loopData);
|
||||
}
|
||||
|
||||
void CDDM_recalc_tessellation(DerivedMesh *dm)
|
||||
|
@ -2031,7 +2031,6 @@ DerivedMesh *CDDM_from_curve_displist(Object *ob, ListBase *dispbase)
|
|||
|
||||
if (alluv) {
|
||||
const char *uvname = "Orco";
|
||||
CustomData_add_layer_named(&cddm->dm.polyData, CD_MTEXPOLY, CD_DEFAULT, NULL, totpoly, uvname);
|
||||
CustomData_add_layer_named(&cddm->dm.loopData, CD_MLOOPUV, CD_ASSIGN, alluv, totloop, uvname);
|
||||
}
|
||||
|
||||
|
@ -2046,7 +2045,7 @@ DerivedMesh *CDDM_from_curve_displist(Object *ob, ListBase *dispbase)
|
|||
static void loops_to_customdata_corners(
|
||||
BMesh *bm, CustomData *facedata,
|
||||
int cdindex, const BMLoop *l3[3],
|
||||
int numCol, int numTex)
|
||||
int numCol, int numUV)
|
||||
{
|
||||
const BMLoop *l;
|
||||
// BMFace *f = l3[0]->f;
|
||||
|
@ -2056,7 +2055,7 @@ static void loops_to_customdata_corners(
|
|||
MLoopUV *mloopuv;
|
||||
int i, j, hasPCol = CustomData_has_layer(&bm->ldata, CD_PREVIEW_MLOOPCOL);
|
||||
|
||||
for (i = 0; i < numTex; i++) {
|
||||
for (i = 0; i < numUV; i++) {
|
||||
texface = CustomData_get_n(facedata, CD_MTFACE, cdindex, i);
|
||||
|
||||
for (j = 0; j < 3; j++) {
|
||||
|
@ -2111,7 +2110,7 @@ static DerivedMesh *cddm_from_bmesh_ex(
|
|||
MLoop *mloop = cddm->mloop;
|
||||
MPoly *mpoly = cddm->mpoly;
|
||||
int numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL);
|
||||
int numTex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
|
||||
int numUV = CustomData_number_of_layers(&bm->ldata, CD_MLOOPUV);
|
||||
int *index, add_orig;
|
||||
CustomDataMask mask;
|
||||
unsigned int i, j;
|
||||
|
@ -2141,7 +2140,7 @@ static DerivedMesh *cddm_from_bmesh_ex(
|
|||
|
||||
/* add tessellation mface layers */
|
||||
if (use_tessface) {
|
||||
CustomData_from_bmeshpoly(&dm->faceData, &dm->polyData, &dm->loopData, em_tottri);
|
||||
CustomData_from_bmeshpoly(&dm->faceData, &dm->loopData, em_tottri);
|
||||
}
|
||||
|
||||
index = dm->getVertDataArray(dm, CD_ORIGINDEX);
|
||||
|
@ -2213,7 +2212,7 @@ static DerivedMesh *cddm_from_bmesh_ex(
|
|||
/* map mfaces to polygons in the same cddm intentionally */
|
||||
*index++ = BM_elem_index_get(efa);
|
||||
|
||||
loops_to_customdata_corners(bm, &dm->faceData, i, l, numCol, numTex);
|
||||
loops_to_customdata_corners(bm, &dm->faceData, i, l, numCol, numUV);
|
||||
test_index_face(mf, &dm->faceData, i, 3);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1210,10 +1210,9 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
|
|||
layerInterp_origspace_face, layerSwap_origspace_face, layerDefault_origspace_face},
|
||||
/* 14: CD_ORCO */
|
||||
{sizeof(float) * 3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
|
||||
/* 15: CD_MTEXPOLY */
|
||||
/* 15: CD_MTEXPOLY */ /* DEPRECATED */
|
||||
/* note, when we expose the UV Map / TexFace split to the user, change this back to face Texture */
|
||||
{sizeof(MTexPoly), "MTexPoly", 1, N_("UVMap") /* "Face Texture" */, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, layerMaxNum_tface},
|
||||
{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
|
||||
/* 16: CD_MLOOPUV */
|
||||
{sizeof(MLoopUV), "MLoopUV", 1, N_("UVMap"), NULL, NULL, layerInterp_mloopuv, NULL, NULL,
|
||||
layerEqual_mloopuv, layerMultiply_mloopuv, layerInitMinMax_mloopuv,
|
||||
|
@ -1313,25 +1312,25 @@ const CustomDataMask CD_MASK_MESH =
|
|||
CD_MASK_MDEFORMVERT |
|
||||
CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS |
|
||||
CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MPOLY | CD_MASK_MLOOP |
|
||||
CD_MASK_MTEXPOLY | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
|
||||
CD_MASK_RECAST | CD_MASK_PAINT_MASK |
|
||||
CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE |
|
||||
CD_MASK_CUSTOMLOOPNORMAL;
|
||||
const CustomDataMask CD_MASK_EDITMESH =
|
||||
CD_MASK_MDEFORMVERT | CD_MASK_MLOOPUV |
|
||||
CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_SHAPE_KEYINDEX |
|
||||
CD_MASK_MLOOPCOL | CD_MASK_SHAPE_KEYINDEX |
|
||||
CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR |
|
||||
CD_MASK_MDISPS | CD_MASK_SHAPEKEY | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
|
||||
CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_CUSTOMLOOPNORMAL;
|
||||
const CustomDataMask CD_MASK_DERIVEDMESH =
|
||||
CD_MASK_MDEFORMVERT |
|
||||
CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO |
|
||||
CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_PREVIEW_MLOOPCOL |
|
||||
CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_PREVIEW_MLOOPCOL |
|
||||
CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP | CD_MASK_ORCO | CD_MASK_TANGENT |
|
||||
CD_MASK_PREVIEW_MCOL | CD_MASK_SHAPEKEY | CD_MASK_RECAST |
|
||||
CD_MASK_ORIGINDEX | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE |
|
||||
CD_MASK_CUSTOMLOOPNORMAL;
|
||||
const CustomDataMask CD_MASK_BMESH =
|
||||
CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
|
||||
CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL |
|
||||
CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
|
||||
CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MDISPS |
|
||||
CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
|
||||
|
@ -1341,7 +1340,7 @@ const CustomDataMask CD_MASK_BMESH =
|
|||
* cover values copied by #BKE_mesh_loops_to_tessdata
|
||||
*/
|
||||
const CustomDataMask CD_MASK_FACECORNERS =
|
||||
CD_MASK_MTFACE | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
|
||||
CD_MASK_MTFACE | CD_MASK_MLOOPUV |
|
||||
CD_MASK_MCOL | CD_MASK_MLOOPCOL |
|
||||
CD_MASK_PREVIEW_MCOL | CD_MASK_PREVIEW_MLOOPCOL |
|
||||
CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP |
|
||||
|
@ -1350,7 +1349,7 @@ const CustomDataMask CD_MASK_FACECORNERS =
|
|||
const CustomDataMask CD_MASK_EVERYTHING =
|
||||
CD_MASK_MVERT | CD_MASK_MDEFORMVERT | CD_MASK_MEDGE | CD_MASK_MFACE |
|
||||
CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_NORMAL /* | CD_MASK_POLYINDEX */ | CD_MASK_PROP_FLT |
|
||||
CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
|
||||
CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_MLOOPUV |
|
||||
CD_MASK_MLOOPCOL | CD_MASK_TANGENT | CD_MASK_MDISPS | CD_MASK_PREVIEW_MCOL | CD_MASK_CLOTH_ORCO | CD_MASK_RECAST |
|
||||
/* BMESH ONLY START */
|
||||
CD_MASK_MPOLY | CD_MASK_MLOOP | CD_MASK_SHAPE_KEYINDEX | CD_MASK_SHAPEKEY | CD_MASK_BWEIGHT | CD_MASK_CREASE |
|
||||
|
@ -2478,13 +2477,10 @@ void CustomData_set(const CustomData *data, int index, int type, const void *sou
|
|||
|
||||
/* BMesh functions */
|
||||
/* needed to convert to/from different face reps */
|
||||
void CustomData_to_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *ldata,
|
||||
int totloop, int totpoly)
|
||||
void CustomData_to_bmeshpoly(CustomData *fdata, CustomData *ldata, int totloop)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < fdata->totlayer; i++) {
|
||||
for (int i = 0; i < fdata->totlayer; i++) {
|
||||
if (fdata->layers[i].type == CD_MTFACE) {
|
||||
CustomData_add_layer_named(pdata, CD_MTEXPOLY, CD_CALLOC, NULL, totpoly, fdata->layers[i].name);
|
||||
CustomData_add_layer_named(ldata, CD_MLOOPUV, CD_CALLOC, NULL, totloop, fdata->layers[i].name);
|
||||
}
|
||||
else if (fdata->layers[i].type == CD_MCOL) {
|
||||
|
@ -2499,19 +2495,18 @@ void CustomData_to_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *l
|
|||
}
|
||||
}
|
||||
|
||||
void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData *ldata, int total)
|
||||
void CustomData_from_bmeshpoly(
|
||||
CustomData *fdata, CustomData *ldata, int total)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* avoid accumulating extra layers */
|
||||
BLI_assert(!CustomData_from_bmeshpoly_test(fdata, pdata, ldata, false));
|
||||
BLI_assert(!CustomData_from_bmeshpoly_test(fdata, ldata, false));
|
||||
|
||||
for (i = 0; i < pdata->totlayer; i++) {
|
||||
if (pdata->layers[i].type == CD_MTEXPOLY) {
|
||||
CustomData_add_layer_named(fdata, CD_MTFACE, CD_CALLOC, NULL, total, pdata->layers[i].name);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < ldata->totlayer; i++) {
|
||||
if (ldata->layers[i].type == CD_MLOOPUV) {
|
||||
CustomData_add_layer_named(fdata, CD_MTFACE, CD_CALLOC, NULL, total, ldata->layers[i].name);
|
||||
}
|
||||
if (ldata->layers[i].type == CD_MLOOPCOL) {
|
||||
CustomData_add_layer_named(fdata, CD_MCOL, CD_CALLOC, NULL, total, ldata->layers[i].name);
|
||||
}
|
||||
|
@ -2529,7 +2524,7 @@ void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData
|
|||
}
|
||||
}
|
||||
|
||||
CustomData_bmesh_update_active_layers(fdata, pdata, ldata);
|
||||
CustomData_bmesh_update_active_layers(fdata, ldata);
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
@ -2539,13 +2534,13 @@ void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData
|
|||
* \param fallback: Use when there are no layers to handle,
|
||||
* since callers may expect success or failure.
|
||||
*/
|
||||
bool CustomData_from_bmeshpoly_test(CustomData *fdata, CustomData *pdata, CustomData *ldata, bool fallback)
|
||||
bool CustomData_from_bmeshpoly_test(CustomData *fdata, CustomData *ldata, bool fallback)
|
||||
{
|
||||
int a_num = 0, b_num = 0;
|
||||
#define LAYER_CMP(l_a, t_a, l_b, t_b) \
|
||||
((a_num += CustomData_number_of_layers(l_a, t_a)) == (b_num += CustomData_number_of_layers(l_b, t_b)))
|
||||
|
||||
if (!LAYER_CMP(pdata, CD_MTEXPOLY, fdata, CD_MTFACE))
|
||||
if (!LAYER_CMP(ldata, CD_MLOOPUV, fdata, CD_MTFACE))
|
||||
return false;
|
||||
if (!LAYER_CMP(ldata, CD_MLOOPCOL, fdata, CD_MCOL))
|
||||
return false;
|
||||
|
@ -2567,25 +2562,21 @@ bool CustomData_from_bmeshpoly_test(CustomData *fdata, CustomData *pdata, Custom
|
|||
#endif
|
||||
|
||||
|
||||
void CustomData_bmesh_update_active_layers(CustomData *fdata, CustomData *pdata, CustomData *ldata)
|
||||
void CustomData_bmesh_update_active_layers(CustomData *fdata, CustomData *ldata)
|
||||
{
|
||||
int act;
|
||||
|
||||
if (CustomData_has_layer(pdata, CD_MTEXPOLY)) {
|
||||
act = CustomData_get_active_layer(pdata, CD_MTEXPOLY);
|
||||
CustomData_set_layer_active(ldata, CD_MLOOPUV, act);
|
||||
if (CustomData_has_layer(ldata, CD_MLOOPUV)) {
|
||||
act = CustomData_get_active_layer(ldata, CD_MLOOPUV);
|
||||
CustomData_set_layer_active(fdata, CD_MTFACE, act);
|
||||
|
||||
act = CustomData_get_render_layer(pdata, CD_MTEXPOLY);
|
||||
CustomData_set_layer_render(ldata, CD_MLOOPUV, act);
|
||||
act = CustomData_get_render_layer(ldata, CD_MLOOPUV);
|
||||
CustomData_set_layer_render(fdata, CD_MTFACE, act);
|
||||
|
||||
act = CustomData_get_clone_layer(pdata, CD_MTEXPOLY);
|
||||
CustomData_set_layer_clone(ldata, CD_MLOOPUV, act);
|
||||
act = CustomData_get_clone_layer(ldata, CD_MLOOPUV);
|
||||
CustomData_set_layer_clone(fdata, CD_MTFACE, act);
|
||||
|
||||
act = CustomData_get_stencil_layer(pdata, CD_MTEXPOLY);
|
||||
CustomData_set_layer_stencil(ldata, CD_MLOOPUV, act);
|
||||
act = CustomData_get_stencil_layer(ldata, CD_MLOOPUV);
|
||||
CustomData_set_layer_stencil(fdata, CD_MTFACE, act);
|
||||
}
|
||||
|
||||
|
@ -2609,25 +2600,21 @@ void CustomData_bmesh_update_active_layers(CustomData *fdata, CustomData *pdata,
|
|||
* used by do_versions in readfile.c when creating pdata and ldata for pre-bmesh
|
||||
* meshes and needed to preserve active/render/clone/stencil flags set in pre-bmesh files
|
||||
*/
|
||||
void CustomData_bmesh_do_versions_update_active_layers(CustomData *fdata, CustomData *pdata, CustomData *ldata)
|
||||
void CustomData_bmesh_do_versions_update_active_layers(CustomData *fdata, CustomData *ldata)
|
||||
{
|
||||
int act;
|
||||
|
||||
if (CustomData_has_layer(fdata, CD_MTFACE)) {
|
||||
act = CustomData_get_active_layer(fdata, CD_MTFACE);
|
||||
CustomData_set_layer_active(pdata, CD_MTEXPOLY, act);
|
||||
CustomData_set_layer_active(ldata, CD_MLOOPUV, act);
|
||||
|
||||
act = CustomData_get_render_layer(fdata, CD_MTFACE);
|
||||
CustomData_set_layer_render(pdata, CD_MTEXPOLY, act);
|
||||
CustomData_set_layer_render(ldata, CD_MLOOPUV, act);
|
||||
|
||||
act = CustomData_get_clone_layer(fdata, CD_MTFACE);
|
||||
CustomData_set_layer_clone(pdata, CD_MTEXPOLY, act);
|
||||
CustomData_set_layer_clone(ldata, CD_MLOOPUV, act);
|
||||
|
||||
act = CustomData_get_stencil_layer(fdata, CD_MTFACE);
|
||||
CustomData_set_layer_stencil(pdata, CD_MTEXPOLY, act);
|
||||
CustomData_set_layer_stencil(ldata, CD_MLOOPUV, act);
|
||||
}
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@ CustomDataMask BKE_object_data_transfer_dttypes_to_cdmask(const int dtdata_types
|
|||
cddata_mask |= CD_MASK_MDEFORMVERT; /* Exception for vgroups :/ */
|
||||
}
|
||||
else if (cddata_type == CD_FAKE_UV) {
|
||||
cddata_mask |= CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV;
|
||||
cddata_mask |= CD_MASK_MLOOPUV;
|
||||
}
|
||||
else if (cddata_type == CD_FAKE_LNOR) {
|
||||
cddata_mask |= CD_MASK_NORMAL | CD_MASK_CUSTOMLOOPNORMAL;
|
||||
|
@ -962,7 +962,7 @@ static bool data_transfer_layersmapping_generate(
|
|||
}
|
||||
else if (elem_type == ME_POLY) {
|
||||
if (cddata_type == CD_FAKE_UV) {
|
||||
cddata_type = CD_MTEXPOLY;
|
||||
cddata_type = CD_MLOOPUV;
|
||||
}
|
||||
|
||||
if (!(cddata_type & CD_FAKE)) {
|
||||
|
|
|
@ -1457,14 +1457,8 @@ static void *emDM_getTessFaceDataArray(DerivedMesh *dm, int type)
|
|||
if (type == CD_MTFACE || type == CD_MCOL) {
|
||||
const char *bmdata;
|
||||
char *data;
|
||||
bool has_type_source = false;
|
||||
|
||||
if (type == CD_MTFACE) {
|
||||
has_type_source = CustomData_has_layer(&bm->pdata, CD_MTEXPOLY);
|
||||
}
|
||||
else {
|
||||
has_type_source = CustomData_has_layer(&bm->ldata, CD_MLOOPCOL);
|
||||
}
|
||||
bool has_type_source = CustomData_has_layer(&bm->ldata, (type == CD_MTFACE) ? CD_MLOOPUV : CD_MLOOPCOL);
|
||||
|
||||
if (has_type_source) {
|
||||
/* offset = bm->pdata.layers[index].offset; */ /* UNUSED */
|
||||
|
@ -1480,14 +1474,8 @@ static void *emDM_getTessFaceDataArray(DerivedMesh *dm, int type)
|
|||
|
||||
if (type == CD_MTFACE) {
|
||||
const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
|
||||
const int cd_poly_tex_offset = CustomData_get_offset(&bm->pdata, CD_MTEXPOLY);
|
||||
|
||||
for (i = 0; i < bmdm->em->tottri; i++, data += size) {
|
||||
BMFace *efa = looptris[i][0]->f;
|
||||
|
||||
// bmdata = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
|
||||
bmdata = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
|
||||
|
||||
for (j = 0; j < 3; j++) {
|
||||
// bmdata = CustomData_bmesh_get(&bm->ldata, looptris[i][j]->head.data, CD_MLOOPUV);
|
||||
bmdata = BM_ELEM_CD_GET_VOID_P(looptris[i][j], cd_loop_uv_offset);
|
||||
|
|
|
@ -165,26 +165,6 @@ void BKE_editmesh_tessface_calc(BMEditMesh *em)
|
|||
#endif
|
||||
}
|
||||
|
||||
void BKE_editmesh_update_linked_customdata(BMEditMesh *em)
|
||||
{
|
||||
BMesh *bm = em->bm;
|
||||
int act;
|
||||
|
||||
if (CustomData_has_layer(&bm->pdata, CD_MTEXPOLY)) {
|
||||
act = CustomData_get_active_layer(&bm->pdata, CD_MTEXPOLY);
|
||||
CustomData_set_layer_active(&bm->ldata, CD_MLOOPUV, act);
|
||||
|
||||
act = CustomData_get_render_layer(&bm->pdata, CD_MTEXPOLY);
|
||||
CustomData_set_layer_render(&bm->ldata, CD_MLOOPUV, act);
|
||||
|
||||
act = CustomData_get_clone_layer(&bm->pdata, CD_MTEXPOLY);
|
||||
CustomData_set_layer_clone(&bm->ldata, CD_MLOOPUV, act);
|
||||
|
||||
act = CustomData_get_stencil_layer(&bm->pdata, CD_MTEXPOLY);
|
||||
CustomData_set_layer_stencil(&bm->ldata, CD_MLOOPUV, act);
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_editmesh_free_derivedmesh(BMEditMesh *em)
|
||||
{
|
||||
if (em->derivedCage) {
|
||||
|
|
|
@ -126,7 +126,7 @@ static int customdata_compare(CustomData *c1, CustomData *c2, Mesh *m1, Mesh *m2
|
|||
|
||||
for (i = 0; i < c1->totlayer; i++) {
|
||||
if (ELEM(c1->layers[i].type, CD_MVERT, CD_MEDGE, CD_MPOLY,
|
||||
CD_MLOOPUV, CD_MLOOPCOL, CD_MTEXPOLY, CD_MDEFORMVERT))
|
||||
CD_MLOOPUV, CD_MLOOPCOL, CD_MDEFORMVERT))
|
||||
{
|
||||
i1++;
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ static int customdata_compare(CustomData *c1, CustomData *c2, Mesh *m1, Mesh *m2
|
|||
|
||||
for (i = 0; i < c2->totlayer; i++) {
|
||||
if (ELEM(c2->layers[i].type, CD_MVERT, CD_MEDGE, CD_MPOLY,
|
||||
CD_MLOOPUV, CD_MLOOPCOL, CD_MTEXPOLY, CD_MDEFORMVERT))
|
||||
CD_MLOOPUV, CD_MLOOPCOL, CD_MDEFORMVERT))
|
||||
{
|
||||
i2++;
|
||||
}
|
||||
|
@ -148,14 +148,14 @@ static int customdata_compare(CustomData *c1, CustomData *c2, Mesh *m1, Mesh *m2
|
|||
i1 = 0; i2 = 0;
|
||||
for (i = 0; i < tot; i++) {
|
||||
while (i1 < c1->totlayer && !ELEM(l1->type, CD_MVERT, CD_MEDGE, CD_MPOLY,
|
||||
CD_MLOOPUV, CD_MLOOPCOL, CD_MTEXPOLY, CD_MDEFORMVERT))
|
||||
CD_MLOOPUV, CD_MLOOPCOL, CD_MDEFORMVERT))
|
||||
{
|
||||
i1++;
|
||||
l1++;
|
||||
}
|
||||
|
||||
while (i2 < c2->totlayer && !ELEM(l2->type, CD_MVERT, CD_MEDGE, CD_MPOLY,
|
||||
CD_MLOOPUV, CD_MLOOPCOL, CD_MTEXPOLY, CD_MDEFORMVERT))
|
||||
CD_MLOOPUV, CD_MLOOPCOL, CD_MDEFORMVERT))
|
||||
{
|
||||
i2++;
|
||||
l2++;
|
||||
|
@ -323,7 +323,7 @@ static void mesh_ensure_tessellation_customdata(Mesh *me)
|
|||
* Callers could also check but safer to do here - campbell */
|
||||
}
|
||||
else {
|
||||
const int tottex_original = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
|
||||
const int tottex_original = CustomData_number_of_layers(&me->ldata, CD_MLOOPUV);
|
||||
const int totcol_original = CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL);
|
||||
|
||||
const int tottex_tessface = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
|
||||
|
@ -334,7 +334,7 @@ static void mesh_ensure_tessellation_customdata(Mesh *me)
|
|||
{
|
||||
BKE_mesh_tessface_clear(me);
|
||||
|
||||
CustomData_from_bmeshpoly(&me->fdata, &me->pdata, &me->ldata, me->totface);
|
||||
CustomData_from_bmeshpoly(&me->fdata, &me->ldata, me->totface);
|
||||
|
||||
/* TODO - add some --debug-mesh option */
|
||||
if (G.debug & G_DEBUG) {
|
||||
|
@ -343,7 +343,7 @@ static void mesh_ensure_tessellation_customdata(Mesh *me)
|
|||
* and check if there was any data to begin with, for now just print the warning with
|
||||
* some info to help troubleshoot whats going on - campbell */
|
||||
printf("%s: warning! Tessellation uvs or vcol data got out of sync, "
|
||||
"had to reset!\n CD_MTFACE: %d != CD_MTEXPOLY: %d || CD_MCOL: %d != CD_MLOOPCOL: %d\n",
|
||||
"had to reset!\n CD_MTFACE: %d != CD_MLOOPUV: %d || CD_MCOL: %d != CD_MLOOPCOL: %d\n",
|
||||
__func__, tottex_tessface, tottex_original, totcol_tessface, totcol_original);
|
||||
}
|
||||
}
|
||||
|
@ -395,14 +395,11 @@ void BKE_mesh_ensure_skin_customdata(Mesh *me)
|
|||
* versions of the mesh. - campbell*/
|
||||
static void mesh_update_linked_customdata(Mesh *me, const bool do_ensure_tess_cd)
|
||||
{
|
||||
if (me->edit_btmesh)
|
||||
BKE_editmesh_update_linked_customdata(me->edit_btmesh);
|
||||
|
||||
if (do_ensure_tess_cd) {
|
||||
mesh_ensure_tessellation_customdata(me);
|
||||
}
|
||||
|
||||
CustomData_bmesh_update_active_layers(&me->fdata, &me->pdata, &me->ldata);
|
||||
CustomData_bmesh_update_active_layers(&me->fdata, &me->ldata);
|
||||
}
|
||||
|
||||
void BKE_mesh_update_customdata_pointers(Mesh *me, const bool do_ensure_tess_cd)
|
||||
|
@ -421,7 +418,6 @@ void BKE_mesh_update_customdata_pointers(Mesh *me, const bool do_ensure_tess_cd)
|
|||
me->mpoly = CustomData_get_layer(&me->pdata, CD_MPOLY);
|
||||
me->mloop = CustomData_get_layer(&me->ldata, CD_MLOOP);
|
||||
|
||||
me->mtpoly = CustomData_get_layer(&me->pdata, CD_MTEXPOLY);
|
||||
me->mloopcol = CustomData_get_layer(&me->ldata, CD_MLOOPCOL);
|
||||
me->mloopuv = CustomData_get_layer(&me->ldata, CD_MLOOPUV);
|
||||
}
|
||||
|
@ -585,24 +581,34 @@ bool BKE_mesh_uv_cdlayer_rename_index(Mesh *me, const int poly_index, const int
|
|||
ldata = &me->ldata;
|
||||
fdata = &me->fdata;
|
||||
}
|
||||
cdlp = &pdata->layers[poly_index];
|
||||
cdlp = (poly_index != -1) ? &pdata->layers[poly_index] : NULL;
|
||||
cdlu = &ldata->layers[loop_index];
|
||||
cdlf = fdata && do_tessface ? &fdata->layers[face_index] : NULL;
|
||||
|
||||
if (cdlp->name != new_name) {
|
||||
if (cdlp == NULL && cdlf == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cdlu->name != new_name) {
|
||||
/* Mesh validate passes a name from the CD layer as the new name,
|
||||
* Avoid memcpy from self to self in this case.
|
||||
*/
|
||||
BLI_strncpy(cdlp->name, new_name, sizeof(cdlp->name));
|
||||
CustomData_set_layer_unique_name(pdata, cdlp - pdata->layers);
|
||||
BLI_strncpy(cdlu->name, new_name, sizeof(cdlu->name));
|
||||
CustomData_set_layer_unique_name(pdata, cdlu - pdata->layers);
|
||||
}
|
||||
|
||||
/* Loop until we do have exactly the same name for all layers! */
|
||||
for (i = 1; !STREQ(cdlp->name, cdlu->name) || (cdlf && !STREQ(cdlp->name, cdlf->name)); i++) {
|
||||
for (i = 1;
|
||||
(cdlp && !STREQ(cdlp->name, cdlu->name)) ||
|
||||
(cdlf && !STREQ(cdlp->name, cdlf->name));
|
||||
i++)
|
||||
{
|
||||
switch (i % step) {
|
||||
case 0:
|
||||
BLI_strncpy(cdlp->name, cdlu->name, sizeof(cdlp->name));
|
||||
CustomData_set_layer_unique_name(pdata, cdlp - pdata->layers);
|
||||
if (cdlp) {
|
||||
BLI_strncpy(cdlp->name, cdlu->name, sizeof(cdlp->name));
|
||||
CustomData_set_layer_unique_name(pdata, cdlp - pdata->layers);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
BLI_strncpy(cdlu->name, cdlp->name, sizeof(cdlu->name));
|
||||
|
@ -610,7 +616,7 @@ bool BKE_mesh_uv_cdlayer_rename_index(Mesh *me, const int poly_index, const int
|
|||
break;
|
||||
case 2:
|
||||
if (cdlf) {
|
||||
BLI_strncpy(cdlf->name, cdlp->name, sizeof(cdlf->name));
|
||||
BLI_strncpy(cdlf->name, cdlu->name, sizeof(cdlf->name));
|
||||
CustomData_set_layer_unique_name(fdata, cdlf - fdata->layers);
|
||||
}
|
||||
break;
|
||||
|
@ -622,66 +628,44 @@ bool BKE_mesh_uv_cdlayer_rename_index(Mesh *me, const int poly_index, const int
|
|||
|
||||
bool BKE_mesh_uv_cdlayer_rename(Mesh *me, const char *old_name, const char *new_name, bool do_tessface)
|
||||
{
|
||||
CustomData *pdata, *ldata, *fdata;
|
||||
CustomData *ldata, *fdata;
|
||||
if (me->edit_btmesh) {
|
||||
pdata = &me->edit_btmesh->bm->pdata;
|
||||
ldata = &me->edit_btmesh->bm->ldata;
|
||||
/* No tessellated data in BMesh! */
|
||||
fdata = NULL;
|
||||
do_tessface = false;
|
||||
}
|
||||
else {
|
||||
pdata = &me->pdata;
|
||||
ldata = &me->ldata;
|
||||
fdata = &me->fdata;
|
||||
do_tessface = (do_tessface && fdata->totlayer);
|
||||
}
|
||||
|
||||
{
|
||||
const int pidx_start = CustomData_get_layer_index(pdata, CD_MTEXPOLY);
|
||||
const int lidx_start = CustomData_get_layer_index(ldata, CD_MLOOPUV);
|
||||
const int fidx_start = do_tessface ? CustomData_get_layer_index(fdata, CD_MTFACE) : -1;
|
||||
int pidx = CustomData_get_named_layer(pdata, CD_MTEXPOLY, old_name);
|
||||
int lidx = CustomData_get_named_layer(ldata, CD_MLOOPUV, old_name);
|
||||
int fidx = do_tessface ? CustomData_get_named_layer(fdata, CD_MTFACE, old_name) : -1;
|
||||
|
||||
/* None of those cases should happen, in theory!
|
||||
* Note this assume we have the same number of mtexpoly, mloopuv and mtface layers!
|
||||
*/
|
||||
if (pidx == -1) {
|
||||
if (lidx == -1) {
|
||||
if (fidx == -1) {
|
||||
/* No layer found with this name! */
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
lidx = fidx;
|
||||
}
|
||||
if (lidx == -1) {
|
||||
if (fidx == -1) {
|
||||
/* No layer found with this name! */
|
||||
return false;
|
||||
}
|
||||
pidx = lidx;
|
||||
}
|
||||
else {
|
||||
if (lidx == -1) {
|
||||
lidx = pidx;
|
||||
}
|
||||
if (fidx == -1 && do_tessface) {
|
||||
fidx = pidx;
|
||||
else {
|
||||
lidx = fidx;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
/* For now, we do not consider mismatch in indices (i.e. same name leading to (relative) different indices). */
|
||||
else if (pidx != lidx) {
|
||||
lidx = pidx;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Go back to absolute indices! */
|
||||
pidx += pidx_start;
|
||||
lidx += lidx_start;
|
||||
if (fidx != -1)
|
||||
fidx += fidx_start;
|
||||
|
||||
return BKE_mesh_uv_cdlayer_rename_index(me, pidx, lidx, fidx, new_name, do_tessface);
|
||||
return BKE_mesh_uv_cdlayer_rename_index(me, -1, lidx, fidx, new_name, do_tessface);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1381,7 +1365,6 @@ void BKE_mesh_from_nurbs_displist(Object *ob, ListBase *dispbase, const bool use
|
|||
|
||||
if (alluv) {
|
||||
const char *uvname = "Orco";
|
||||
me->mtpoly = CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DEFAULT, NULL, me->totpoly, uvname);
|
||||
me->mloopuv = CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_ASSIGN, alluv, me->totloop, uvname);
|
||||
}
|
||||
|
||||
|
|
|
@ -2166,7 +2166,7 @@ void BKE_mesh_loops_to_mface_corners(
|
|||
const int mf_len, /* 3 or 4 */
|
||||
|
||||
/* cache values to avoid lookups every time */
|
||||
const int numTex, /* CustomData_number_of_layers(pdata, CD_MTEXPOLY) */
|
||||
const int numUV, /* CustomData_number_of_layers(ldata, CD_MLOOPUV) */
|
||||
const int numCol, /* CustomData_number_of_layers(ldata, CD_MLOOPCOL) */
|
||||
const bool hasPCol, /* CustomData_has_layer(ldata, CD_PREVIEW_MLOOPCOL) */
|
||||
const bool hasOrigSpace, /* CustomData_has_layer(ldata, CD_ORIGSPACE_MLOOP) */
|
||||
|
@ -2179,7 +2179,7 @@ void BKE_mesh_loops_to_mface_corners(
|
|||
MLoopUV *mloopuv;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < numTex; i++) {
|
||||
for (i = 0; i < numUV; i++) {
|
||||
texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
|
||||
|
||||
for (j = 0; j < mf_len; j++) {
|
||||
|
@ -2232,14 +2232,14 @@ void BKE_mesh_loops_to_mface_corners(
|
|||
*
|
||||
* \note when mface is not NULL, mface[face_index].v4 is used to test quads, else, loopindices[face_index][3] is used.
|
||||
*/
|
||||
void BKE_mesh_loops_to_tessdata(CustomData *fdata, CustomData *ldata, CustomData *pdata, MFace *mface,
|
||||
void BKE_mesh_loops_to_tessdata(CustomData *fdata, CustomData *ldata, MFace *mface,
|
||||
int *polyindices, unsigned int (*loopindices)[4], const int num_faces)
|
||||
{
|
||||
/* Note: performances are sub-optimal when we get a NULL mface, we could be ~25% quicker with dedicated code...
|
||||
* Issue is, unless having two different functions with nearly the same code, there's not much ways to solve
|
||||
* this. Better imho to live with it for now. :/ --mont29
|
||||
*/
|
||||
const int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
|
||||
const int numUV = CustomData_number_of_layers(ldata, CD_MLOOPUV);
|
||||
const int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
|
||||
const bool hasPCol = CustomData_has_layer(ldata, CD_PREVIEW_MLOOPCOL);
|
||||
const bool hasOrigSpace = CustomData_has_layer(ldata, CD_ORIGSPACE_MLOOP);
|
||||
|
@ -2249,7 +2249,7 @@ void BKE_mesh_loops_to_tessdata(CustomData *fdata, CustomData *ldata, CustomData
|
|||
const int *pidx;
|
||||
unsigned int (*lidx)[4];
|
||||
|
||||
for (i = 0; i < numTex; i++) {
|
||||
for (i = 0; i < numUV; i++) {
|
||||
MTFace *texface = CustomData_get_layer_n(fdata, CD_MTFACE, i);
|
||||
MLoopUV *mloopuv = CustomData_get_layer_n(ldata, CD_MLOOPUV, i);
|
||||
|
||||
|
@ -2579,7 +2579,7 @@ int BKE_mesh_recalc_tessellation(
|
|||
/* CD_ORIGINDEX will contain an array of indices from tessfaces to the polygons
|
||||
* they are directly tessellated from */
|
||||
CustomData_add_layer(fdata, CD_ORIGINDEX, CD_ASSIGN, mface_to_poly_map, totface);
|
||||
CustomData_from_bmeshpoly(fdata, pdata, ldata, totface);
|
||||
CustomData_from_bmeshpoly(fdata, ldata, totface);
|
||||
|
||||
if (do_face_nor_copy) {
|
||||
/* If polys have a normals layer, copying that to faces can help
|
||||
|
@ -2600,7 +2600,7 @@ int BKE_mesh_recalc_tessellation(
|
|||
* So we pass NULL as MFace pointer, and BKE_mesh_loops_to_tessdata will use the fourth loop index as quad test.
|
||||
* ...
|
||||
*/
|
||||
BKE_mesh_loops_to_tessdata(fdata, ldata, pdata, NULL, mface_to_poly_map, lindices, totface);
|
||||
BKE_mesh_loops_to_tessdata(fdata, ldata, NULL, mface_to_poly_map, lindices, totface);
|
||||
|
||||
/* NOTE: quad detection issue - fourth vertidx vs fourth loopidx:
|
||||
* ...However, most TFace code uses 'MFace->v4 == 0' test to check whether it is a tri or quad.
|
||||
|
@ -2779,7 +2779,7 @@ int BKE_mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
|
|||
MPoly *mp, *mpoly;
|
||||
MFace *mface, *mf;
|
||||
|
||||
const int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
|
||||
const int numUV = CustomData_number_of_layers(ldata, CD_MLOOPUV);
|
||||
const int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
|
||||
const bool hasPCol = CustomData_has_layer(ldata, CD_PREVIEW_MLOOPCOL);
|
||||
const bool hasOrigSpace = CustomData_has_layer(ldata, CD_ORIGSPACE_MLOOP);
|
||||
|
@ -2819,7 +2819,7 @@ int BKE_mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
|
|||
|
||||
CustomData_add_layer(fdata, CD_MFACE, CD_ASSIGN, mface, totface);
|
||||
|
||||
CustomData_from_bmeshpoly(fdata, pdata, ldata, totface);
|
||||
CustomData_from_bmeshpoly(fdata, ldata, totface);
|
||||
|
||||
mp = mpoly;
|
||||
k = 0;
|
||||
|
@ -2841,9 +2841,10 @@ int BKE_mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
|
|||
mf->v2 = mloop[mf->v2].v;
|
||||
mf->v3 = mloop[mf->v3].v;
|
||||
|
||||
BKE_mesh_loops_to_mface_corners(fdata, ldata, pdata,
|
||||
lindex, k, i, 3,
|
||||
numTex, numCol, hasPCol, hasOrigSpace, hasLNor);
|
||||
BKE_mesh_loops_to_mface_corners(
|
||||
fdata, ldata, pdata,
|
||||
lindex, k, i, 3,
|
||||
numUV, numCol, hasPCol, hasOrigSpace, hasLNor);
|
||||
test_index_face(mf, fdata, k, 3);
|
||||
}
|
||||
else {
|
||||
|
@ -2861,9 +2862,10 @@ int BKE_mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
|
|||
mf->v3 = mloop[mf->v3].v;
|
||||
mf->v4 = mloop[mf->v4].v;
|
||||
|
||||
BKE_mesh_loops_to_mface_corners(fdata, ldata, pdata,
|
||||
lindex, k, i, 4,
|
||||
numTex, numCol, hasPCol, hasOrigSpace, hasLNor);
|
||||
BKE_mesh_loops_to_mface_corners(
|
||||
fdata, ldata, pdata,
|
||||
lindex, k, i, 4,
|
||||
numUV, numCol, hasPCol, hasOrigSpace, hasLNor);
|
||||
test_index_face(mf, fdata, k, 4);
|
||||
}
|
||||
|
||||
|
@ -3000,7 +3002,7 @@ void BKE_mesh_do_versions_convert_mfaces_to_mpolys(Mesh *mesh)
|
|||
mesh->medge, mesh->mface,
|
||||
&mesh->totloop, &mesh->totpoly, &mesh->mloop, &mesh->mpoly);
|
||||
|
||||
CustomData_bmesh_do_versions_update_active_layers(&mesh->fdata, &mesh->pdata, &mesh->ldata);
|
||||
CustomData_bmesh_do_versions_update_active_layers(&mesh->fdata, &mesh->ldata);
|
||||
|
||||
BKE_mesh_update_customdata_pointers(mesh, true);
|
||||
}
|
||||
|
@ -3043,7 +3045,7 @@ void BKE_mesh_convert_mfaces_to_mpolys_ex(ID *id, CustomData *fdata, CustomData
|
|||
|
||||
CustomData_add_layer(ldata, CD_MLOOP, CD_ASSIGN, mloop, totloop);
|
||||
|
||||
CustomData_to_bmeshpoly(fdata, pdata, ldata, totloop, totpoly);
|
||||
CustomData_to_bmeshpoly(fdata, ldata, totloop);
|
||||
|
||||
if (id) {
|
||||
/* ensure external data is transferred */
|
||||
|
|
|
@ -937,7 +937,7 @@ bool BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata,
|
|||
{
|
||||
bool is_valid = true;
|
||||
bool is_change_v, is_change_e, is_change_l, is_change_p;
|
||||
int tot_texpoly, tot_uvloop, tot_vcolloop;
|
||||
int tot_uvloop, tot_vcolloop;
|
||||
CustomDataMask mask = check_meshmask ? CD_MASK_MESH : 0;
|
||||
|
||||
is_valid &= mesh_validate_customdata(vdata, mask, do_verbose, do_fixes, &is_change_v);
|
||||
|
@ -945,17 +945,8 @@ bool BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata,
|
|||
is_valid &= mesh_validate_customdata(ldata, mask, do_verbose, do_fixes, &is_change_l);
|
||||
is_valid &= mesh_validate_customdata(pdata, mask, do_verbose, do_fixes, &is_change_p);
|
||||
|
||||
tot_texpoly = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
|
||||
tot_uvloop = CustomData_number_of_layers(ldata, CD_MLOOPUV);
|
||||
tot_vcolloop = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
|
||||
if (tot_texpoly != tot_uvloop) {
|
||||
PRINT_ERR("\tCustomDataLayer mismatch, tot_texpoly(%d), tot_uvloop(%d)\n",
|
||||
tot_texpoly, tot_uvloop);
|
||||
}
|
||||
if (tot_texpoly > MAX_MTFACE) {
|
||||
PRINT_ERR("\tMore UV layers than %d allowed, %d last ones won't be available for render, shaders, etc.\n",
|
||||
MAX_MTFACE, tot_texpoly - MAX_MTFACE);
|
||||
}
|
||||
if (tot_uvloop > MAX_MTFACE) {
|
||||
PRINT_ERR("\tMore UV layers than %d allowed, %d last ones won't be available for render, shaders, etc.\n",
|
||||
MAX_MTFACE, tot_uvloop - MAX_MTFACE);
|
||||
|
@ -966,18 +957,10 @@ bool BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata,
|
|||
}
|
||||
|
||||
/* check indices of clone/stencil */
|
||||
if (do_fixes && CustomData_get_clone_layer(pdata, CD_MTEXPOLY) >= tot_texpoly) {
|
||||
CustomData_set_layer_clone(pdata, CD_MTEXPOLY, 0);
|
||||
is_change_p = true;
|
||||
}
|
||||
if (do_fixes && CustomData_get_clone_layer(ldata, CD_MLOOPUV) >= tot_uvloop) {
|
||||
CustomData_set_layer_clone(ldata, CD_MLOOPUV, 0);
|
||||
is_change_l = true;
|
||||
}
|
||||
if (do_fixes && CustomData_get_stencil_layer(pdata, CD_MTEXPOLY) >= tot_texpoly) {
|
||||
CustomData_set_layer_stencil(pdata, CD_MTEXPOLY, 0);
|
||||
is_change_p = true;
|
||||
}
|
||||
if (do_fixes && CustomData_get_stencil_layer(ldata, CD_MLOOPUV) >= tot_uvloop) {
|
||||
CustomData_set_layer_stencil(ldata, CD_MLOOPUV, 0);
|
||||
is_change_l = true;
|
||||
|
@ -1028,64 +1011,6 @@ int BKE_mesh_validate(Mesh *me, const int do_verbose, const int cddata_check_mas
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicate of BM_mesh_cd_validate() for Mesh data.
|
||||
*/
|
||||
void BKE_mesh_cd_validate(Mesh *me)
|
||||
{
|
||||
int totlayer_mtex = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
|
||||
int totlayer_uv = CustomData_number_of_layers(&me->ldata, CD_MLOOPUV);
|
||||
int totlayer_mcol = CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL);
|
||||
int mtex_index = CustomData_get_layer_index(&me->pdata, CD_MTEXPOLY);
|
||||
int uv_index = CustomData_get_layer_index(&me->ldata, CD_MLOOPUV);
|
||||
int i;
|
||||
|
||||
/* XXX For now, do not delete those, just warn they are not really usable. */
|
||||
if (UNLIKELY(totlayer_mtex > MAX_MTFACE)) {
|
||||
printf("WARNING! More UV layers than %d allowed, %d last ones won't be available for render, shaders, etc.\n",
|
||||
MAX_MTFACE, totlayer_mtex - MAX_MTFACE);
|
||||
}
|
||||
if (UNLIKELY(totlayer_uv > MAX_MTFACE)) {
|
||||
printf("WARNING! More UV layers than %d allowed, %d last ones won't be available for render, shaders, etc.\n",
|
||||
MAX_MTFACE, totlayer_uv - MAX_MTFACE);
|
||||
}
|
||||
if (UNLIKELY(totlayer_mcol > MAX_MCOL)) {
|
||||
printf("WARNING! More VCol layers than %d allowed, %d last ones won't be available for render, shaders, etc.\n",
|
||||
MAX_MCOL, totlayer_mcol - MAX_MCOL);
|
||||
}
|
||||
|
||||
if (LIKELY(totlayer_mtex == totlayer_uv)) {
|
||||
/* pass */
|
||||
}
|
||||
else if (totlayer_mtex < totlayer_uv) {
|
||||
do {
|
||||
const char *from_name = me->ldata.layers[uv_index + totlayer_mtex].name;
|
||||
CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DEFAULT, NULL, me->totpoly, from_name);
|
||||
CustomData_set_layer_unique_name(&me->pdata, totlayer_mtex);
|
||||
} while (totlayer_uv != ++totlayer_mtex);
|
||||
mtex_index = CustomData_get_layer_index(&me->pdata, CD_MTEXPOLY);
|
||||
}
|
||||
else if (totlayer_uv < totlayer_mtex) {
|
||||
do {
|
||||
const char *from_name = me->pdata.layers[mtex_index + totlayer_uv].name;
|
||||
CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_DEFAULT, NULL, me->totloop, from_name);
|
||||
CustomData_set_layer_unique_name(&me->ldata, totlayer_uv);
|
||||
} while (totlayer_mtex != ++totlayer_uv);
|
||||
uv_index = CustomData_get_layer_index(&me->ldata, CD_MLOOPUV);
|
||||
}
|
||||
|
||||
BLI_assert(totlayer_mtex == totlayer_uv);
|
||||
|
||||
/* Check uv/tex names match as well!!! */
|
||||
for (i = 0; i < totlayer_mtex; i++, mtex_index++, uv_index++) {
|
||||
const char *name_src = me->pdata.layers[mtex_index].name;
|
||||
const char *name_dst = me->ldata.layers[uv_index].name;
|
||||
if (!STREQ(name_src, name_dst)) {
|
||||
BKE_mesh_uv_cdlayer_rename_index(me, mtex_index, uv_index, -1, name_src, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check all material indices of polygons are valid, invalid ones are set to 0.
|
||||
* \returns is_valid.
|
||||
|
|
|
@ -4563,7 +4563,6 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
|
|||
mesh->dvert = newdataadr(fd, mesh->dvert);
|
||||
mesh->mloopcol = newdataadr(fd, mesh->mloopcol);
|
||||
mesh->mloopuv = newdataadr(fd, mesh->mloopuv);
|
||||
mesh->mtpoly = newdataadr(fd, mesh->mtpoly);
|
||||
mesh->mselect = newdataadr(fd, mesh->mselect);
|
||||
|
||||
/* animdata */
|
||||
|
@ -4589,12 +4588,6 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
|
|||
mesh->totselect = 0;
|
||||
}
|
||||
|
||||
if (mesh->mloopuv || mesh->mtpoly) {
|
||||
/* for now we have to ensure texpoly and mloopuv layers are aligned
|
||||
* in the future we may allow non-aligned layers */
|
||||
BKE_mesh_cd_validate(mesh);
|
||||
}
|
||||
|
||||
/* Multires data */
|
||||
mesh->mr= newdataadr(fd, mesh->mr);
|
||||
if (mesh->mr) {
|
||||
|
|
|
@ -98,42 +98,6 @@
|
|||
#include "bmesh.h"
|
||||
#include "intern/bmesh_private.h" /* for element checking */
|
||||
|
||||
/**
|
||||
* Currently this is only used for Python scripts
|
||||
* which may fail to keep matching UV/TexFace layers.
|
||||
*
|
||||
* \note This should only perform any changes in exceptional cases,
|
||||
* if we need this to be faster we could inline #BM_data_layer_add and only
|
||||
* call #update_data_blocks once at the end.
|
||||
*/
|
||||
void BM_mesh_cd_validate(BMesh *bm)
|
||||
{
|
||||
int totlayer_mtex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
|
||||
int totlayer_uv = CustomData_number_of_layers(&bm->ldata, CD_MLOOPUV);
|
||||
|
||||
if (LIKELY(totlayer_mtex == totlayer_uv)) {
|
||||
/* pass */
|
||||
}
|
||||
else if (totlayer_mtex < totlayer_uv) {
|
||||
const int uv_index_first = CustomData_get_layer_index(&bm->ldata, CD_MLOOPUV);
|
||||
do {
|
||||
const char *from_name = bm->ldata.layers[uv_index_first + totlayer_mtex].name;
|
||||
BM_data_layer_add_named(bm, &bm->pdata, CD_MTEXPOLY, from_name);
|
||||
CustomData_set_layer_unique_name(&bm->pdata, totlayer_mtex);
|
||||
} while (totlayer_uv != ++totlayer_mtex);
|
||||
}
|
||||
else if (totlayer_uv < totlayer_mtex) {
|
||||
const int mtex_index_first = CustomData_get_layer_index(&bm->pdata, CD_MTEXPOLY);
|
||||
do {
|
||||
const char *from_name = bm->pdata.layers[mtex_index_first + totlayer_uv].name;
|
||||
BM_data_layer_add_named(bm, &bm->ldata, CD_MLOOPUV, from_name);
|
||||
CustomData_set_layer_unique_name(&bm->ldata, totlayer_uv);
|
||||
} while (totlayer_mtex != ++totlayer_uv);
|
||||
}
|
||||
|
||||
BLI_assert(totlayer_mtex == totlayer_uv);
|
||||
}
|
||||
|
||||
void BM_mesh_cd_flag_ensure(BMesh *bm, Mesh *mesh, const char cd_flag)
|
||||
{
|
||||
const char cd_flag_all = BM_mesh_cd_flag_from_bmesh(bm) | cd_flag;
|
||||
|
@ -235,7 +199,7 @@ void BM_mesh_bm_from_me(
|
|||
BMEdge *e, **etable = NULL;
|
||||
BMFace *f;
|
||||
float (*keyco)[3] = NULL;
|
||||
int totuv, totloops, i, j;
|
||||
int totloops, i, j;
|
||||
|
||||
/* free custom data */
|
||||
/* this isnt needed in most cases but do just incase */
|
||||
|
@ -266,13 +230,6 @@ void BM_mesh_bm_from_me(
|
|||
CustomData_copy(&me->ldata, &bm->ldata, CD_MASK_BMESH, CD_CALLOC, 0);
|
||||
CustomData_copy(&me->pdata, &bm->pdata, CD_MASK_BMESH, CD_CALLOC, 0);
|
||||
|
||||
/* make sure uv layer names are consisten */
|
||||
totuv = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
|
||||
for (i = 0; i < totuv; i++) {
|
||||
int li = CustomData_get_layer_index_n(&bm->pdata, CD_MTEXPOLY, i);
|
||||
CustomData_set_layer_name(&bm->ldata, CD_MLOOPUV, i, bm->pdata.layers[li].name);
|
||||
}
|
||||
|
||||
if ((params->active_shapekey != 0) && (me->key != NULL)) {
|
||||
actkey = BLI_findlink(&me->key->block, params->active_shapekey - 1);
|
||||
}
|
||||
|
|
|
@ -472,11 +472,9 @@ void MeshImporter::allocate_poly_data(COLLADAFW::Mesh *collada_mesh, Mesh *me)
|
|||
COLLADAFW::MeshVertexData::InputInfos *info = collada_mesh->getUVCoords().getInputInfosArray()[i];
|
||||
COLLADAFW::String &uvname = info->mName;
|
||||
// Allocate space for UV_data
|
||||
CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DEFAULT, NULL, me->totpoly, uvname.c_str());
|
||||
CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_DEFAULT, NULL, me->totloop, uvname.c_str());
|
||||
}
|
||||
// activate the first uv map
|
||||
me->mtpoly = (MTexPoly *)CustomData_get_layer_n(&me->pdata, CD_MTEXPOLY, 0);
|
||||
me->mloopuv = (MLoopUV *) CustomData_get_layer_n(&me->ldata, CD_MLOOPUV, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -113,8 +113,8 @@ struct UvElementMap *BM_uv_element_map_create(
|
|||
void BM_uv_element_map_free(struct UvElementMap *vmap);
|
||||
struct UvElement *BM_uv_element_get(struct UvElementMap *map, struct BMFace *efa, struct BMLoop *l);
|
||||
|
||||
bool EDBM_mtexpoly_check(struct BMEditMesh *em);
|
||||
struct BMFace *EDBM_mtexpoly_active_get(struct BMEditMesh *em, const bool sloppy, const bool selected);
|
||||
bool EDBM_uv_check(struct BMEditMesh *em);
|
||||
struct BMFace *EDBM_uv_active_face_get(struct BMEditMesh *em, const bool sloppy, const bool selected);
|
||||
|
||||
void BM_uv_vert_map_free(struct UvVertMap *vmap);
|
||||
struct UvMapVert *BM_uv_vert_map_at_index(struct UvVertMap *vmap, unsigned int v);
|
||||
|
|
|
@ -601,7 +601,6 @@ UvVertMap *BM_uv_vert_map_create(
|
|||
newvlist = v;
|
||||
|
||||
efa = BM_face_at_index(bm, v->f);
|
||||
/* tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY); */ /* UNUSED */
|
||||
|
||||
l = BM_iter_at_index(bm, BM_LOOPS_OF_FACE, efa, v->tfindex);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
|
@ -613,7 +612,6 @@ UvVertMap *BM_uv_vert_map_create(
|
|||
while (iterv) {
|
||||
next = iterv->next;
|
||||
efa = BM_face_at_index(bm, iterv->f);
|
||||
/* tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY); */ /* UNUSED */
|
||||
|
||||
l = BM_iter_at_index(bm, BM_LOOPS_OF_FACE, efa, iterv->tfindex);
|
||||
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
|
||||
|
@ -928,11 +926,11 @@ UvElement *BM_uv_element_get(UvElementMap *map, BMFace *efa, BMLoop *l)
|
|||
|
||||
/* last_sel, use em->act_face otherwise get the last selected face in the editselections
|
||||
* at the moment, last_sel is mainly useful for making sure the space image dosnt flicker */
|
||||
BMFace *EDBM_mtexpoly_active_get(BMEditMesh *em, const bool sloppy, const bool selected)
|
||||
BMFace *EDBM_uv_active_face_get(BMEditMesh *em, const bool sloppy, const bool selected)
|
||||
{
|
||||
BMFace *efa = NULL;
|
||||
|
||||
if (!EDBM_mtexpoly_check(em))
|
||||
if (!EDBM_uv_check(em))
|
||||
return NULL;
|
||||
|
||||
efa = BM_mesh_active_face_get(em->bm, sloppy, selected);
|
||||
|
@ -945,10 +943,10 @@ BMFace *EDBM_mtexpoly_active_get(BMEditMesh *em, const bool sloppy, const bool s
|
|||
}
|
||||
|
||||
/* can we edit UV's for this mesh?*/
|
||||
bool EDBM_mtexpoly_check(BMEditMesh *em)
|
||||
bool EDBM_uv_check(BMEditMesh *em)
|
||||
{
|
||||
/* some of these checks could be a touch overkill */
|
||||
return em && em->bm->totface && CustomData_has_layer(&em->bm->pdata, CD_MTEXPOLY) &&
|
||||
return em && em->bm->totface &&
|
||||
CustomData_has_layer(&em->bm->ldata, CD_MLOOPUV);
|
||||
}
|
||||
|
||||
|
|
|
@ -251,8 +251,8 @@ void ED_mesh_uv_loop_reset_ex(struct Mesh *me, const int layernum)
|
|||
void ED_mesh_uv_loop_reset(struct bContext *C, struct Mesh *me)
|
||||
{
|
||||
/* could be ldata or pdata */
|
||||
CustomData *pdata = GET_CD_DATA(me, pdata);
|
||||
const int layernum = CustomData_get_active_layer_index(pdata, CD_MTEXPOLY);
|
||||
CustomData *ldata = GET_CD_DATA(me, ldata);
|
||||
const int layernum = CustomData_get_active_layer_index(ldata, CD_MLOOPUV);
|
||||
ED_mesh_uv_loop_reset_ex(me, layernum);
|
||||
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_DATA, me);
|
||||
|
@ -269,21 +269,10 @@ int ED_mesh_uv_texture_add(Mesh *me, const char *name, const bool active_set)
|
|||
if (me->edit_btmesh) {
|
||||
em = me->edit_btmesh;
|
||||
|
||||
layernum_dst = CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY);
|
||||
layernum_dst = CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPUV);
|
||||
if (layernum_dst >= MAX_MTFACE)
|
||||
return -1;
|
||||
|
||||
/* CD_MTEXPOLY */
|
||||
BM_data_layer_add_named(em->bm, &em->bm->pdata, CD_MTEXPOLY, name);
|
||||
/* copy data from active UV */
|
||||
if (layernum_dst) {
|
||||
const int layernum_src = CustomData_get_active_layer(&em->bm->pdata, CD_MTEXPOLY);
|
||||
BM_data_layer_copy(em->bm, &em->bm->pdata, CD_MTEXPOLY, layernum_src, layernum_dst);
|
||||
}
|
||||
if (active_set || layernum_dst == 0) {
|
||||
CustomData_set_layer_active(&em->bm->pdata, CD_MTEXPOLY, layernum_dst);
|
||||
}
|
||||
|
||||
/* CD_MLOOPUV */
|
||||
BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_MLOOPUV, name);
|
||||
/* copy data from active UV */
|
||||
|
@ -298,26 +287,22 @@ int ED_mesh_uv_texture_add(Mesh *me, const char *name, const bool active_set)
|
|||
}
|
||||
}
|
||||
else {
|
||||
layernum_dst = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
|
||||
layernum_dst = CustomData_number_of_layers(&me->ldata, CD_MLOOPUV);
|
||||
if (layernum_dst >= MAX_MTFACE)
|
||||
return -1;
|
||||
|
||||
if (me->mtpoly) {
|
||||
CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DUPLICATE, me->mtpoly, me->totpoly, name);
|
||||
if (me->mloopuv) {
|
||||
CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_DUPLICATE, me->mloopuv, me->totloop, name);
|
||||
CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DUPLICATE, me->mtface, me->totface, name);
|
||||
is_init = true;
|
||||
}
|
||||
else {
|
||||
CustomData_add_layer_named(&me->pdata, CD_MTEXPOLY, CD_DEFAULT, NULL, me->totpoly, name);
|
||||
CustomData_add_layer_named(&me->ldata, CD_MLOOPUV, CD_DEFAULT, NULL, me->totloop, name);
|
||||
CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface, name);
|
||||
}
|
||||
|
||||
if (active_set || layernum_dst == 0) {
|
||||
CustomData_set_layer_active(&me->pdata, CD_MTEXPOLY, layernum_dst);
|
||||
CustomData_set_layer_active(&me->ldata, CD_MLOOPUV, layernum_dst);
|
||||
|
||||
CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum_dst);
|
||||
}
|
||||
|
||||
|
@ -343,12 +328,12 @@ void ED_mesh_uv_texture_ensure(struct Mesh *me, const char *name)
|
|||
if (me->edit_btmesh) {
|
||||
em = me->edit_btmesh;
|
||||
|
||||
layernum_dst = CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY);
|
||||
layernum_dst = CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPUV);
|
||||
if (layernum_dst == 0)
|
||||
ED_mesh_uv_texture_add(me, name, true);
|
||||
}
|
||||
else {
|
||||
layernum_dst = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
|
||||
layernum_dst = CustomData_number_of_layers(&me->ldata, CD_MLOOPUV);
|
||||
if (layernum_dst == 0)
|
||||
ED_mesh_uv_texture_add(me, name, true);
|
||||
}
|
||||
|
@ -357,20 +342,16 @@ void ED_mesh_uv_texture_ensure(struct Mesh *me, const char *name)
|
|||
|
||||
bool ED_mesh_uv_texture_remove_index(Mesh *me, const int n)
|
||||
{
|
||||
CustomData *pdata = GET_CD_DATA(me, pdata), *ldata = GET_CD_DATA(me, ldata);
|
||||
CustomDataLayer *cdlp, *cdlu;
|
||||
CustomData *ldata = GET_CD_DATA(me, ldata);
|
||||
CustomDataLayer *cdlu;
|
||||
int index;
|
||||
|
||||
index = CustomData_get_layer_index_n(pdata, CD_MTEXPOLY, n);
|
||||
cdlp = (index == -1) ? NULL : &pdata->layers[index];
|
||||
|
||||
index = CustomData_get_layer_index_n(ldata, CD_MLOOPUV, n);
|
||||
cdlu = (index == -1) ? NULL : &ldata->layers[index];
|
||||
|
||||
if (!cdlp || !cdlu)
|
||||
if (!cdlu)
|
||||
return false;
|
||||
|
||||
delete_customdata_layer(me, cdlp);
|
||||
delete_customdata_layer(me, cdlu);
|
||||
|
||||
DAG_id_tag_update(&me->id, 0);
|
||||
|
@ -381,14 +362,8 @@ bool ED_mesh_uv_texture_remove_index(Mesh *me, const int n)
|
|||
bool ED_mesh_uv_texture_remove_active(Mesh *me)
|
||||
{
|
||||
/* texpoly/uv are assumed to be in sync */
|
||||
CustomData *pdata = GET_CD_DATA(me, pdata);
|
||||
const int n = CustomData_get_active_layer(pdata, CD_MTEXPOLY);
|
||||
|
||||
/* double check active layers align! */
|
||||
#ifdef DEBUG
|
||||
CustomData *ldata = GET_CD_DATA(me, ldata);
|
||||
BLI_assert(CustomData_get_active_layer(ldata, CD_MLOOPUV) == n);
|
||||
#endif
|
||||
const int n = CustomData_get_active_layer(ldata, CD_MLOOPUV);
|
||||
|
||||
if (n != -1) {
|
||||
return ED_mesh_uv_texture_remove_index(me, n);
|
||||
|
@ -400,8 +375,8 @@ bool ED_mesh_uv_texture_remove_active(Mesh *me)
|
|||
bool ED_mesh_uv_texture_remove_named(Mesh *me, const char *name)
|
||||
{
|
||||
/* texpoly/uv are assumed to be in sync */
|
||||
CustomData *pdata = GET_CD_DATA(me, pdata);
|
||||
const int n = CustomData_get_named_layer(pdata, CD_MTEXPOLY, name);
|
||||
CustomData *ldata = GET_CD_DATA(me, ldata);
|
||||
const int n = CustomData_get_named_layer(ldata, CD_MLOOPUV, name);
|
||||
if (n != -1) {
|
||||
return ED_mesh_uv_texture_remove_index(me, n);
|
||||
}
|
||||
|
@ -1292,7 +1267,6 @@ void ED_mesh_calc_tessface(Mesh *mesh, bool free_mpoly)
|
|||
mesh->mloopcol = NULL;
|
||||
mesh->mloopuv = NULL;
|
||||
mesh->mpoly = NULL;
|
||||
mesh->mtpoly = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -158,7 +158,7 @@ static bool multiresbake_check(bContext *C, wmOperator *op)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!me->mtpoly) {
|
||||
if (!me->mloopuv) {
|
||||
BKE_report(op->reports, RPT_ERROR, "Mesh should be unwrapped before multires data baking");
|
||||
|
||||
ok = false;
|
||||
|
|
|
@ -135,19 +135,19 @@ static EnumPropertyItem *dt_layers_select_src_itemf(
|
|||
|
||||
if (ob_src) {
|
||||
DerivedMesh *dm_src;
|
||||
CustomData *pdata;
|
||||
CustomData *ldata;
|
||||
int num_data, i;
|
||||
|
||||
/* XXX Is this OK? */
|
||||
dm_src = mesh_get_derived_final(scene, ob_src, CD_MASK_BAREMESH | CD_MTEXPOLY);
|
||||
pdata = dm_src->getPolyDataLayout(dm_src);
|
||||
num_data = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
|
||||
dm_src = mesh_get_derived_final(scene, ob_src, CD_MASK_BAREMESH | CD_MLOOPUV);
|
||||
ldata = dm_src->getLoopDataLayout(dm_src);
|
||||
num_data = CustomData_number_of_layers(ldata, CD_MLOOPUV);
|
||||
|
||||
RNA_enum_item_add_separator(&item, &totitem);
|
||||
|
||||
for (i = 0; i < num_data; i++) {
|
||||
tmp_item.value = i;
|
||||
tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(pdata, CD_MTEXPOLY, i);
|
||||
tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(ldata, CD_MLOOPUV, i);
|
||||
RNA_enum_item_add(&item, &totitem, &tmp_item);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3487,7 +3487,7 @@ static void proj_paint_layer_clone_init(
|
|||
|
||||
/* use clone mtface? */
|
||||
if (ps->do_layer_clone) {
|
||||
const int layer_num = CustomData_get_clone_layer(&((Mesh *)ps->ob->data)->pdata, CD_MTEXPOLY);
|
||||
const int layer_num = CustomData_get_clone_layer(&((Mesh *)ps->ob->data)->ldata, CD_MLOOPUV);
|
||||
|
||||
ps->dm_mloopuv_clone = MEM_mallocN(ps->dm_totpoly * sizeof(MLoopUV *), "proj_paint_mtfaces");
|
||||
|
||||
|
@ -3846,7 +3846,7 @@ static void project_paint_begin(
|
|||
|
||||
if (ps->do_layer_stencil || ps->do_stencil_brush) {
|
||||
//int layer_num = CustomData_get_stencil_layer(&ps->dm->loopData, CD_MLOOPUV);
|
||||
int layer_num = CustomData_get_stencil_layer(&((Mesh *)ps->ob->data)->pdata, CD_MTEXPOLY);
|
||||
int layer_num = CustomData_get_stencil_layer(&((Mesh *)ps->ob->data)->ldata, CD_MLOOPUV);
|
||||
if (layer_num != -1)
|
||||
ps->dm_mloopuv_stencil = CustomData_get_layer_n(&ps->dm->loopData, CD_MLOOPUV, layer_num);
|
||||
|
||||
|
@ -5590,7 +5590,7 @@ bool BKE_paint_proj_mesh_data_check(Scene *scene, Object *ob, bool *uvs, bool *m
|
|||
}
|
||||
|
||||
me = BKE_mesh_from_object(ob);
|
||||
layernum = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
|
||||
layernum = CustomData_number_of_layers(&me->ldata, CD_MLOOPUV);
|
||||
|
||||
if (layernum == 0) {
|
||||
hasuvs = false;
|
||||
|
|
|
@ -173,7 +173,7 @@ static int uv_sculpt_brush_poll_do(bContext *C, const bool check_region)
|
|||
}
|
||||
|
||||
em = BKE_editmesh_from_object(obedit);
|
||||
ret = EDBM_mtexpoly_check(em);
|
||||
ret = EDBM_uv_check(em);
|
||||
|
||||
if (ret) {
|
||||
ARegion *ar = CTX_wm_region(C);
|
||||
|
|
|
@ -365,7 +365,7 @@ bool ED_space_image_show_uvedit(SpaceImage *sima, Object *obedit)
|
|||
struct BMEditMesh *em = BKE_editmesh_from_object(obedit);
|
||||
bool ret;
|
||||
|
||||
ret = EDBM_mtexpoly_check(em);
|
||||
ret = EDBM_uv_check(em);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -427,7 +427,7 @@ static void image_refresh(const bContext *C, ScrArea *sa)
|
|||
}
|
||||
else {
|
||||
/* old shading system, we set texface */
|
||||
if (em && EDBM_mtexpoly_check(em)) {
|
||||
if (em && EDBM_uv_check(em)) {
|
||||
BMFace *efa = BM_mesh_active_face_get(em->bm, sloppy, selected);
|
||||
|
||||
if (efa) {
|
||||
|
|
|
@ -748,7 +748,7 @@ static void node_shader_buts_geometry(uiLayout *layout, bContext *C, PointerRNA
|
|||
if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
|
||||
PointerRNA dataptr = RNA_pointer_get(&obptr, "data");
|
||||
|
||||
uiItemPointerR(col, ptr, "uv_layer", &dataptr, "uv_textures", "", ICON_NONE);
|
||||
uiItemPointerR(col, ptr, "uv_layer", &dataptr, "uv_layers", "", ICON_NONE);
|
||||
uiItemPointerR(col, ptr, "color_layer", &dataptr, "vertex_colors", "", ICON_NONE);
|
||||
}
|
||||
else {
|
||||
|
@ -966,7 +966,7 @@ static void node_shader_buts_uvmap(uiLayout *layout, bContext *C, PointerRNA *pt
|
|||
|
||||
if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
|
||||
PointerRNA dataptr = RNA_pointer_get(&obptr, "data");
|
||||
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_textures", "", ICON_NONE);
|
||||
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_NONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -985,7 +985,7 @@ static void node_shader_buts_normal_map(uiLayout *layout, bContext *C, PointerRN
|
|||
|
||||
if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
|
||||
PointerRNA dataptr = RNA_pointer_get(&obptr, "data");
|
||||
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_textures", "", ICON_NONE);
|
||||
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_NONE);
|
||||
}
|
||||
else
|
||||
uiItemR(layout, ptr, "uv_map", 0, "", 0);
|
||||
|
@ -1007,7 +1007,7 @@ static void node_shader_buts_tangent(uiLayout *layout, bContext *C, PointerRNA *
|
|||
|
||||
if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
|
||||
PointerRNA dataptr = RNA_pointer_get(&obptr, "data");
|
||||
uiItemPointerR(row, ptr, "uv_map", &dataptr, "uv_textures", "", ICON_NONE);
|
||||
uiItemPointerR(row, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_NONE);
|
||||
}
|
||||
else
|
||||
uiItemR(row, ptr, "uv_map", 0, "", 0);
|
||||
|
|
|
@ -1454,7 +1454,7 @@ CustomDataMask ED_view3d_datamask(const Scene *scene, const View3D *v3d)
|
|||
if (ELEM(drawtype, OB_TEXTURE, OB_MATERIAL) ||
|
||||
((drawtype == OB_SOLID) && (v3d->flag2 & V3D_SOLID_TEX)))
|
||||
{
|
||||
mask |= CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL;
|
||||
mask |= CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL;
|
||||
|
||||
if (BKE_scene_use_new_shading_nodes(scene)) {
|
||||
if (drawtype == OB_MATERIAL)
|
||||
|
|
|
@ -624,7 +624,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, SceneLayer *sl, Object *obe
|
|||
|
||||
unsigned int pos;
|
||||
|
||||
efa_act = EDBM_mtexpoly_active_get(em, false, false); /* will be set to NULL if hidden */
|
||||
efa_act = EDBM_uv_active_face_get(em, false, false); /* will be set to NULL if hidden */
|
||||
ts = scene->toolsettings;
|
||||
|
||||
drawfaces = draw_uvs_face_check(scene);
|
||||
|
@ -1039,7 +1039,7 @@ static void draw_uv_shadows_get(SpaceImage *sima, Object *ob, Object *obedit, bo
|
|||
if ((sima->mode == SI_MODE_PAINT) && obedit && obedit->type == OB_MESH) {
|
||||
struct BMEditMesh *em = BKE_editmesh_from_object(obedit);
|
||||
|
||||
*show_shadow = EDBM_mtexpoly_check(em);
|
||||
*show_shadow = EDBM_uv_check(em);
|
||||
}
|
||||
|
||||
*show_texpaint = (ob && ob->type == OB_MESH && ob->mode == OB_MODE_TEXTURE_PAINT);
|
||||
|
|
|
@ -106,7 +106,7 @@ bool ED_uvedit_test(Object *obedit)
|
|||
return 0;
|
||||
|
||||
em = BKE_editmesh_from_object(obedit);
|
||||
ret = EDBM_mtexpoly_check(em);
|
||||
ret = EDBM_uv_check(em);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -218,11 +218,10 @@ void ED_uvedit_assign_image(Main *UNUSED(bmain), Scene *scene, Object *obedit, I
|
|||
#endif
|
||||
|
||||
/* ensure we have a uv map */
|
||||
if (!CustomData_has_layer(&em->bm->pdata, CD_MTEXPOLY)) {
|
||||
BM_data_layer_add(em->bm, &em->bm->pdata, CD_MTEXPOLY);
|
||||
if (!CustomData_has_layer(&em->bm->ldata, CD_MLOOPUV)) {
|
||||
BM_data_layer_add(em->bm, &em->bm->ldata, CD_MLOOPUV);
|
||||
/* make UVs all nice 0-1 */
|
||||
ED_mesh_uv_loop_reset_ex(obedit->data, CustomData_get_active_layer_index(&em->bm->pdata, CD_MTEXPOLY));
|
||||
ED_mesh_uv_loop_reset_ex(obedit->data, CustomData_get_active_layer_index(&em->bm->ldata, CD_MLOOPUV));
|
||||
update = true;
|
||||
}
|
||||
|
||||
|
@ -3828,7 +3827,7 @@ static int uv_seams_from_islands_exec(bContext *C, wmOperator *op)
|
|||
em = me->edit_btmesh;
|
||||
bm = em->bm;
|
||||
|
||||
if (!EDBM_mtexpoly_check(em)) {
|
||||
if (!EDBM_uv_check(em)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
|
|
|
@ -117,7 +117,7 @@ static bool ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
|
|||
if (ED_uvedit_test(obedit))
|
||||
return 1;
|
||||
|
||||
if (em && em->bm->totface && !CustomData_has_layer(&em->bm->pdata, CD_MTEXPOLY))
|
||||
if (em && em->bm->totface && !CustomData_has_layer(&em->bm->ldata, CD_MLOOPUV))
|
||||
ED_mesh_uv_texture_add(obedit->data, NULL, true);
|
||||
|
||||
if (!ED_uvedit_test(obedit))
|
||||
|
@ -1632,8 +1632,6 @@ void ED_uvedit_unwrap_cube_project(Object *ob, BMesh *bm, float cube_size, bool
|
|||
|
||||
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
|
||||
int first = 1;
|
||||
|
||||
/* tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); */ /* UNUSED */
|
||||
if (use_select && !BM_elem_flag_test(efa, BM_ELEM_SELECT))
|
||||
continue;
|
||||
|
||||
|
|
|
@ -702,17 +702,13 @@ void BlenderStrokeRenderer::GenerateStrokeMesh(StrokeGroup *group, bool hasTex)
|
|||
|
||||
if (hasTex) {
|
||||
// First UV layer
|
||||
CustomData_add_layer_named(&mesh->pdata, CD_MTEXPOLY, CD_CALLOC, NULL, mesh->totpoly, uvNames[0]);
|
||||
CustomData_add_layer_named(&mesh->ldata, CD_MLOOPUV, CD_CALLOC, NULL, mesh->totloop, uvNames[0]);
|
||||
CustomData_set_layer_active(&mesh->pdata, CD_MTEXPOLY, 0);
|
||||
CustomData_set_layer_active(&mesh->ldata, CD_MLOOPUV, 0);
|
||||
BKE_mesh_update_customdata_pointers(mesh, true);
|
||||
loopsuv[0] = mesh->mloopuv;
|
||||
|
||||
// Second UV layer
|
||||
CustomData_add_layer_named(&mesh->pdata, CD_MTEXPOLY, CD_CALLOC, NULL, mesh->totpoly, uvNames[1]);
|
||||
CustomData_add_layer_named(&mesh->ldata, CD_MLOOPUV, CD_CALLOC, NULL, mesh->totloop, uvNames[1]);
|
||||
CustomData_set_layer_active(&mesh->pdata, CD_MTEXPOLY, 1);
|
||||
CustomData_set_layer_active(&mesh->ldata, CD_MLOOPUV, 1);
|
||||
BKE_mesh_update_customdata_pointers(mesh, true);
|
||||
loopsuv[1] = mesh->mloopuv;
|
||||
|
|
|
@ -98,7 +98,7 @@ typedef enum CustomDataType {
|
|||
CD_PROP_STR = 12,
|
||||
CD_ORIGSPACE = 13, /* for modifier stack face location mapping */
|
||||
CD_ORCO = 14,
|
||||
CD_MTEXPOLY = 15,
|
||||
/* CD_MTEXPOLY = 15, */ /* deprecated */
|
||||
CD_MLOOPUV = 16,
|
||||
CD_MLOOPCOL = 17,
|
||||
CD_TANGENT = 18,
|
||||
|
@ -149,7 +149,7 @@ typedef enum CustomDataType {
|
|||
#define CD_MASK_PROP_STR (1 << CD_PROP_STR)
|
||||
#define CD_MASK_ORIGSPACE (1 << CD_ORIGSPACE)
|
||||
#define CD_MASK_ORCO (1 << CD_ORCO)
|
||||
#define CD_MASK_MTEXPOLY (1 << CD_MTEXPOLY)
|
||||
// #define CD_MASK_MTEXPOLY (1 << CD_MTEXPOLY) /* DEPRECATED */
|
||||
#define CD_MASK_MLOOPUV (1 << CD_MLOOPUV)
|
||||
#define CD_MASK_MLOOPCOL (1 << CD_MLOOPCOL)
|
||||
#define CD_MASK_TANGENT (1 << CD_TANGENT)
|
||||
|
|
|
@ -66,7 +66,6 @@ typedef struct Mesh {
|
|||
/* BMESH ONLY */
|
||||
/*new face structures*/
|
||||
struct MPoly *mpoly;
|
||||
struct MTexPoly *mtpoly;
|
||||
struct MLoop *mloop;
|
||||
struct MLoopUV *mloopuv;
|
||||
struct MLoopCol *mloopcol;
|
||||
|
|
|
@ -186,10 +186,9 @@ typedef struct MVertTri {
|
|||
unsigned int tri[3];
|
||||
} MVertTri;
|
||||
|
||||
|
||||
typedef struct MTexPoly {
|
||||
void *pad;
|
||||
} MTexPoly;
|
||||
//typedef struct MTexPoly {
|
||||
// void *pad;
|
||||
//} MTexPoly;
|
||||
|
||||
typedef struct MLoopUV {
|
||||
float uv[2];
|
||||
|
|
|
@ -767,13 +767,6 @@ static void rna_CustomDataLayer_active_set(PointerRNA *ptr, CustomData *data, in
|
|||
if (render) CustomData_set_layer_render(data, type, n);
|
||||
else CustomData_set_layer_active(data, type, n);
|
||||
|
||||
/* sync loop layer */
|
||||
if (type == CD_MTEXPOLY) {
|
||||
CustomData *ldata = rna_mesh_ldata(ptr);
|
||||
if (render) CustomData_set_layer_render(ldata, CD_MLOOPUV, n);
|
||||
else CustomData_set_layer_active(ldata, CD_MLOOPUV, n);
|
||||
}
|
||||
|
||||
BKE_mesh_update_customdata_pointers(me, true);
|
||||
}
|
||||
|
||||
|
@ -878,6 +871,36 @@ static int rna_MeshUVLoopLayer_data_length(PointerRNA *ptr)
|
|||
return (me->edit_btmesh) ? 0 : me->totloop;
|
||||
}
|
||||
|
||||
static int rna_MeshUVLoopLayer_active_render_get(PointerRNA *ptr)
|
||||
{
|
||||
return rna_CustomDataLayer_active_get(ptr, rna_mesh_ldata(ptr), CD_MLOOPUV, 1);
|
||||
}
|
||||
|
||||
static int rna_MeshUVLoopLayer_active_get(PointerRNA *ptr)
|
||||
{
|
||||
return rna_CustomDataLayer_active_get(ptr, rna_mesh_ldata(ptr), CD_MLOOPUV, 0);
|
||||
}
|
||||
|
||||
static int rna_MeshUVLoopLayer_clone_get(PointerRNA *ptr)
|
||||
{
|
||||
return rna_CustomDataLayer_clone_get(ptr, rna_mesh_ldata(ptr), CD_MLOOPUV);
|
||||
}
|
||||
|
||||
static void rna_MeshUVLoopLayer_active_render_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
rna_CustomDataLayer_active_set(ptr, rna_mesh_ldata(ptr), value, CD_MLOOPUV, 1);
|
||||
}
|
||||
|
||||
static void rna_MeshUVLoopLayer_active_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
rna_CustomDataLayer_active_set(ptr, rna_mesh_ldata(ptr), value, CD_MLOOPUV, 0);
|
||||
}
|
||||
|
||||
static void rna_MeshUVLoopLayer_clone_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
rna_CustomDataLayer_clone_set(ptr, rna_mesh_ldata(ptr), value, CD_MLOOPUV);
|
||||
}
|
||||
|
||||
/* face uv_textures */
|
||||
|
||||
DEFINE_CUSTOMDATA_LAYER_COLLECTION(tessface_uv_texture, fdata, CD_MTFACE)
|
||||
|
@ -929,57 +952,6 @@ static void rna_MeshTextureFaceLayer_clone_set(PointerRNA *ptr, int value)
|
|||
rna_CustomDataLayer_clone_set(ptr, rna_mesh_fdata(ptr), value, CD_MTFACE);
|
||||
}
|
||||
|
||||
/* poly uv_textures */
|
||||
|
||||
DEFINE_CUSTOMDATA_LAYER_COLLECTION(uv_texture, pdata, CD_MTEXPOLY)
|
||||
DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(uv_texture, pdata, CD_MTEXPOLY, active, MeshTexturePolyLayer)
|
||||
DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(uv_texture, pdata, CD_MTEXPOLY, clone, MeshTexturePolyLayer)
|
||||
DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(uv_texture, pdata, CD_MTEXPOLY, stencil, MeshTexturePolyLayer)
|
||||
DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(uv_texture, pdata, CD_MTEXPOLY, render, MeshTexturePolyLayer)
|
||||
|
||||
static void rna_MeshTexturePolyLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
||||
{
|
||||
Mesh *me = rna_mesh(ptr);
|
||||
CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
|
||||
rna_iterator_array_begin(iter, layer->data, sizeof(MTexPoly), (me->edit_btmesh) ? 0 : me->totpoly, 0, NULL);
|
||||
}
|
||||
|
||||
static int rna_MeshTexturePolyLayer_data_length(PointerRNA *ptr)
|
||||
{
|
||||
Mesh *me = rna_mesh(ptr);
|
||||
return (me->edit_btmesh) ? 0 : me->totpoly;
|
||||
}
|
||||
|
||||
static int rna_MeshTexturePolyLayer_active_render_get(PointerRNA *ptr)
|
||||
{
|
||||
return rna_CustomDataLayer_active_get(ptr, rna_mesh_pdata(ptr), CD_MTEXPOLY, 1);
|
||||
}
|
||||
|
||||
static int rna_MeshTexturePolyLayer_active_get(PointerRNA *ptr)
|
||||
{
|
||||
return rna_CustomDataLayer_active_get(ptr, rna_mesh_pdata(ptr), CD_MTEXPOLY, 0);
|
||||
}
|
||||
|
||||
static int rna_MeshTexturePolyLayer_clone_get(PointerRNA *ptr)
|
||||
{
|
||||
return rna_CustomDataLayer_clone_get(ptr, rna_mesh_pdata(ptr), CD_MTEXPOLY);
|
||||
}
|
||||
|
||||
static void rna_MeshTexturePolyLayer_active_render_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
rna_CustomDataLayer_active_set(ptr, rna_mesh_pdata(ptr), value, CD_MTEXPOLY, 1);
|
||||
}
|
||||
|
||||
static void rna_MeshTexturePolyLayer_active_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
rna_CustomDataLayer_active_set(ptr, rna_mesh_pdata(ptr), value, CD_MTEXPOLY, 0);
|
||||
}
|
||||
|
||||
static void rna_MeshTexturePolyLayer_clone_set(PointerRNA *ptr, int value)
|
||||
{
|
||||
rna_CustomDataLayer_clone_set(ptr, rna_mesh_pdata(ptr), value, CD_MTEXPOLY);
|
||||
}
|
||||
|
||||
/* vertex_color_layers */
|
||||
|
||||
DEFINE_CUSTOMDATA_LAYER_COLLECTION(tessface_vertex_color, fdata, CD_MCOL)
|
||||
|
@ -1353,14 +1325,6 @@ static char *rna_MeshTextureFaceLayer_path(PointerRNA *ptr)
|
|||
return BLI_sprintfN("tessface_uv_textures[\"%s\"]", name_esc);
|
||||
}
|
||||
|
||||
static char *rna_MeshTexturePolyLayer_path(PointerRNA *ptr)
|
||||
{
|
||||
CustomDataLayer *cdl = ptr->data;
|
||||
char name_esc[sizeof(cdl->name) * 2];
|
||||
BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
|
||||
return BLI_sprintfN("uv_textures[\"%s\"]", name_esc);
|
||||
}
|
||||
|
||||
static char *rna_VertCustomData_data_path(PointerRNA *ptr, const char *collection, int type)
|
||||
{
|
||||
CustomDataLayer *cdl;
|
||||
|
@ -1456,11 +1420,6 @@ static char *rna_MeshTextureFace_path(PointerRNA *ptr)
|
|||
return rna_FaceCustomData_data_path(ptr, "tessface_uv_textures", CD_MTFACE);
|
||||
}
|
||||
|
||||
static char *rna_MeshTexturePoly_path(PointerRNA *ptr)
|
||||
{
|
||||
return rna_PolyCustomData_data_path(ptr, "uv_textures", CD_MTEXPOLY);
|
||||
}
|
||||
|
||||
static char *rna_MeshColorLayer_path(PointerRNA *ptr)
|
||||
{
|
||||
CustomDataLayer *cdl = ptr->data;
|
||||
|
@ -1741,23 +1700,23 @@ DEFINE_CUSTOMDATA_PROPERTY_API(polygon, int, CD_PROP_INT, pdata, totpoly, MeshPo
|
|||
DEFINE_CUSTOMDATA_PROPERTY_API(polygon, string, CD_PROP_STR, pdata, totpoly, MeshPolygonStringPropertyLayer)
|
||||
#undef DEFINE_CUSTOMDATA_PROPERTY_API
|
||||
|
||||
static PointerRNA rna_Mesh_uv_texture_new(struct Mesh *me, const char *name)
|
||||
static PointerRNA rna_Mesh_uv_layers_new(struct Mesh *me, const char *name)
|
||||
{
|
||||
PointerRNA ptr;
|
||||
CustomData *pdata;
|
||||
CustomData *ldata;
|
||||
CustomDataLayer *cdl = NULL;
|
||||
int index = ED_mesh_uv_texture_add(me, name, false);
|
||||
|
||||
if (index != -1) {
|
||||
pdata = rna_mesh_pdata_helper(me);
|
||||
cdl = &pdata->layers[CustomData_get_layer_index_n(pdata, CD_MTEXPOLY, index)];
|
||||
ldata = rna_mesh_ldata_helper(me);
|
||||
cdl = &ldata->layers[CustomData_get_layer_index_n(ldata, CD_MLOOPUV, index)];
|
||||
}
|
||||
|
||||
RNA_pointer_create(&me->id, &RNA_MeshTexturePolyLayer, cdl, &ptr);
|
||||
RNA_pointer_create(&me->id, &RNA_MeshUVLoopLayer, cdl, &ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static void rna_Mesh_uv_texture_layers_remove(struct Mesh *me, ReportList *reports, CustomDataLayer *layer)
|
||||
static void rna_Mesh_uv_layers_remove(struct Mesh *me, ReportList *reports, CustomDataLayer *layer)
|
||||
{
|
||||
if (ED_mesh_uv_texture_remove_named(me, layer->name) == false) {
|
||||
BKE_reportf(reports, RPT_ERROR, "Texture layer '%s' not found", layer->name);
|
||||
|
@ -1832,10 +1791,6 @@ static void UNUSED_FUNCTION(rna_mesh_unused)(void)
|
|||
(void)rna_Mesh_uv_layer_render_index_get;
|
||||
(void)rna_Mesh_uv_layer_render_index_set;
|
||||
(void)rna_Mesh_uv_layer_render_set;
|
||||
(void)rna_Mesh_uv_texture_render_get;
|
||||
(void)rna_Mesh_uv_texture_render_index_get;
|
||||
(void)rna_Mesh_uv_texture_render_index_set;
|
||||
(void)rna_Mesh_uv_texture_render_set;
|
||||
(void)rna_Mesh_vertex_color_render_get;
|
||||
(void)rna_Mesh_vertex_color_render_index_get;
|
||||
(void)rna_Mesh_vertex_color_render_index_set;
|
||||
|
@ -2237,6 +2192,24 @@ static void rna_def_mloopuv(BlenderRNA *brna)
|
|||
RNA_def_property_ui_text(prop, "Name", "Name of UV map");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_funcs(prop, "rna_MeshUVLoopLayer_active_get", "rna_MeshUVLoopLayer_active_set");
|
||||
RNA_def_property_ui_text(prop, "Active", "Set the map as active for display and editing");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
prop = RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0);
|
||||
RNA_def_property_boolean_funcs(prop, "rna_MeshUVLoopLayer_active_render_get",
|
||||
"rna_MeshUVLoopLayer_active_render_set");
|
||||
RNA_def_property_ui_text(prop, "Active Render", "Set the map as active for rendering");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
prop = RNA_def_property(srna, "active_clone", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "active_clone", 0);
|
||||
RNA_def_property_boolean_funcs(prop, "rna_MeshUVLoopLayer_clone_get", "rna_MeshUVLoopLayer_clone_set");
|
||||
RNA_def_property_ui_text(prop, "Active Clone", "Set the map as active for cloning");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
srna = RNA_def_struct(brna, "MeshUVLoop", NULL);
|
||||
RNA_def_struct_sdna(srna, "MLoopUV");
|
||||
RNA_def_struct_path_func(srna, "rna_MeshUVLoop_path");
|
||||
|
@ -2360,65 +2333,6 @@ static void rna_def_mtface(BlenderRNA *brna)
|
|||
|
||||
}
|
||||
|
||||
static void rna_def_mtexpoly(BlenderRNA *brna)
|
||||
{
|
||||
StructRNA *srna;
|
||||
PropertyRNA *prop;
|
||||
#if 0 /* BMESH_TODO: needed later when do another todo */
|
||||
int uv_dim[] = {4, 2};
|
||||
#endif
|
||||
|
||||
srna = RNA_def_struct(brna, "MeshTexturePolyLayer", NULL);
|
||||
RNA_def_struct_ui_text(srna, "Mesh UV Map", "UV map with assigned image textures in a Mesh data-block");
|
||||
RNA_def_struct_sdna(srna, "CustomDataLayer");
|
||||
RNA_def_struct_path_func(srna, "rna_MeshTexturePolyLayer_path");
|
||||
RNA_def_struct_ui_icon(srna, ICON_GROUP_UVS);
|
||||
|
||||
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
|
||||
RNA_def_struct_name_property(srna, prop);
|
||||
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshUVLayer_name_set");
|
||||
RNA_def_property_ui_text(prop, "Name", "Name of UV map");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_funcs(prop, "rna_MeshTexturePolyLayer_active_get", "rna_MeshTexturePolyLayer_active_set");
|
||||
RNA_def_property_ui_text(prop, "Active", "Set the map as active for display and editing");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
prop = RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0);
|
||||
RNA_def_property_boolean_funcs(prop, "rna_MeshTexturePolyLayer_active_render_get",
|
||||
"rna_MeshTexturePolyLayer_active_render_set");
|
||||
RNA_def_property_ui_text(prop, "Active Render", "Set the map as active for rendering");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
prop = RNA_def_property(srna, "active_clone", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "active_clone", 0);
|
||||
RNA_def_property_boolean_funcs(prop, "rna_MeshTexturePolyLayer_clone_get", "rna_MeshTexturePolyLayer_clone_set");
|
||||
RNA_def_property_ui_text(prop, "Active Clone", "Set the map as active for cloning");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
|
||||
RNA_def_property_struct_type(prop, "MeshTexturePoly");
|
||||
RNA_def_property_ui_text(prop, "Data", "");
|
||||
RNA_def_property_collection_funcs(prop, "rna_MeshTexturePolyLayer_data_begin", "rna_iterator_array_next",
|
||||
"rna_iterator_array_end", "rna_iterator_array_get",
|
||||
"rna_MeshTexturePolyLayer_data_length", NULL, NULL, NULL);
|
||||
|
||||
srna = RNA_def_struct(brna, "MeshTexturePoly", NULL);
|
||||
RNA_def_struct_sdna(srna, "MTexPoly");
|
||||
RNA_def_struct_ui_text(srna, "Mesh UV Map Face", "UV map and image texture for a face");
|
||||
RNA_def_struct_path_func(srna, "rna_MeshTexturePoly_path");
|
||||
RNA_def_struct_ui_icon(srna, ICON_FACESEL_HLT);
|
||||
|
||||
#if 0 /* moved to MeshUVLoopLayer */
|
||||
prop = RNA_def_property(srna, "uv_raw", PROP_FLOAT, PROP_NONE);
|
||||
RNA_def_property_multi_array(prop, 2, uv_dim);
|
||||
RNA_def_property_float_sdna(prop, NULL, "uv");
|
||||
RNA_def_property_ui_text(prop, "UV", "Fixed size UV coordinates array");
|
||||
#endif
|
||||
}
|
||||
|
||||
static void rna_def_mcol(BlenderRNA *brna)
|
||||
{
|
||||
StructRNA *srna;
|
||||
|
@ -2899,14 +2813,27 @@ static void rna_def_uv_layers(BlenderRNA *brna, PropertyRNA *cprop)
|
|||
StructRNA *srna;
|
||||
PropertyRNA *prop;
|
||||
|
||||
/* FunctionRNA *func; */
|
||||
/* PropertyRNA *parm; */
|
||||
FunctionRNA *func;
|
||||
PropertyRNA *parm;
|
||||
|
||||
RNA_def_property_srna(cprop, "UVLoopLayers");
|
||||
srna = RNA_def_struct(brna, "UVLoopLayers", NULL);
|
||||
RNA_def_struct_sdna(srna, "Mesh");
|
||||
RNA_def_struct_ui_text(srna, "UV Loop Layers", "Collection of uv loop layers");
|
||||
|
||||
func = RNA_def_function(srna, "new", "rna_Mesh_uv_layers_new");
|
||||
RNA_def_function_ui_description(func, "Add a UV map layer to Mesh");
|
||||
RNA_def_string(func, "name", "UVMap", 0, "", "UV map name");
|
||||
parm = RNA_def_pointer(func, "layer", "MeshUVLoopLayer", "", "The newly created layer");
|
||||
RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
|
||||
RNA_def_function_return(func, parm);
|
||||
|
||||
func = RNA_def_function(srna, "remove", "rna_Mesh_uv_layers_remove");
|
||||
RNA_def_function_ui_description(func, "Remove a vertex color layer");
|
||||
RNA_def_function_flag(func, FUNC_USE_REPORTS);
|
||||
parm = RNA_def_pointer(func, "layer", "MeshUVLoopLayer", "", "The layer to remove");
|
||||
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
|
||||
|
||||
prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
|
||||
RNA_def_property_struct_type(prop, "MeshUVLoopLayer");
|
||||
RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_layer_active_get",
|
||||
|
@ -3071,7 +2998,6 @@ static void rna_def_tessface_uv_textures(BlenderRNA *brna, PropertyRNA *cprop)
|
|||
RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
|
||||
RNA_def_function_return(func, parm);
|
||||
|
||||
|
||||
prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
|
||||
RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
|
||||
RNA_def_property_pointer_funcs(prop, "rna_Mesh_tessface_uv_texture_active_get",
|
||||
|
@ -3081,49 +3007,7 @@ static void rna_def_tessface_uv_textures(BlenderRNA *brna, PropertyRNA *cprop)
|
|||
|
||||
prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
|
||||
RNA_def_property_int_funcs(prop, "rna_Mesh_tessface_uv_texture_active_index_get",
|
||||
"rna_Mesh_tessface_uv_texture_active_index_set", "rna_Mesh_uv_texture_index_range");
|
||||
RNA_def_property_ui_text(prop, "Active UV Map Index", "Active UV Map index");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
}
|
||||
|
||||
|
||||
static void rna_def_uv_textures(BlenderRNA *brna, PropertyRNA *cprop)
|
||||
{
|
||||
StructRNA *srna;
|
||||
PropertyRNA *prop;
|
||||
|
||||
FunctionRNA *func;
|
||||
PropertyRNA *parm;
|
||||
|
||||
RNA_def_property_srna(cprop, "UVTextures");
|
||||
srna = RNA_def_struct(brna, "UVTextures", NULL);
|
||||
RNA_def_struct_sdna(srna, "Mesh");
|
||||
RNA_def_struct_ui_text(srna, "UV Maps", "Collection of UV maps");
|
||||
|
||||
func = RNA_def_function(srna, "new", "rna_Mesh_uv_texture_new");
|
||||
RNA_def_function_ui_description(func, "Add a UV map layer to Mesh");
|
||||
RNA_def_string(func, "name", "UVMap", 0, "", "UV map name");
|
||||
parm = RNA_def_pointer(func, "layer", "MeshTexturePolyLayer", "", "The newly created layer");
|
||||
RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
|
||||
RNA_def_function_return(func, parm);
|
||||
|
||||
func = RNA_def_function(srna, "remove", "rna_Mesh_uv_texture_layers_remove");
|
||||
RNA_def_function_ui_description(func, "Remove a vertex color layer");
|
||||
RNA_def_function_flag(func, FUNC_USE_REPORTS);
|
||||
parm = RNA_def_pointer(func, "layer", "MeshTexturePolyLayer", "", "The layer to remove");
|
||||
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
|
||||
|
||||
prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
|
||||
RNA_def_property_struct_type(prop, "MeshTexturePolyLayer");
|
||||
RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_texture_active_get",
|
||||
"rna_Mesh_uv_texture_active_set", NULL, NULL);
|
||||
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK);
|
||||
RNA_def_property_ui_text(prop, "Active UV Map", "Active UV Map");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
|
||||
RNA_def_property_int_funcs(prop, "rna_Mesh_uv_texture_active_index_get",
|
||||
"rna_Mesh_uv_texture_active_index_set", "rna_Mesh_uv_texture_index_range");
|
||||
"rna_Mesh_tessface_uv_texture_active_index_set", "rna_Mesh_uv_layer_index_range");
|
||||
RNA_def_property_ui_text(prop, "Active UV Map Index", "Active UV Map index");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
}
|
||||
|
@ -3295,41 +3179,6 @@ static void rna_def_mesh(BlenderRNA *brna)
|
|||
"All UV maps for tessellated faces (read-only, for use by renderers)");
|
||||
rna_def_tessface_uv_textures(brna, prop);
|
||||
|
||||
/* UV maps */
|
||||
prop = RNA_def_property(srna, "uv_textures", PROP_COLLECTION, PROP_NONE);
|
||||
RNA_def_property_collection_sdna(prop, NULL, "pdata.layers", "pdata.totlayer");
|
||||
RNA_def_property_collection_funcs(prop, "rna_Mesh_uv_textures_begin", NULL, NULL, NULL,
|
||||
"rna_Mesh_uv_textures_length", NULL, NULL, NULL);
|
||||
RNA_def_property_struct_type(prop, "MeshTexturePolyLayer");
|
||||
RNA_def_property_ui_text(prop, "UV Maps", "All UV maps");
|
||||
rna_def_uv_textures(brna, prop);
|
||||
|
||||
prop = RNA_def_property(srna, "uv_texture_clone", PROP_POINTER, PROP_NONE);
|
||||
RNA_def_property_struct_type(prop, "MeshTexturePolyLayer");
|
||||
RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_texture_clone_get",
|
||||
"rna_Mesh_uv_texture_clone_set", NULL, NULL);
|
||||
RNA_def_property_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Clone UV Map", "UV map to be used as cloning source");
|
||||
|
||||
prop = RNA_def_property(srna, "uv_texture_clone_index", PROP_INT, PROP_UNSIGNED);
|
||||
RNA_def_property_int_funcs(prop, "rna_Mesh_uv_texture_clone_index_get",
|
||||
"rna_Mesh_uv_texture_clone_index_set", "rna_Mesh_uv_texture_index_range");
|
||||
RNA_def_property_ui_text(prop, "Clone UV Map Index", "Clone UV map index");
|
||||
|
||||
prop = RNA_def_property(srna, "uv_texture_stencil", PROP_POINTER, PROP_NONE);
|
||||
RNA_def_property_struct_type(prop, "MeshTexturePolyLayer");
|
||||
RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_texture_stencil_get",
|
||||
"rna_Mesh_uv_texture_stencil_set", NULL, NULL);
|
||||
RNA_def_property_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Mask UV Map", "UV map to mask the painted area");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
prop = RNA_def_property(srna, "uv_texture_stencil_index", PROP_INT, PROP_UNSIGNED);
|
||||
RNA_def_property_int_funcs(prop, "rna_Mesh_uv_texture_stencil_index_get",
|
||||
"rna_Mesh_uv_texture_stencil_index_set", "rna_Mesh_uv_texture_index_range");
|
||||
RNA_def_property_ui_text(prop, "Mask UV Map Index", "Mask UV map index");
|
||||
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
|
||||
|
||||
/* Tessellated face colors - used by renderers */
|
||||
|
||||
prop = RNA_def_property(srna, "tessface_vertex_colors", PROP_COLLECTION, PROP_NONE);
|
||||
|
@ -3670,7 +3519,6 @@ void RNA_def_mesh(BlenderRNA *brna)
|
|||
rna_def_mpolygon(brna);
|
||||
rna_def_mloopuv(brna);
|
||||
rna_def_mtface(brna);
|
||||
rna_def_mtexpoly(brna);
|
||||
rna_def_mcol(brna);
|
||||
rna_def_mloopcol(brna);
|
||||
rna_def_mproperties(brna);
|
||||
|
|
|
@ -101,12 +101,6 @@
|
|||
for (layer = data->layers + layer_index, a = 0; layer_index + a < data->totlayer; layer++, a++) { \
|
||||
if (value.data == layer) { \
|
||||
CustomData_set_layer_##active_type(data, layer_type, a); \
|
||||
\
|
||||
/* keep loops in sync */ \
|
||||
if (layer_type == CD_MTEXPOLY) { \
|
||||
CustomData *ldata = rna_mesh_ldata_helper(me); \
|
||||
CustomData_set_layer_##active_type(ldata, CD_MLOOPUV, a); \
|
||||
} \
|
||||
BKE_mesh_update_customdata_pointers(me, true); \
|
||||
return; \
|
||||
} \
|
||||
|
@ -131,11 +125,6 @@
|
|||
CustomData *data = rna_mesh_##customdata_type(ptr); \
|
||||
if (data) { \
|
||||
CustomData_set_layer_##active_type(data, layer_type, value); \
|
||||
/* keep loops in sync */ \
|
||||
if (layer_type == CD_MTEXPOLY) { \
|
||||
CustomData *ldata = rna_mesh_ldata_helper(me); \
|
||||
CustomData_set_layer_##active_type(ldata, CD_MLOOPUV, value); \
|
||||
} \
|
||||
BKE_mesh_update_customdata_pointers(me, true); \
|
||||
} \
|
||||
}
|
||||
|
|
|
@ -933,19 +933,19 @@ static EnumPropertyItem *rna_DataTransferModifier_layers_select_src_itemf(bConte
|
|||
|
||||
if (ob_src) {
|
||||
DerivedMesh *dm_src;
|
||||
CustomData *pdata;
|
||||
CustomData *ldata;
|
||||
int num_data, i;
|
||||
|
||||
dm_src = object_get_derived_final(ob_src, false);
|
||||
if (dm_src != NULL) {
|
||||
pdata = dm_src->getPolyDataLayout(dm_src);
|
||||
num_data = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
|
||||
ldata = dm_src->getLoopDataLayout(dm_src);
|
||||
num_data = CustomData_number_of_layers(ldata, CD_MLOOPUV);
|
||||
|
||||
RNA_enum_item_add_separator(&item, &totitem);
|
||||
|
||||
for (i = 0; i < num_data; i++) {
|
||||
tmp_item.value = i;
|
||||
tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(pdata, CD_MTEXPOLY, i);
|
||||
tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(ldata, CD_MLOOPUV, i);
|
||||
RNA_enum_item_add(&item, &totitem, &tmp_item);
|
||||
}
|
||||
}
|
||||
|
@ -1024,18 +1024,18 @@ static EnumPropertyItem *rna_DataTransferModifier_layers_select_dst_itemf(bConte
|
|||
|
||||
if (ob_dst && ob_dst->data) {
|
||||
Mesh *me_dst;
|
||||
CustomData *pdata;
|
||||
CustomData *ldata;
|
||||
int num_data, i;
|
||||
|
||||
me_dst = ob_dst->data;
|
||||
pdata = &me_dst->pdata;
|
||||
num_data = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
|
||||
ldata = &me_dst->ldata;
|
||||
num_data = CustomData_number_of_layers(ldata, CD_MLOOPUV);
|
||||
|
||||
RNA_enum_item_add_separator(&item, &totitem);
|
||||
|
||||
for (i = 0; i < num_data; i++) {
|
||||
tmp_item.value = i;
|
||||
tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(pdata, CD_MTEXPOLY, i);
|
||||
tmp_item.identifier = tmp_item.name = CustomData_get_layer_name(ldata, CD_MLOOPUV, i);
|
||||
RNA_enum_item_add(&item, &totitem, &tmp_item);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -622,10 +622,10 @@ void rna_object_uvlayer_name_set(PointerRNA *ptr, const char *value, char *resul
|
|||
if (ob->type == OB_MESH && ob->data) {
|
||||
me = (Mesh *)ob->data;
|
||||
|
||||
for (a = 0; a < me->pdata.totlayer; a++) {
|
||||
layer = &me->pdata.layers[a];
|
||||
for (a = 0; a < me->ldata.totlayer; a++) {
|
||||
layer = &me->ldata.layers[a];
|
||||
|
||||
if (layer->type == CD_MTEXPOLY && STREQ(layer->name, value)) {
|
||||
if (layer->type == CD_MLOOPUV && STREQ(layer->name, value)) {
|
||||
BLI_strncpy(result, value, maxlen);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -111,7 +111,7 @@ static void rna_Scene_uvedit_aspect(Scene *scene, Object *ob, float *aspect)
|
|||
if ((ob->type == OB_MESH) && (ob->mode == OB_MODE_EDIT)) {
|
||||
BMEditMesh *em;
|
||||
em = BKE_editmesh_from_object(ob);
|
||||
if (EDBM_mtexpoly_check(em)) {
|
||||
if (EDBM_uv_check(em)) {
|
||||
ED_uvedit_get_aspect(scene, ob, em->bm, aspect, aspect + 1);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -78,7 +78,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
|
|||
if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ ||
|
||||
surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE)
|
||||
{
|
||||
dataMask |= CD_MASK_MLOOPUV | CD_MASK_MTEXPOLY;
|
||||
dataMask |= CD_MASK_MLOOPUV;
|
||||
}
|
||||
/* mcol */
|
||||
if (surface->type == MOD_DPAINT_SURFACE_T_PAINT ||
|
||||
|
@ -95,7 +95,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
|
|||
|
||||
if (pmd->brush) {
|
||||
if (pmd->brush->flags & MOD_DPAINT_USE_MATERIAL) {
|
||||
dataMask |= CD_MASK_MLOOPUV | CD_MASK_MTEXPOLY;
|
||||
dataMask |= CD_MASK_MLOOPUV;
|
||||
}
|
||||
}
|
||||
return dataMask;
|
||||
|
|
|
@ -397,7 +397,6 @@ static DerivedMesh *generate_ocean_geometry(OceanModifierData *omd)
|
|||
/* add uvs */
|
||||
if (CustomData_number_of_layers(&result->loopData, CD_MLOOPUV) < MAX_MTFACE) {
|
||||
gogd.mloopuvs = CustomData_add_layer(&result->loopData, CD_MLOOPUV, CD_CALLOC, NULL, num_polys * 4);
|
||||
CustomData_add_layer(&result->polyData, CD_MTEXPOLY, CD_CALLOC, NULL, num_polys);
|
||||
|
||||
if (gogd.mloopuvs) { /* unlikely to fail */
|
||||
gogd.ix = 1.0 / gogd.rx;
|
||||
|
|
|
@ -80,7 +80,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(
|
|||
CustomDataMask dataMask = 0;
|
||||
|
||||
/* ask for UV coordinates */
|
||||
dataMask |= CD_MLOOPUV | CD_MTEXPOLY;
|
||||
dataMask |= CD_MLOOPUV;
|
||||
|
||||
return dataMask;
|
||||
}
|
||||
|
|
|
@ -156,11 +156,6 @@ static PyObject *bpy_bm_update_edit_mesh(PyObject *UNUSED(self), PyObject *args,
|
|||
|
||||
{
|
||||
extern void EDBM_update_generic(BMEditMesh *em, const bool do_tessface, const bool is_destructive);
|
||||
BMEditMesh *em = me->edit_btmesh;
|
||||
BMesh *bm = em->bm;
|
||||
|
||||
/* python won't ensure matching uv/mtex */
|
||||
BM_mesh_cd_validate(bm);
|
||||
|
||||
EDBM_update_generic(me->edit_btmesh, do_tessface, is_destructive);
|
||||
}
|
||||
|
|
|
@ -914,9 +914,6 @@ static PyObject *bpy_bmesh_to_mesh(BPy_BMesh *self, PyObject *args)
|
|||
|
||||
bm = self->bm;
|
||||
|
||||
/* python won't ensure matching uv/mtex */
|
||||
BM_mesh_cd_validate(bm);
|
||||
|
||||
BM_mesh_bm_to_me(bm, me, (&(struct BMeshToMeshParams){0}));
|
||||
|
||||
/* we could have the user do this but if they forget blender can easy crash
|
||||
|
|
|
@ -104,9 +104,6 @@ PyDoc_STRVAR(bpy_bmlayeraccess_collection__bevel_weight_doc,
|
|||
PyDoc_STRVAR(bpy_bmlayeraccess_collection__crease_doc,
|
||||
"Edge crease for subsurf - float in [0 - 1].\n\n:type: :class:`BMLayerCollection`"
|
||||
);
|
||||
PyDoc_STRVAR(bpy_bmlayeraccess_collection__tex_doc,
|
||||
"Accessor for :class:`BMTexPoly` layer (TODO).\n\ntype: :class:`BMLayerCollection`" // TYPE DOESN'T EXIST YET
|
||||
);
|
||||
PyDoc_STRVAR(bpy_bmlayeraccess_collection__uv_doc,
|
||||
"Accessor for :class:`BMLoopUV` UV (as a 2D Vector).\n\ntype: :class:`BMLayerCollection`"
|
||||
);
|
||||
|
@ -222,8 +219,6 @@ static PyGetSetDef bpy_bmlayeraccess_face_getseters[] = {
|
|||
{(char *)"int", (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, (char *)bpy_bmlayeraccess_collection__int_doc, (void *)CD_PROP_INT},
|
||||
{(char *)"string", (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, (char *)bpy_bmlayeraccess_collection__string_doc, (void *)CD_PROP_STR},
|
||||
|
||||
{(char *)"tex", (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, (char *)bpy_bmlayeraccess_collection__tex_doc, (void *)CD_MTEXPOLY},
|
||||
|
||||
#ifdef WITH_FREESTYLE
|
||||
{(char *)"freestyle", (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, (char *)bpy_bmlayeraccess_collection__freestyle_face_doc, (void *)CD_FREESTYLE_FACE},
|
||||
#endif
|
||||
|
@ -998,11 +993,6 @@ PyObject *BPy_BMLayerItem_GetItem(BPy_BMElem *py_ele, BPy_BMLayerItem *py_layer)
|
|||
ret = PyBytes_FromStringAndSize(mstring->s, mstring->s_len);
|
||||
break;
|
||||
}
|
||||
case CD_MTEXPOLY:
|
||||
{
|
||||
ret = BPy_BMTexPoly_CreatePyObject(value);
|
||||
break;
|
||||
}
|
||||
case CD_MLOOPUV:
|
||||
{
|
||||
ret = BPy_BMLoopUV_CreatePyObject(value);
|
||||
|
@ -1101,11 +1091,6 @@ int BPy_BMLayerItem_SetItem(BPy_BMElem *py_ele, BPy_BMLayerItem *py_layer, PyObj
|
|||
}
|
||||
break;
|
||||
}
|
||||
case CD_MTEXPOLY:
|
||||
{
|
||||
ret = BPy_BMTexPoly_AssignPyObject(value, py_value);
|
||||
break;
|
||||
}
|
||||
case CD_MLOOPUV:
|
||||
{
|
||||
ret = BPy_BMLoopUV_AssignPyObject(value, py_value);
|
||||
|
|
|
@ -47,66 +47,6 @@
|
|||
|
||||
#include "../generic/python_utildefines.h"
|
||||
|
||||
|
||||
/* Mesh BMTexPoly
|
||||
* ************** */
|
||||
|
||||
#define BPy_BMTexPoly_Check(v) (Py_TYPE(v) == &BPy_BMTexPoly_Type)
|
||||
|
||||
typedef struct BPy_BMTexPoly {
|
||||
PyObject_VAR_HEAD
|
||||
MTexPoly *data;
|
||||
} BPy_BMTexPoly;
|
||||
|
||||
/* TODO, flag access */
|
||||
#if 0
|
||||
static PyGetSetDef bpy_bmtexpoly_getseters[] = {
|
||||
/* attributes match rna_def_mtpoly */
|
||||
|
||||
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
|
||||
};
|
||||
#endif
|
||||
|
||||
static PyTypeObject BPy_BMTexPoly_Type; /* bm.loops.layers.uv.active */
|
||||
|
||||
static void bm_init_types_bmtexpoly(void)
|
||||
{
|
||||
BPy_BMTexPoly_Type.tp_basicsize = sizeof(BPy_BMTexPoly);
|
||||
|
||||
BPy_BMTexPoly_Type.tp_name = "BMTexPoly";
|
||||
|
||||
BPy_BMTexPoly_Type.tp_doc = NULL; // todo
|
||||
|
||||
#if 0
|
||||
BPy_BMTexPoly_Type.tp_getset = bpy_bmtexpoly_getseters;
|
||||
#endif
|
||||
|
||||
BPy_BMTexPoly_Type.tp_flags = Py_TPFLAGS_DEFAULT;
|
||||
|
||||
PyType_Ready(&BPy_BMTexPoly_Type);
|
||||
}
|
||||
|
||||
int BPy_BMTexPoly_AssignPyObject(struct MTexPoly *mtpoly, PyObject *value)
|
||||
{
|
||||
if (UNLIKELY(!BPy_BMTexPoly_Check(value))) {
|
||||
PyErr_Format(PyExc_TypeError, "expected BMTexPoly, not a %.200s", Py_TYPE(value)->tp_name);
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
*((MTexPoly *)mtpoly) = *(((BPy_BMTexPoly *)value)->data);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
PyObject *BPy_BMTexPoly_CreatePyObject(struct MTexPoly *mtpoly)
|
||||
{
|
||||
BPy_BMTexPoly *self = PyObject_New(BPy_BMTexPoly, &BPy_BMTexPoly_Type);
|
||||
self->data = mtpoly;
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
/* --- End Mesh BMTexPoly --- */
|
||||
|
||||
/* Mesh Loop UV
|
||||
* ************ */
|
||||
|
||||
|
@ -768,7 +708,6 @@ PyObject *BPy_BMDeformVert_CreatePyObject(struct MDeformVert *dvert)
|
|||
/* call to init all types */
|
||||
void BPy_BM_init_types_meshdata(void)
|
||||
{
|
||||
bm_init_types_bmtexpoly();
|
||||
bm_init_types_bmloopuv();
|
||||
bm_init_types_bmloopcol();
|
||||
bm_init_types_bmdvert();
|
||||
|
|
|
@ -40,15 +40,11 @@ typedef struct BPy_BMGenericMeshData {
|
|||
void *data;
|
||||
} BPy_BMGenericMeshData;
|
||||
|
||||
struct MTexPoly;
|
||||
struct MLoopUV;
|
||||
struct MLoopCol;
|
||||
struct MDeformVert;
|
||||
struct MVertSkin;
|
||||
|
||||
int BPy_BMTexPoly_AssignPyObject(struct MTexPoly *mloopuv, PyObject *value);
|
||||
PyObject *BPy_BMTexPoly_CreatePyObject(struct MTexPoly *mloopuv);
|
||||
|
||||
int BPy_BMLoopUV_AssignPyObject(struct MLoopUV *data, PyObject *value);
|
||||
PyObject *BPy_BMLoopUV_CreatePyObject(struct MLoopUV *data);
|
||||
|
||||
|
|
|
@ -3154,11 +3154,11 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
|
|||
/* normalmaps, test if tangents needed, separated from shading */
|
||||
if (ma->mode_l & MA_TANGENT_V) {
|
||||
need_tangent= 1;
|
||||
if (me->mtpoly==NULL)
|
||||
if (me->mloopuv==NULL)
|
||||
need_orco= 1;
|
||||
}
|
||||
if (ma->mode_l & MA_NORMAP_TANG) {
|
||||
if (me->mtpoly==NULL) {
|
||||
if (me->mloopuv==NULL) {
|
||||
need_orco= 1;
|
||||
}
|
||||
need_tangent= 1;
|
||||
|
@ -3171,7 +3171,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
|
|||
|
||||
if (re->flag & R_NEED_TANGENT) {
|
||||
/* exception for tangent space baking */
|
||||
if (me->mtpoly==NULL) {
|
||||
if (me->mloopuv==NULL) {
|
||||
need_orco= 1;
|
||||
}
|
||||
need_tangent= 1;
|
||||
|
|
|
@ -232,7 +232,7 @@ void EDBM_mesh_load(struct Object *ob) RET_NONE
|
|||
void EDBM_mesh_make(struct ToolSettings *ts, struct Object *ob, const bool use_key_index) RET_NONE
|
||||
void EDBM_mesh_normals_update(struct BMEditMesh *em) RET_NONE
|
||||
void *g_system;
|
||||
bool EDBM_mtexpoly_check(struct BMEditMesh *em) RET_ZERO
|
||||
bool EDBM_uv_check(struct BMEditMesh *em) RET_ZERO
|
||||
|
||||
float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl, const char *name, const char *viewname) RET_NULL
|
||||
float RE_filter_value(int type, float x) RET_ZERO
|
||||
|
|
|
@ -248,7 +248,7 @@ def mesh_uv_add(obj):
|
|||
(1.0, 1.0),
|
||||
(1.0, 0.0))
|
||||
|
||||
uv_lay = obj.data.uv_textures.new()
|
||||
uv_lay = obj.data.uv_layers.new()
|
||||
|
||||
# XXX, odd that we need to do this. until UV's and texface
|
||||
# are separated we will need to keep it
|
||||
|
|
Loading…
Reference in New Issue