import bpy, math, gpu
+import cProfile
from ctypes import *
from mathutils import *
from gpu_extras.batch import batch_for_shader
class classtype_gate(Structure):
_pack_ = 1
- _fields_ = [("target",c_uint32)]
+ _fields_ = [("target",c_uint32),
+ ("target1",c_uint32)]
class classtype_block(Structure):
_pack_ = 1
_pack_ = 1
_fields_ = [("temp",c_uint32)]
+class classtype_car_path(Structure):
+ _pack_ = 1
+ _fields_ = [("target",c_uint32),
+ ("target1",c_uint32)]
+
+class classtype_instance(Structure):
+ _pack_ = 1
+ _fields_ = [("pstr_file",c_uint32)]
+
# Exporter
# ==============================================================================
def write_model(name):
print( F"Create mode {name}" )
- collection = bpy.data.collections[name]
-
header = mdl_header()
header.identifier = 0xABCD0000
header.version = 0
# Do exporting
#
print( " assigning ids" )
+ collection = bpy.data.collections[name]
+
header.node_count = 1
for obj in collection.all_objects:
obj.cv_data.uid = header.node_count
node.offset = entdata_length
classtype = obj.cv_data.classtype
- if classtype == 'k_classtype_none':
- node.classtype = 0
- node.offset = 0
-
- elif classtype == 'k_classtype_gate':
+ if classtype == 'k_classtype_gate':
node.classtype = 1
entdata_length += sizeof( classtype_gate )
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':
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]
+ elif obj.is_instancer:
+ target = obj.instance_collection
+
+ node.classtype = 6
+ entdata_length += sizeof( classtype_instance )
+
+ inst = classtype_instance()
+ inst.pstr_file = emplace_string( F"models/{target.name}.mdl" )
+ entdata_buffer += [inst]
+
+ # classtype == 'k_classtype_none':
+ else:
+ node.classtype = 0
+ node.offset = 0
# Process meshes
#
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]]
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:
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 })
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",
('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):
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
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'}