fix crash invalid input
authorhgn <hgodden00@gmail.com>
Sun, 24 Apr 2022 15:28:29 +0000 (16:28 +0100)
committerhgn <hgodden00@gmail.com>
Sun, 24 Apr 2022 15:28:29 +0000 (16:28 +0100)
__init__.py
config.py
cxr/cxr.h

index dfc7f3a31db749ffdc797d9d2f5adbcc6d73da46..b136c396e93e1fb90d7a5c119356b57a00fd8fe4 100644 (file)
@@ -624,6 +624,7 @@ def ent_prop(context):
 
       kvs['origin'] = [pos[1],-pos[0],pos[2]]
       kvs['angles'] = [0,180,0]
+      kvs['uniformscale'] = 1.0
    else:
       kvs = cxr_baseclass([ent_origin],{})
       target = context['object'].instance_collection
@@ -636,10 +637,15 @@ def ent_prop(context):
       angle[2] = euler[0]
       
       kvs['angles'] = angle
+      kvs['uniformscale'] = obj.scale[0]
+   
+   if target.cxr_data.shadow_caster:
+      kvs['enablelightbounce'] = 1
+      kvs['disableshadows'] = 0
+   else:
+      kvs['enablelightbounce'] = 0
+      kvs['disableshadows'] = 1
 
-
-   kvs['enablelightbounce'] = 1
-   kvs['disableshadows'] = 0
    kvs['fademindist'] = -1
    kvs['fadescale'] = 1
    kvs['model'] = F"{asset_path('models',target)}.mdl".lower()
@@ -647,7 +653,6 @@ def ent_prop(context):
    kvs['rendercolor'] = [255, 255, 255]
    kvs['skin'] = 0
    kvs['solid'] = 6
-   kvs['uniformscale'] = 1.0
 
    return kvs
 
@@ -1346,8 +1351,16 @@ def cxr_export_modelsrc( mdl, origin, asset_dir, project_name, transform ):
       o.write(F'$scale {transform["scale"]/100.0}\n')
       o.write(F'$body _ "{uid}_ref.fbx"\n')
       o.write(F'$staticprop\n')
-      o.write(F'$origin {origin[0]} {origin[1]} {origin[2]}\n')
+      o.write(F'$origin {origin[0]:.6f} {origin[1]:.6f} {origin[2]:.6f}\n')
       
+      if mdl.cxr_data.preserve_order:
+         o.write(F"$preservetriangleorder\n")
+
+      if mdl.cxr_data.texture_shadows:
+         o.write(F"$casttextureshadows\n")
+
+      o.write(F"$surfaceprop {mdl.cxr_data.surfaceprop}\n")
+
       if vphys != None:
          o.write(F'$collisionmodel "{uid}_phy.fbx"\n')
          o.write("{\n")
@@ -1441,7 +1454,8 @@ class CXR_PREVIEW_OPERATOR(bpy.types.Operator):
                "Internal-Fail",\
                "Non-Coplanar",\
                "Non-Convex Polygon",\
-               "Bad Result"]\
+               "Bad Result",\
+               "Invalid-Input"]\
                [err.value]
 
          if static.RUNNING:
@@ -2204,6 +2218,25 @@ class CXR_LIGHT_PANEL(bpy.types.Panel):
          elif active_object.type == 'LIGHT_PROBE':
             layout.prop( properties, "size" )
 
+class CXR_COLLECTION_PANEL(bpy.types.Panel):
+   bl_label = "Source Settings"
+   bl_idname = "COL_PT_cxr"
+   bl_space_type = 'PROPERTIES'
+   bl_region_type = 'WINDOW'
+   bl_context = "collection"
+   
+   def draw(self, context):
+      layout = self.layout
+      scene = context.scene
+      
+      active_collection = bpy.context.collection
+      
+      if active_collection != None:
+         layout.prop( active_collection.cxr_data, "shadow_caster" )
+         layout.prop( active_collection.cxr_data, "texture_shadows" )
+         layout.prop( active_collection.cxr_data, "preserve_order" )
+         layout.prop( active_collection.cxr_data, "surfaceprop" )
+
 # Settings groups
 # ------------------------------------------------------------------------------
 
