my fucking fingers
[carveJwlIkooP6JGAAIwe30JlM.git] / blender_export.py
index 861d69249efbbfa640412cbe35b216dbbd42229c..7c61247c67aa8d902c55f33b5e7245b6b5eb7d82 100644 (file)
@@ -30,6 +30,9 @@ sr_entity_list = [
    ('ent_font',         'Font',           '', 9  ),
    ('ent_font_variant', 'Font:Variant',   '', 10 ),
    ('ent_traffic',      'Traffic Model',  '', 11 ),
+   ('ent_skateshop',    'Skate Shop',     '', 12 ),
+   ('ent_camera',       'Camera',         '', 13 ),
+   ('ent_swspreview', 'Workshop Preview', '', 14 )
 ]
 
 def get_entity_enum_id( alias ):
@@ -271,19 +274,13 @@ class volume_union(Union):
                ("particles",volume_particles)]
 #}
 
-class ent_index(Structure):
-#{
-   _fields_ = [("type",c_uint32),
-               ("index",c_uint32)]
-#}
-
 class ent_volume(Structure):
 #{
    _fields_ = [("transform",mdl_transform),
                ("to_world",(c_float*3)*4),
                ("to_local",(c_float*3)*4),
                ("type",c_uint32),
-               ("target",ent_index),
+               ("target",c_uint32),
                ("_anon",volume_union)]
 #}
 
@@ -342,10 +339,33 @@ class ent_traffic(Structure):
                ("index",c_uint32)]
 #}
 
+class ent_skateshop(Structure):
+#{
+   _fields_ = [("transform",mdl_transform),
+               ("id_display",c_uint32),
+               ("id_info",c_uint32),
+               ("id_rack",c_uint32),
+               ("id_camera",c_uint32)]
+#}
+
+class ent_swspreview(Structure):
+#{
+   _fields_ = [("id_camera",c_uint32),
+               ("id_display",c_uint32),
+               ("id_display1",c_uint32)]
+#}
+
+class ent_camera(Structure):
+#{
+   _fields_ = [("transform",mdl_transform),
+               ("fov",c_float)]
+#}
+
 def obj_ent_type( obj ):
 #{
    if obj.type == 'ARMATURE': return 'mdl_armature'
    elif obj.type == 'LIGHT': return 'ent_light'
+   elif obj.type == 'CAMERA': return 'ent_camera'
    else: return obj.SR_data.ent_type
 #}
 
@@ -455,6 +475,10 @@ cxr_graph_mapping = \
             "Color": material_tex_image("tex_normal")
          }
       }
+   },
+   "Emission":
+   {
+      "Color": material_tex_image("tex_diffuse")
    }
 }
 
@@ -677,6 +701,14 @@ def sr_armature_bones( armature ):
          yield from _recurse_bone( b )
 #}
 
+def sr_entity_id( obj ):
+#{
+   tipo = get_entity_enum_id( obj_ent_type(obj) )
+   index = sr_compile.entity_ids[ obj.name ]
+
+   return (tipo&0xffff)<<16 | (index&0xffff)
+#}
+
 # Returns submesh_start,count and armature_id
 def sr_compile_mesh_internal( obj ):
 #{
@@ -955,7 +987,7 @@ def sr_compile_fonts( collection ):
       font.glyph_start = glyph_count
 
       glyph_base = data.glyphs[0].utf32
-      glyph_range = data.glyphs[-1].utf32 - glyph_base
+      glyph_range = data.glyphs[-1].utf32+1 - glyph_base
 
       font.glyph_utf32_base = glyph_base
       font.glyph_count = glyph_range
@@ -1359,6 +1391,12 @@ def sr_compile( collection ):
             light.colour[3] = obj.data.energy
             sr_ent_push( light )
          #}
+         elif ent_type == 'ent_camera': #{
+            cam = ent_camera()
+            compile_obj_transform( obj, cam.transform )
+            cam.fov = obj.data.angle * 45.0
+            sr_ent_push(cam)
+         #}
          elif ent_type == 'ent_gate': #{
             gate = ent_gate()
             obj_data = obj.SR_data.ent_gate[0]
@@ -1470,9 +1508,7 @@ def sr_compile( collection ):
             compile_obj_transform( obj, volume.transform )
 
             if obj_data.target:#{
-               target = obj_data.target
-               volume.target.type = get_entity_enum_id( obj_ent_type(target) )
-               volume.target.index = sr_compile.entity_ids[ target.name ]
+               volume.target = sr_entity_id( obj_data.target )
             #}
 
             sr_ent_push(volume)
@@ -1483,6 +1519,24 @@ def sr_compile( collection ):
             compile_obj_transform( obj, marker.transform )
             sr_ent_push(marker)
          #}
+         elif ent_type == 'ent_skateshop':#{
+            skateshop = ent_skateshop()
+            obj_data = obj.SR_data.ent_skateshop[0]
+            skateshop.id_display = sr_entity_id( obj_data.mark_display )
+            skateshop.id_info = sr_entity_id( obj_data.mark_info )
+            skateshop.id_rack = sr_entity_id( obj_data.mark_rack )
+            skateshop.id_camera = sr_entity_id( obj_data.cam )
+            compile_obj_transform( obj, skateshop.transform )
+            sr_ent_push(skateshop)
+         #}
+         elif ent_type == 'ent_swspreview':#{
+            workshop_preview = ent_swspreview()
+            obj_data = obj.SR_data.ent_swspreview[0]
+            workshop_preview.id_display = sr_entity_id( obj_data.mark_display )
+            workshop_preview.id_display1 = sr_entity_id( obj_data.mark_display1)
+            workshop_preview.id_camera = sr_entity_id( obj_data.cam )
+            sr_ent_push( workshop_preview )
+         #}
       #}
    #}
 
