X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=blender_export.py;h=05f687a42530d0b9b670fcc6b54621b10f32bcb1;hb=84a7ae83a25966e0004a1a4b409dbb3d49fae286;hp=16d1f381e201f2c9625c335690a4404134d38150;hpb=9c85e110fa8b965195438d96625ff9753af362a6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/blender_export.py b/blender_export.py index 16d1f38..05f687a 100644 --- a/blender_export.py +++ b/blender_export.py @@ -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'}