@@ -2277,6 +2310,10 @@ class CXR_ENTITY_SETTINGS(bpy.types.PropertyGroup):
 class CXR_MODEL_SETTINGS(bpy.types.PropertyGroup):
    last_hash: bpy.props.StringProperty( name="" )
    asset_id: bpy.props.IntProperty(name="vmf_settings",default=0)
+   shadow_caster: bpy.props.BoolProperty( name="Shadow caster", default=True )
+   texture_shadows: bpy.props.BoolProperty( name="Texture Shadows", default=False )
+   preserve_order: bpy.props.BoolProperty( name="Preserve Order", default=False )
+   surfaceprop: bpy.props.StringProperty( name="Suface prop",default="default" )
 
 class CXR_SCENE_SETTINGS(bpy.types.PropertyGroup):
    project_name: bpy.props.StringProperty( name="Project Name" )
@@ -2318,7 +2355,7 @@ classes = [ CXR_RELOAD, CXR_DEV_OPERATOR, CXR_INTERFACE, \
             CXR_LIGHT_SETTINGS, CXR_SCENE_SETTINGS, CXR_DETECT_COMPILERS,\
             CXR_ENTITY_PANEL, CXR_LIGHT_PANEL, CXR_PREVIEW_OPERATOR,\
             CXR_VIEW3D, CXR_COMPILER_CHAIN, CXR_RESET_HASHES,\
-            CXR_COMPILE_MATERIAL]
+            CXR_COMPILE_MATERIAL, CXR_COLLECTION_PANEL ]
 
 vmt_param_dynamic_class = None
 
index 983b1cab567525d3e21f4b3c071288e9e44e9f63..5ee294d8d77efa50ab8d997b12b307845678d6ed 100644 (file)
--- a/config.py
+++ b/config.py
@@ -144,6 +144,12 @@ cxr_shader_params = \
             "name": "Fresnel Ranges",
             "type": "vector",
             "default":(1.0,1.0,1.0)
+         },
+         "$basemapalphaphongmask":
+         {
+            "name": "Base alpha mask",
+            "type": "bool",
+            "default": False
          }
       },
       "$envmap":
@@ -183,6 +189,12 @@ cxr_shader_params = \
             "type": "bool",
             "default": False
          }
+      },
+      "$selfillum":
+      {
+         "name": "Emission",
+         "type": "bool",
+         "default": False
       }
    },
    "Transparency":
@@ -282,5 +294,16 @@ cxr_entities = \
    {
       "allow": ('MESH',),
       "keyvalues": {}
+   },
+   "trigger_hurt":
+   {
+      "allow": ('MESH',),
+      "keyvalues":
+      {
+         "damage": { "type":"int", "default": 10},
+         "damagecap": { "type":"int", "default": 20},
+         "damagetype": { "type":"int", "default": 0},
+         "damagemodel": { "type":"int", "default": 0}
+      }
    }
 }
index c3f7d868d71262110ce28bb89089e4f2c0a8cb28..a6643131f6f26656657e7e6441c9311c96531944 100644 (file)
--- a/cxr/cxr.h
+++ b/cxr/cxr.h
@@ -280,7 +280,8 @@ enum cxr_soliderr
    k_soliderr_degenerate_implicit,
    k_soliderr_non_coplanar_vertices,
    k_soliderr_non_convex_poly,
-   k_soliderr_bad_result
+   k_soliderr_bad_result,
+   k_soliderr_invalid_input
 };
 
 /*
@@ -2278,6 +2279,16 @@ CXR_API void cxr_free_tri_mesh( cxr_tri_mesh *mesh )
 
 CXR_API cxr_world *cxr_decompose( cxr_static_mesh *src, i32 *perrcode )
 {
+   /* Make sure data is in the mesh and isn't empty */
+   if( !src->edge_count || !src->loop_count || !src->poly_count )
+   {
+      cxr_log( "Error %d\n", k_soliderr_invalid_input );
+      if( perrcode )
+         *perrcode = k_soliderr_invalid_input;
+
+      return NULL;
+   }
+
    u32 error = 0x00;
    cxr_world *world = malloc( sizeof(*world) );