@@ -2375,7 +2429,8 @@ class SR_UL_FONT_GLYPH_LIST(bpy.types.UIList):
       s1 = c.split(factor=0.3)
       c = s1.column()
       row = c.row()
-      lbl = chr(item.utf32) if item.utf32 >= 32 and item.utf32 <= 126 else 'ERR'
+      lbl = chr(item.utf32) if item.utf32 >= 32 and item.utf32 <= 126 else \
+                                                              f'x{item.utf32:x}'
       row.label(text=lbl)
       c = s1.column()
       c.prop( item, 'utf32', text='', emboss=True )
@@ -2428,7 +2483,8 @@ class SR_OBJECT_ENT_VOLUME(bpy.types.PropertyGroup):
 
    target: bpy.props.PointerProperty( \
            type=bpy.types.Object, name="Target", \
-           poll=lambda self,obj: sr_filter_ent_type(obj,['ent_audio']))
+           poll=lambda self,obj: sr_filter_ent_type(obj,\
+                                    ['ent_audio','ent_skateshop']))
 
    @staticmethod
    def sr_inspector( layout, data ):
@@ -2579,6 +2635,35 @@ class SR_OBJECT_ENT_TRAFFIC(bpy.types.PropertyGroup):
    speed: bpy.props.FloatProperty(default=1.0)
 #}
 
+class SR_OBJECT_ENT_SKATESHOP(bpy.types.PropertyGroup):
+#{
+   mark_rack: bpy.props.PointerProperty( \
+           type=bpy.types.Object, name="Board Rack", \
+           poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
+   mark_display: bpy.props.PointerProperty( \
+           type=bpy.types.Object, name="Selected Board Display", \
+           poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
+   mark_info: bpy.props.PointerProperty( \
+           type=bpy.types.Object, name="Selected Board Info", \
+           poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
+   cam: bpy.props.PointerProperty( \
+           type=bpy.types.Object, name="Viewpoint", \
+           poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera']))
+#}
+
+class SR_OBJECT_ENT_WORKSHOP_PREVIEW(bpy.types.PropertyGroup):
+#{
+   mark_display: bpy.props.PointerProperty( \
+           type=bpy.types.Object, name="Board Display", \
+           poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
+   mark_display1: bpy.props.PointerProperty( \
+           type=bpy.types.Object, name="Board Display (other side)", \
+           poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
+   cam: bpy.props.PointerProperty( \
+           type=bpy.types.Object, name="Viewpoint", \
+           poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera']))
+#}
+
 class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup):
 #{
    ent_gate: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_GATE)
@@ -2590,6 +2675,10 @@ class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup):
    ent_glyph: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_GLYPH)
    ent_font: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_FONT)
    ent_traffic: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_TRAFFIC)
+   ent_skateshop: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_SKATESHOP)
+   ent_swspreview: \
+         bpy.props.CollectionProperty(type=SR_OBJECT_ENT_WORKSHOP_PREVIEW)
+
    ent_type: bpy.props.EnumProperty(
       name="Type",
       items=sr_entity_list,
@@ -3540,6 +3629,42 @@ def cv_draw():
                #}
             #}
          #}
+         elif ent_type == 'ent_skateshop':#{
+            cc = (0.0,0.9,0.6)
+            cc1 = (0.4,0.9,0.2)
+            cc2 = (0.9,0.6,0.1)
+
+            data = obj.SR_data.ent_skateshop[0]
+            display = data.mark_display
+            info = data.mark_info
+            rack = data.mark_rack
+
+            rack_cu = Vector((3.15,2.0,0.1))*0.5
+            rack_co = Vector((0.0,0.0,0.0))
+            display_cu = Vector((0.3,1.2,0.1))*0.5
+            display_co = Vector((0.0,0.0,0.1))*0.5
+            info_cu = Vector((1.2,0.01,0.3))*0.5
+            info_co = Vector((0.0,0.0,0.0))*0.5
+
+            if rack:
+               cv_draw_ucube( rack.matrix_world, cc, rack_cu, rack_co )
+            if display:
+               cv_draw_ucube( display.matrix_world, cc1, display_cu, display_co)
+            if info:
+               cv_draw_ucube( info.matrix_world, cc2, info_cu, info_co )
+         #}
+         elif ent_type == 'ent_swspreview':#{
+            cc1 = (0.4,0.9,0.2)
+            data = obj.SR_data.ent_swspreview[0]
+            display = data.mark_display
+            display1 = data.mark_display1
+            display_cu = Vector((0.3,1.2,0.1))*0.5
+            display_co = Vector((0.0,0.0,0.1))*0.5
+            if display:
+               cv_draw_ucube( display.matrix_world, cc1, display_cu, display_co)
+            if display1:
+               cv_draw_ucube(display1.matrix_world, cc1, display_cu, display_co)
+         #}
       #}
    #}
 
@@ -3573,7 +3698,8 @@ classes = [ SR_INTERFACE, SR_MATERIAL_PANEL,\
             SR_OBJECT_ENT_FONT_VARIANT,
             SR_OBJECT_ENT_GLYPH_ENTRY,\
             SR_UL_FONT_VARIANT_LIST,SR_UL_FONT_GLYPH_LIST,\
-            SR_OBJECT_ENT_FONT,SR_OBJECT_ENT_TRAFFIC,\
+            SR_OBJECT_ENT_FONT,SR_OBJECT_ENT_TRAFFIC,SR_OBJECT_ENT_SKATESHOP,\
+            SR_OBJECT_ENT_WORKSHOP_PREVIEW,\
             \
             SR_OBJECT_PROPERTIES, SR_LIGHT_PROPERTIES, SR_BONE_PROPERTIES, 
             SR_MESH_PROPERTIES, SR_MATERIAL_PROPERTIES \