more physics shapes
[carveJwlIkooP6JGAAIwe30JlM.git] / blender_export.py
index 16d1f381e201f2c9625c335690a4404134d38150..05f687a42530d0b9b670fcc6b54621b10f32bcb1 100644 (file)
@@ -1,4 +1,5 @@
 import bpy, math, gpu
+import cProfile
 from ctypes import *
 from mathutils import *
 from gpu_extras.batch import batch_for_shader
@@ -75,7 +76,8 @@ class mdl_header(Structure):
 
 class classtype_gate(Structure):
    _pack_ = 1
-   _fields_ = [("target",c_uint32)]
+   _fields_ = [("target",c_uint32),
+               ("target1",c_uint32)]
 
 class classtype_block(Structure):
    _pack_ = 1
@@ -89,6 +91,11 @@ class classtype_water(Structure):
    _pack_ = 1
    _fields_ = [("temp",c_uint32)]
 
+class classtype_car_path(Structure):
+   _pack_ = 1
+   _fields_ = [("target",c_uint32),
+               ("target1",c_uint32)]
+
 # Exporter
 # ==============================================================================
 
@@ -227,10 +234,11 @@ def write_model(name):
          block = classtype_block()
          block.bbx[0][0] =  source.v0[0]
          block.bbx[0][1] =  source.v0[2]
-         block.bbx[0][2] = -source.v0[1]
+         block.bbx[0][2] = -source.v1[1]
+
          block.bbx[1][0] =  source.v1[0]
          block.bbx[1][1] =  source.v1[2]
-         block.bbx[1][2] = -source.v1[1]
+         block.bbx[1][2] = -source.v0[1]
          entdata_buffer += [block]
 
       elif classtype == 'k_classtype_spawn':
@@ -238,6 +246,20 @@ def write_model(name):
 
       elif classtype == 'k_classtype_water':
          node.classtype = 4
+      elif classtype == 'k_classtype_car_path':
+         node.classtype = 5
+         entdata_length += sizeof( classtype_car_path )
+
+         pn = classtype_car_path()
+         pn.target = 0
+         pn.target1 = 0
+
+         if obj.cv_data.target != None: 
+            pn.target = obj.cv_data.target.cv_data.uid
+         if obj.cv_data.target1 != None: 
+            pn.target1 = obj.cv_data.target1.cv_data.uid
+
+         entdata_buffer += [pn]
 
       # Process meshes
       #
@@ -296,11 +318,21 @@ def write_model(name):
                   if data.vertex_colors:
                      colour = data.vertex_colors.active.data[li].color
 
-                  key = (round(co[0],4),round(co[1],4),round(co[2],4),\
-                         round(norm[0],4),round(norm[1],4),round(norm[2],4),\
-                         round(uv[0],4),round(uv[1],4),\
-                         round(colour[0],4),round(colour[1],4),\
-                         round(colour[2],4),round(colour[3],4))
+                  TOLERENCE = 4
+                  m = float(10**TOLERENCE)
+
+                  key = (int(co[0]*m+0.5),\
+                         int(co[1]*m+0.5),\
+                         int(co[2]*m+0.5),\
+                         int(norm[0]*m+0.5),\
+                         int(norm[1]*m+0.5),\
+                         int(norm[2]*m+0.5),\
+                         int(uv[0]*m+0.5),\
+                         int(uv[1]*m+0.5),\
+                         int(colour[0]*m+0.5),\
+                         int(colour[1]*m+0.5),\
+                         int(colour[2]*m+0.5),\
+                         int(colour[3]*m+0.5))
 
                   if key in boffa:
                      indice_buffer += [boffa[key]]
@@ -407,11 +439,34 @@ def cv_draw():
    gpu.state.line_width_set(2.0)
    gpu.state.face_culling_set('BACK')
    gpu.state.depth_test_set('NONE')
-   gpu.state.blend_set('ADDITIVE')
+   gpu.state.blend_set('NONE')
 
    verts = []
    colours = []
 
+   def drawbezier(p0,h0,p1,h1,c0,c1):
+      nonlocal verts, colours
+
+      verts += [p0]
+      verts += [h0]
+      colours += [(0.5,0.5,0.5,1.0),(0.5,0.5,0.5,1)]
+      verts += [p1]
+      verts += [h1]
+      colours += [(1.0,1.0,1,1),(1,1,1,1)]
+      
+      last = p0
+      for i in range(10):
+         t = (i+1)/10
+         a0 = 1-t
+
+         tt = t*t
+         ttt = tt*t
+         p=ttt*p1+(3*tt-3*ttt)*h1+(3*ttt-6*tt+3*t)*h0+(3*tt-ttt-3*t+1)*p0
+         verts += [(last[0],last[1],last[2])]
+         verts += [(p[0],p[1],p[2])]
+         colours += [c0*a0+c1*(1-a0),c0*a0+c1*(1-a0)]
+         last = p
+
    for obj in bpy.context.collection.objects:
       if obj.cv_data.classtype == 'k_classtype_gate':
          if obj.cv_data.target != None:
