X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=blender_export.py;h=293b87cd89e81385131e586cd25a939446ff929f;hb=b8ff92a2caafa557608b84f4a037a5b3ce2628f7;hp=73d17059d19fded822a9af16c95c818104bae03d;hpb=b3ca3b7a45eec11c46eb19772e10021177665adb;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/blender_export.py b/blender_export.py index 73d1705..293b87c 100644 --- a/blender_export.py +++ b/blender_export.py @@ -31,7 +31,10 @@ sr_entity_list = [ ('ent_font_variant', 'Font:Variant', '', 10 ), ('ent_traffic', 'Traffic Model', '', 11 ), ('ent_skateshop', 'Skate Shop', '', 12 ), - ('ent_camera', 'Camera', '', 13 ) + ('ent_camera', 'Camera', '', 13 ), + ('ent_swspreview', 'Workshop Preview', '', 14 ), + ('ent_menuitem', 'Menu Item', '', 15 ), + ('ent_worldinfo', 'World Info', '', 16 ), ] def get_entity_enum_id( alias ): @@ -183,6 +186,7 @@ class ent_gate(Structure): #{ _fields_ = [("type",c_uint32), ("target", c_uint32), + ("key",c_uint32), ("dimensions", c_float*3), ("co", (c_float*3)*2), ("q", (c_float*4)*2), @@ -338,13 +342,87 @@ class ent_traffic(Structure): ("index",c_uint32)] #} +# Skateshop +# --------------------------------------------------------------- +class ent_skateshop_characters(Structure): +#{ + _fields_ = [("id_display",c_uint32), + ("id_info",c_uint32)] +#} +class ent_skateshop_boards(Structure): +#{ + _fields_ = [("id_display",c_uint32), + ("id_info",c_uint32), + ("id_rack",c_uint32)] +#} +class ent_skateshop_worlds(Structure): +#{ + _fields_ = [("id_display",c_uint32), + ("id_info",c_uint32)] +#} +class ent_skateshop_anon_union(Union): +#{ + _fields_ = [("boards",ent_skateshop_boards), + ("character",ent_skateshop_characters), + ("worlds",ent_skateshop_worlds)] +#} class ent_skateshop(Structure): #{ - _fields_ = [("transform",mdl_transform), + _fields_ = [("transform",mdl_transform), ("type",c_uint32), + ("id_camera",c_uint32), + ("_anonymous_union",ent_skateshop_anon_union)] +#} + +class ent_swspreview(Structure): +#{ + _fields_ = [("id_camera",c_uint32), ("id_display",c_uint32), - ("id_info",c_uint32), - ("id_rack",c_uint32), - ("id_camera",c_uint32)] + ("id_display1",c_uint32)] +#} + +# Menu +# ----------------------------------------------------------------- +class ent_menuitem_slider(Structure): +#{ + _fields_ = [("id_min",c_uint32), + ("id_max",c_uint32), + ("id_handle",c_uint32), + ("pstr_data",c_uint32)] +#} +class ent_menuitem_button(Structure): +#{ + _fields_ = [("pstr",c_uint32)] +#} +class ent_menuitem_checkmark(Structure): +#{ + _fields_ = [("id_check",c_uint32), + ("pstr_data",c_uint32), + ("offset",c_float*3)] +#} +class ent_menuitem_page(Structure): +#{ + _fields_ = [("pstr_name",c_uint32), + ("id_entrypoint",c_uint32), + ("id_viewpoint",c_uint32)] +#} +class ent_menuitem_anon_union(Union): +#{ + _fields_ = [("slider",ent_menuitem_slider), + ("button",ent_menuitem_button), + ("checkmark",ent_menuitem_checkmark), + ("page",ent_menuitem_page)] +#} +class ent_menuitem(Structure): +#{ + _fields_ = [("type",c_uint32), ("groups",c_uint32), + ("id_links",c_uint32*4), + ("factive",c_float), ("fvisible",c_float), + #-- TODO: Refactor this into a simple mesh structure + ("transform",mdl_transform), + ("submesh_start",c_uint32),("submesh_count",c_uint32), + ("_u64",c_uint64), + #-- end + ("_anonymous_union", ent_menuitem_anon_union)] #} class ent_camera(Structure): @@ -353,6 +431,14 @@ class ent_camera(Structure): ("fov",c_float)] #} +class ent_worldinfo(Structure): +#{ + _fields_ = [("pstr_name",c_uint32), + ("pstr_author",c_uint32), # unused + ("pstr_desc",c_uint32), # unused + ("timezone",c_float)] +#} + def obj_ent_type( obj ): #{ if obj.type == 'ARMATURE': return 'mdl_armature' @@ -379,7 +465,9 @@ def sr_filter_ent_type( obj, ent_types ): def compile_obj_transform( obj, transform ): #{ co = obj.matrix_world @ Vector((0,0,0)) - q = obj.matrix_local.to_quaternion() + + # This was changed from matrix_local on 09.05.23 + q = obj.matrix_world.to_quaternion() s = obj.scale # Setup transform @@ -426,6 +514,7 @@ def sr_compile_string( s ): index = len( sr_compile.string_data ) sr_compile.string_cache[s] = index + sr_compile.string_data.extend( c_uint32(hash_djb2(s)) ) sr_compile.string_data.extend( s.encode('utf-8') ) sr_compile.string_data.extend( b'\0' ) @@ -614,6 +703,7 @@ def sr_compile_material( mat ): if mat.SR_data.skate_surface: flags |= 0x1 if mat.SR_data.grow_grass: flags |= 0x4 if mat.SR_data.grind_surface: flags |= 0x8 + if mat.SR_data.preview_visibile: flags |= 0x40 #} if mat.SR_data.shader == 'invisible': flags |= 0x10 if mat.SR_data.shader == 'boundary': flags |= (0x10|0x20) @@ -1090,6 +1180,75 @@ def sr_compile_fonts( collection ): #} #} +def sr_compile_menus( collection ): +#{ + print( "[SR1] Compiling menus" ) + groups = [] + + for obj in collection.all_objects:#{ + if obj_ent_type(obj) != 'ent_menuitem': continue + obj_data = obj.SR_data.ent_menuitem[0] + + bitmask = 0x00000000 + + for col in obj.users_collection:#{ + name = col.name + if name not in groups: groups.append( name ) + bitmask |= (0x1 << groups.index(name)) + #} + + item = ent_menuitem() + item.type = int( obj_data.tipo ) + item.groups = bitmask + + compile_obj_transform( obj, item.transform ) + if obj.type == 'MESH':#{ + item.submesh_start, item.submesh_count, _ = \ + sr_compile_mesh_internal( obj ) + #} + + if item.type == 1 or item.type == 2:#{ + item_button = item._anonymous_union.button + item_button.pstr = sr_compile_string( obj_data.string ) + #} + elif item.type == 3:#{ + item_checkmark = item._anonymous_union.checkmark + item_checkmark.pstr_data = sr_compile_string( obj_data.string ) + item_checkmark.id_check = sr_entity_id( obj_data.checkmark ) + delta = obj_data.checkmark.location - obj.location + item_checkmark.offset[0] = delta[0] + item_checkmark.offset[1] = delta[2] + item_checkmark.offset[2] = -delta[1] + #} + elif item.type == 4:#{ + item_slider = item._anonymous_union.slider + item_slider.id_min = sr_entity_id( obj_data.slider_minloc ) + item_slider.id_max = sr_entity_id( obj_data.slider_maxloc ) + item_slider.id_handle = sr_entity_id( obj_data.slider_handle ) + item_slider.pstr_data = sr_compile_string( obj_data.string ) + #} + elif item.type == 5:#{ + item_page = item._anonymous_union.page + item_page.pstr_name = sr_compile_string( obj_data.string ) + item_page.id_entrypoint = sr_entity_id( obj_data.newloc ) + item_page.id_viewpoint = sr_entity_id( obj_data.camera ) + #} + + if obj_data.link0: + item.id_links[0] = sr_entity_id( obj_data.link0 ) + if obj_data.link1: + item.id_links[1] = sr_entity_id( obj_data.link1 ) + if item.type != 4:#{ + if obj_data.link2: + item.id_links[2] = sr_entity_id( obj_data.link2 ) + if obj_data.link3: + item.id_links[3] = sr_entity_id( obj_data.link3 ) + #} + + sr_ent_push( item ) + #} +#} + def sr_compile_armature( obj ): #{ node = mdl_armature() @@ -1282,6 +1441,15 @@ def sr_array_title( arr, name, count, size, offset ): arr.item_size = size #} +def hash_djb2(s): +#{ + picadillo = 5381 + for x in s:#{ + picadillo = (((picadillo << 5) + picadillo) + ord(x)) & 0xFFFFFFFF + #} + return picadillo +#} + def sr_compile( collection ): #{ print( F"[SR] compiler begin ({collection.name}.mdl)" ) @@ -1320,6 +1488,11 @@ def sr_compile( collection ): sr_compile.entities = {} sr_compile.entity_ids = {} + # begin + # ------------------------------------------------------- + + sr_compile_string( "null" ) + mesh_count = 0 for obj in collection.all_objects: #{ if obj.type == 'MESH':#{ @@ -1347,6 +1520,7 @@ def sr_compile( collection ): if ent_type == 'ent_traffic': continue if ent_type == 'ent_font': continue if ent_type == 'ent_font_variant': continue + if ent_type == 'ent_menuitem': continue #-------------------------- print( F'[SR] {i: 3}/{mesh_count} {obj.name:<40}', end='\r' ) @@ -1386,7 +1560,7 @@ def sr_compile( collection ): elif ent_type == 'ent_camera': #{ cam = ent_camera() compile_obj_transform( obj, cam.transform ) - cam.fov = obj.data.angle + cam.fov = obj.data.angle * 45.0 sr_ent_push(cam) #} elif ent_type == 'ent_gate': #{ @@ -1401,7 +1575,8 @@ def sr_compile( collection ): #} #} elif obj_data.tipo == 'nonlocal':#{ - gate.target = sr_compile_string(obj_data.key) + gate.target = 0 + gate.key = sr_compile_string(obj_data.key) gate.type = 2 #} else: gate.type = 0 @@ -1514,17 +1689,49 @@ def sr_compile( collection ): 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.type = int(obj_data.tipo) + if skateshop.type == 0:#{ + boardshop = skateshop._anonymous_union.boards + boardshop.id_display = sr_entity_id( obj_data.mark_display ) + boardshop.id_info = sr_entity_id( obj_data.mark_info ) + boardshop.id_rack = sr_entity_id( obj_data.mark_rack ) + #} + elif skateshop.type == 1:#{ + charshop = skateshop._anonymous_union.character + charshop.id_display = sr_entity_id( obj_data.mark_display ) + charshop.id_info = sr_entity_id( obj_data.mark_info ) + #} + elif skateshop.type == 2:#{ + worldshop = skateshop._anonymous_union.worlds + worldshop.id_display = sr_entity_id( obj_data.mark_display ) + worldshop.id_info = sr_entity_id( obj_data.mark_info ) + #} 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 ) + #} + elif ent_type == 'ent_worldinfo':#{ + worldinfo = ent_worldinfo() + obj_data = obj.SR_data.ent_worldinfo[0] + worldinfo.pstr_name = sr_compile_string( obj_data.name ) + worldinfo.pstr_author = sr_compile_string( obj_data.author ) + worldinfo.pstr_desc = sr_compile_string( obj_data.desc ) + worldinfo.timezone = obj_data.timezone + sr_ent_push( worldinfo ) + #} #} #} - sr_compile_fonts(collection) + sr_compile_menus( collection ) + sr_compile_fonts( collection ) def _children( col ):#{ yield col @@ -1623,7 +1830,7 @@ def sr_compile( collection ): compile_obj_transform( obj, traffic.transform ) traffic.submesh_start, traffic.submesh_count, _ = \ sr_compile_mesh_internal( obj ) - + # find best subsection graph_keys = list(dij.graph) @@ -1715,9 +1922,10 @@ def sr_compile( collection ): path = F"{folder}{collection.name}.mdl" print( path ) + os.makedirs(os.path.dirname(path),exist_ok=True) fp = open( path, "wb" ) header = mdl_header() - header.version = 100 + header.version = 101 sr_array_title( header.arrays, \ 'index', len(file_array_instructions), \ sizeof(mdl_array), header_size ) @@ -2031,6 +2239,7 @@ class SR_MATERIAL_PANEL(bpy.types.Panel): row.prop( active_mat.SR_data, "skate_surface" ) row.prop( active_mat.SR_data, "grind_surface" ) row.prop( active_mat.SR_data, "grow_grass" ) + row.prop( active_mat.SR_data, "preview_visibile" ) #} #} @@ -2621,6 +2830,10 @@ class SR_OBJECT_ENT_TRAFFIC(bpy.types.PropertyGroup): class SR_OBJECT_ENT_SKATESHOP(bpy.types.PropertyGroup): #{ + tipo: bpy.props.EnumProperty( name='Type', + items=[('0','boards',''), + ('1','character',''), + ('2','world','')] ) mark_rack: bpy.props.PointerProperty( \ type=bpy.types.Object, name="Board Rack", \ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker'])) @@ -2635,6 +2848,120 @@ class SR_OBJECT_ENT_SKATESHOP(bpy.types.PropertyGroup): 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_ENT_MENU_ITEM(bpy.types.PropertyGroup): +#{ + link0: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Link 0", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_menuitem'])) + link1: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Link 1", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_menuitem'])) + link2: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Link 2", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_menuitem'])) + link3: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Link 3", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_menuitem'])) + + newloc: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="New location", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_menuitem'])) + camera: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Camera", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera'])) + + slider_minloc: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Slider min", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker'])) + slider_maxloc: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Slider max", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker'])) + slider_handle: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Slider handle", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_menuitem'])) + + checkmark: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Checked", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_menuitem'])) + + string: bpy.props.StringProperty( name="String" ) + tipo: bpy.props.EnumProperty( name='Type', + items=[('0','visual',''), + ('1','event button',''), + ('2','page button',''), + ('3','toggle', ''), + ('4','slider',''), + ('5','page','')]) + + @staticmethod + def sr_inspector( layout, data ): + #{ + data = data[0] + box = layout.box() + box.prop( data, 'tipo' ) + + if data.tipo == '0':#{ + return + #} + elif data.tipo == '1':#{ + box.prop( data, 'string', text='Event' ) + #} + elif data.tipo == '2':#{ + box.prop( data, 'string', text='Page' ) + box.prop( data, 'newloc' ) + #} + elif data.tipo == '3':#{ + box.prop( data, 'string', text='Data (i32)' ) + box.prop( data, 'checkmark' ) + #} + elif data.tipo == '4':#{ + box.prop( data, 'string', text='Data (f32)' ) + box.prop( data, 'slider_minloc' ) + box.prop( data, 'slider_maxloc' ) + box.prop( data, 'slider_handle' ) + box = box.box() + box.label( text="Links" ) + box.prop( data, 'link0', text='v0' ) + box.prop( data, 'link1', text='v1' ) + return + #} + elif data.tipo == '5':#{ + box.prop( data, 'string', text='Page Name' ) + box.prop( data, 'newloc', text='Entry Point' ) + box.prop( data, 'camera', text='Viewpoint' ) + return + #} + + box = box.box() + box.label( text="Links" ) + box.prop( data, 'link0' ) + box.prop( data, 'link1' ) + box.prop( data, 'link2' ) + box.prop( data, 'link3' ) + #} +#} + +class SR_OBJECT_ENT_WORLD_INFO(bpy.types.PropertyGroup): +#{ + name: bpy.props.StringProperty(name="Name") + desc: bpy.props.StringProperty(name="Description") + author: bpy.props.StringProperty(name="Author") + timezone: bpy.props.FloatProperty(name="Timezone(hrs) (UTC0 +hrs)") +#} + class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup): #{ ent_gate: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_GATE) @@ -2647,6 +2974,11 @@ class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup): 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_menuitem: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_MENU_ITEM) + ent_worldinfo: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_WORLD_INFO) + ent_type: bpy.props.EnumProperty( name="Type", items=sr_entity_list, @@ -2753,6 +3085,11 @@ class SR_MATERIAL_PROPERTIES(bpy.types.PropertyGroup): default=False,\ description = "Spawn grass sprites on this surface?" \ ) + preview_visibile: bpy.props.BoolProperty( \ + name="Preview visibile", \ + default=True,\ + description = "Show this material in preview models?" \ + ) blend_offset: bpy.props.FloatVectorProperty( \ name="Blend Offset", \ size=2, \ @@ -3598,21 +3935,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 data.tipo == '0':#{ + cc = (0.0,0.9,0.6) + cc1 = (0.4,0.9,0.2) + cc2 = (0.9,0.6,0.1) + + 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 + #} + elif data.tipo == '1':#{ + rack = None + cc1 = (1.0,0.0,0.0) + cc2 = (1.0,0.5,0.0) + display_cu = Vector((0.4,0.4,2.0))*0.5 + display_co = Vector((0.0,0.0,1.0))*0.5 + info_cu = Vector((1.2,0.01,0.3))*0.5 + info_co = Vector((0.0,0.0,0.0))*0.5 + #} + elif data.tipo == '2':#{ + rack = None + cc1 = (1.0,0.0,0.0) + cc2 = (1.0,0.5,0.0) + display_cu = Vector((1.0,1.0,0.5))*0.5 + display_co = Vector((0.0,0.0,0.5))*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 ) @@ -3621,6 +3979,89 @@ def cv_draw(): 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) + #} + elif ent_type == 'ent_menuitem':#{ + for i,col in enumerate(obj.users_collection):#{ + colour32 = hash_djb2( col.name ) + r = pow(((colour32 ) & 0xff) / 255.0, 2.2 ) + g = pow(((colour32>>8 ) & 0xff) / 255.0, 2.2 ) + b = pow(((colour32>>16) & 0xff) / 255.0, 2.2 ) + cc = (r,g,b) + vs = [None for _ in range(8)] + scale = i*0.02 + for j in range(8):#{ + v0 = Vector([(obj.bound_box[j][z]+\ + ((-1.0 if obj.bound_box[j][z]<0.0 else 1.0)*scale)) \ + for z in range(3)]) + vs[j] = obj.matrix_world @ v0 + #} + indices = [(0,1),(1,2),(2,3),(3,0),(4,5),(5,6),(6,7),(7,4),\ + (0,4),(1,5),(2,6),(3,7)] + for l in indices:#{ + v0 = vs[l[0]] + v1 = vs[l[1]] + cv_view_verts += [(v0[0],v0[1],v0[2])] + cv_view_verts += [(v1[0],v1[1],v1[2])] + cv_view_colours += [cc,cc] + #} + #} + cv_draw_lines() + cc = (1.0,1.0,1.0) + data = obj.SR_data.ent_menuitem[0] + if data.tipo == '4':#{ + if data.slider_minloc and data.slider_maxloc:#{ + v0 = data.slider_minloc.location + v1 = data.slider_maxloc.location + cv_draw_line( v0, v1, cc ) + #} + #} + + colour32 = hash_djb2(obj.name) + r = ((colour32 ) & 0xff) / 255.0 + g = ((colour32>>8 ) & 0xff) / 255.0 + b = ((colour32>>16) & 0xff) / 255.0 + cc = (r,g,b) + origin = obj.location + (Vector((r,g,b))*2.0-Vector((1.0,1.0,1.0)))\ + * 0.04 + + size = 0.01 + + if data.tipo != '0':#{ + if data.tipo == '4':#{ + if data.link0:#{ + cv_draw_arrow( origin, data.link0.location, cc, size ) + #} + if data.link1:#{ + cv_draw_arrow( origin, data.link1.location, cc, size ) + #} + #} + else:#{ + if data.link0:#{ + cv_draw_arrow( origin, data.link0.location, cc, size ) + #} + if data.link1:#{ + cv_draw_arrow( origin, data.link1.location, cc, size ) + #} + if data.link2:#{ + cv_draw_arrow( origin, data.link2.location, cc, size ) + #} + if data.link3:#{ + cv_draw_arrow( origin, data.link3.location, cc, size ) + #} + #} + #} + #} #} #} @@ -3655,6 +4096,8 @@ classes = [ SR_INTERFACE, SR_MATERIAL_PANEL,\ 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_SKATESHOP,\ + SR_OBJECT_ENT_WORKSHOP_PREVIEW,SR_OBJECT_ENT_MENU_ITEM,\ + SR_OBJECT_ENT_WORLD_INFO,\ \ SR_OBJECT_PROPERTIES, SR_LIGHT_PROPERTIES, SR_BONE_PROPERTIES, SR_MESH_PROPERTIES, SR_MATERIAL_PROPERTIES \