Skip to content

Commit

Permalink
vertex color overrides
Browse files Browse the repository at this point in the history
  • Loading branch information
pragma37 committed Mar 14, 2022
1 parent d090cf2 commit f7b9641
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 7 deletions.
62 changes: 57 additions & 5 deletions BlenderMalt/MaltMeshes.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ def load_mesh(object, name):
uvs_list = []
tangents_buffer = None
for i, uv_layer in enumerate(m.uv_layers):
if i > 4: break
uv_ptr = ctypes.c_void_p(uv_layer.data[0].as_pointer())
uv = get_load_buffer('uv'+str(i), ctypes.c_float, loop_count * 2)
CBlenderMalt.retrieve_mesh_uv(uv_ptr, loop_count, uv.buffer())
Expand All @@ -62,13 +63,27 @@ def load_mesh(object, name):
tangents_buffer = get_load_buffer('tangents'+str(i), ctypes.c_float, (loop_count * 4))
ctypes.memmove(tangents_buffer.buffer(), tangents, tangents_buffer.size_in_bytes())

colors_list = []
colors_list = [None]*4
for i, vertex_color in enumerate(m.vertex_colors):
if i > 4: break
color = (ctypes.c_uint8 * (loop_count * 4)).from_address(vertex_color.data[0].as_pointer())
color_buffer = get_load_buffer('colors'+str(i), ctypes.c_uint8, loop_count*4)
ctypes.memmove(color_buffer.buffer(), color, color_buffer.size_in_bytes())
colors_list.append(color_buffer)
colors_list[i] = color_buffer

for i in range(4):
try:
override = getattr(object.original.data, f'malt_vertex_color_override_{i}')
attribute = m.attributes.get(override)
if attribute and attribute.domain == 'CORNER' and attribute.data_type == 'FLOAT_COLOR':
color = (ctypes.c_float * (loop_count * 4)).from_address(attribute.data[0].as_pointer())
color_buffer = get_load_buffer('colors_override'+str(i), ctypes.c_float, loop_count*4)
ctypes.memmove(color_buffer.buffer(), color, color_buffer.size_in_bytes())
colors_list[i] = color_buffer
except:
import traceback
traceback.print_exc()

#TODO: Optimize. Create load buffers from bytearrays and retrieve them later
mesh_data = {
'positions': positions,
Expand All @@ -95,11 +110,48 @@ def unload_mesh(object):

def reset_meshes():
global MESHES
MESHES = {}
MESHES = {}

class MALT_PT_Attributes(bpy.types.Panel):
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "data"

bl_label = "Malt Vertex Color Overrides"
COMPAT_ENGINES = {'MALT'}

@classmethod
def get_malt_property_owner(cls, context):
if context.object and context.object.data and context.object.type in ('MESH', 'CURVE', 'SURFACE', 'META', 'FONT'):
return context.object.data

@classmethod
def poll(cls, context):
return context.scene.render.engine == 'MALT' and cls.get_malt_property_owner(context)

def draw(self, context):
owner = self.get_malt_property_owner(context)
if owner:
self.layout.use_property_split = True
self.layout.use_property_decorate = False # No animation.
self.layout.active = owner.library is None #Only local data can be edited
self.layout.prop(owner, 'malt_vertex_color_override_0')
self.layout.prop(owner, 'malt_vertex_color_override_1')
self.layout.prop(owner, 'malt_vertex_color_override_2')
self.layout.prop(owner, 'malt_vertex_color_override_3')

def register():
pass
bpy.types.Mesh.malt_vertex_color_override_0 = bpy.props.StringProperty(name='0')
bpy.types.Mesh.malt_vertex_color_override_1 = bpy.props.StringProperty(name='1')
bpy.types.Mesh.malt_vertex_color_override_2 = bpy.props.StringProperty(name='2')
bpy.types.Mesh.malt_vertex_color_override_3 = bpy.props.StringProperty(name='3')
bpy.utils.register_class(MALT_PT_Attributes)


def unregister():
pass
bpy.utils.unregister_class(MALT_PT_Attributes)
del bpy.types.Mesh.malt_vertex_color_override_0
del bpy.types.Mesh.malt_vertex_color_override_1
del bpy.types.Mesh.malt_vertex_color_override_2
del bpy.types.Mesh.malt_vertex_color_override_3

8 changes: 6 additions & 2 deletions Bridge/Mesh.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def load_VBO(data):
normals = load_VBO(data['normals'])
tangents = load_VBO(data['tangents']) if data['tangents'] else None
uvs = [load_VBO(e) for e in data['uvs']]
colors = [load_VBO(e) for e in data['colors']]
colors = [load_VBO(e) if e else None for e in data['colors']]

for i, indices in enumerate(data['indices']):
result = Mesh.MeshCustomLoad()
Expand Down Expand Up @@ -70,7 +70,11 @@ def bind_VBO(VBO, index, element_size, gl_type=GL_FLOAT, gl_normalize=GL_FALSE):
if i >= max_vertex_colors:
LOG.warning('{} : Vertex Color Layer count exceeds max supported layers ({})'.format(name, max_uv))
break
bind_VBO(color, color0_index + i, 4, GL_UNSIGNED_BYTE, GL_TRUE)
if color:
if data['colors'][i]._ctype == ctypes.c_uint8:
bind_VBO(color, color0_index + i, 4, GL_UNSIGNED_BYTE, GL_TRUE)
if data['colors'][i]._ctype == ctypes.c_float:
bind_VBO(color, color0_index + i, 4, GL_FLOAT)

glBindVertexArray(0)

Expand Down

0 comments on commit f7b9641

Please sign in to comment.