@@ -444,6 +499,45 @@ def cv_draw():
             verts += [(v1[0],v1[1],v1[2])]
             colours += [(1,1,0,1),(1,1,0,1)]
 
+      elif obj.cv_data.classtype == 'k_classtype_spawn':
+         vs = [None]*4
+         vs[0] = obj.matrix_world @ Vector((0,0,0))
+         vs[1] = obj.matrix_world @ Vector((0,2,0))
+         vs[2] = obj.matrix_world @ Vector((0.5,1,0))
+         vs[3] = obj.matrix_world @ Vector((-0.5,1,0))
+         indices = [(0,1),(1,2),(1,3)]
+         for l in indices:
+            v0 = vs[l[0]]
+            v1 = vs[l[1]]
+            verts += [(v0[0],v0[1],v0[2])]
+            verts += [(v1[0],v1[1],v1[2])]
+            colours += [(0,1,1,1),(0,1,1,1)]
+
+      elif obj.cv_data.classtype == 'k_classtype_car_path':
+         p0 = obj.location
+         h0 = obj.matrix_world @ Vector((1,0,0))
+
+         v0 = obj.matrix_world.to_quaternion() @ Vector((1,0,0))
+         c0 = Vector((v0.x*0.5+0.5, v0.y*0.5+0.5, 0.0, 1.0))
+
+         if obj.cv_data.target != None:
+            p1 = obj.cv_data.target.location
+            h1 = obj.cv_data.target.matrix_world @ Vector((-1,0,0))
+
+            v1 = obj.cv_data.target.matrix_world.to_quaternion()@Vector((1,0,0))
+            c1 = Vector((v1.x*0.5+0.5, v1.y*0.5+0.5, 0.0, 1.0))
+
+            drawbezier( p0, h0, p1, h1, c0, c1 )
+
+         if obj.cv_data.target1 != None:
+            p1 = obj.cv_data.target1.location
+            h1 = obj.cv_data.target1.matrix_world @ Vector((-1,0,0))
+
+            v1 = obj.cv_data.target1.matrix_world.to_quaternion()@Vector((1,0,0))
+            c1 = Vector((v1.x*0.5+0.5, v1.y*0.5+0.5, 0.0, 1.0))
+
+            drawbezier( p0, h0, p1, h1, c0, c1 )
+
    lines = batch_for_shader(\
          cv_view_shader, 'LINES', \
          { "pos":verts, "color":colours })
@@ -468,6 +562,8 @@ class CV_OBJ_SETTINGS(bpy.types.PropertyGroup):
 
    target: bpy.props.PointerProperty( type=bpy.types.Object, name="target", \
          poll=cv_poll_target )
+   target1: bpy.props.PointerProperty( type=bpy.types.Object, name="target1", \
+         poll=cv_poll_target )
 
    classtype: bpy.props.EnumProperty(
       name="Format", 
@@ -476,7 +572,8 @@ class CV_OBJ_SETTINGS(bpy.types.PropertyGroup):
       ('k_classtype_gate', "k_classtype_gate", "", 1),
       ('k_classtype_block', "k_classtype_block", "", 2),
       ('k_classtype_spawn', "k_classtype_spawn", "", 3),
-      ('k_classtype_water', "k_classtype_water", "", 4)
+      ('k_classtype_water', "k_classtype_water", "", 4),
+      ('k_classtype_car_path', "k_classtype_car_path", "", 5)
       ])
 
 class CV_OBJ_PANEL(bpy.types.Panel):
@@ -493,6 +590,9 @@ class CV_OBJ_PANEL(bpy.types.Panel):
 
       if active_object.cv_data.classtype == 'k_classtype_gate':
          _.layout.prop( active_object.cv_data, "target" )
+      elif active_object.cv_data.classtype == 'k_classtype_car_path':
+         _.layout.prop( active_object.cv_data, "target" )
+         _.layout.prop( active_object.cv_data, "target1" )
       elif active_object.cv_data.classtype == 'k_classtype_block':
          mesh = active_object.data
 
@@ -513,13 +613,19 @@ class CV_INTERFACE(bpy.types.Panel):
       layout = _.layout
       layout.operator( "carve.compile_all" )
 
+def test_compile():
+   for col in bpy.data.collections["export"].children:
+      write_model( col.name )
+
 class CV_COMPILE(bpy.types.Operator):
    bl_idname="carve.compile_all"
    bl_label="Compile All"
 
    def execute(_,context):
-      for col in bpy.data.collections["export"].children:
-         write_model( col.name )
+      test_compile()
+      #cProfile.runctx("test_compile()",globals(),locals(),sort=1)
+      #for col in bpy.data.collections["export"].children:
+      #   write_model( col.name )
 
       return {'FINISHED'}