#include "common.h"
-#define MDL_VERSION_NR 100
+#define MDL_VERSION_NR 101
enum mdl_shader
{
k_material_flag_grow_grass = 0x00000004,
k_material_flag_grindable = 0x00000008,
k_material_flag_invisible = 0x00000010,
- k_material_flag_boundary = 0x00000020
+ k_material_flag_boundary = 0x00000020,
+ k_material_flag_preview_visibile = 0x00000040
};
#pragma pack(push,1)
v4f q;
};
+static void transform_identity( mdl_transform *transform )
+{
+ v3_zero( transform->co );
+ q_identity( transform->q );
+ v3_fill( transform->s, 1.0f );
+}
+
+static void mdl_transform_vector( mdl_transform *transform, v3f vec, v3f dest )
+{
+ v3_mul( transform->s, vec, dest );
+ q_mulv( transform->q, dest, dest );
+}
+
+static void mdl_transform_point( mdl_transform *transform, v3f co, v3f dest )
+{
+ mdl_transform_vector( transform, co, dest );
+ v3_add( transform->co, dest, dest );
+}
+
+static void mdl_transform_mul( mdl_transform *a, mdl_transform *b,
+ mdl_transform *d )
+{
+ mdl_transform_point( a, b->co, d->co );
+ q_mul( a->q, b->q, d->q );
+ q_normalize( d->q );
+ v3_mul( a->s, b->s, d->s );
+}
+
struct mdl_material
{
u32 pstr_name,
u32 size = arr->item_size*arr->item_count;
return vg_align8(size);
}
- else
- return 0;
+ else return 0;
}
VG_STATIC const char *mdl_pstr( mdl_context *mdl, u32 pstr );
fseek( mdl->file, mdl->pack_base_offset+info->pack_offset, SEEK_SET );
u64 l = fread( dst, info->pack_size, 1, mdl->file );
- if( l != 1 )
- mdl_load_fatal_corrupt( mdl );
+ if( l != 1 ) mdl_load_fatal_corrupt( mdl );
}
/* TODO: Rename these */
-VG_STATIC
-void mdl_load_array_file_buffer( mdl_context *mdl, mdl_array *arr,
- void *buffer )
+VG_STATIC void mdl_load_array_file_buffer( mdl_context *mdl, mdl_array *arr,
+ void *buffer )
{
if( arr->item_count ){
fseek( mdl->file, arr->file_offset, SEEK_SET );
u64 l = fread( buffer, arr->item_size*arr->item_count, 1, mdl->file );
- if( l != 1 )
- mdl_load_fatal_corrupt( mdl );
+ if( l != 1 ) mdl_load_fatal_corrupt( mdl );
}
}
if( l != 1 )
mdl_load_fatal_corrupt( mdl );
- if( mdl->info.version != MDL_VERSION_NR ){
+ if( mdl->info.version < MDL_VERSION_NR ){
vg_warn( "For model: %s\n", path );
vg_warn( " version: %u (current: %u)\n", mdl->info.version,
MDL_VERSION_NR );
VG_STATIC const char *mdl_pstr( mdl_context *mdl, u32 pstr )
{
- return mdl_arritm( &mdl->strings, pstr );
+ return ((char *)mdl_arritm( &mdl->strings, pstr )) + 4;
}
+
+VG_STATIC int
+mdl_pstreq( mdl_context *mdl, u32 pstr, const char *str, u32 djb2 )
+{
+ u32 hash = *((u32 *)mdl_arritm( &mdl->strings, pstr ));
+ if( hash == djb2 ){
+ if( !strcmp( str, mdl_pstr( mdl, pstr ))) return 1;
+ else return 0;
+ }
+ else return 0;
+}
+
+#define MDL_CONST_PSTREQ( MDL, Q, CONSTSTR )\
+ mdl_pstreq( MDL, Q, CONSTSTR, vg_strdjb2( CONSTSTR ) )
+
/*
* Simple mesh interface for OpenGL
* ----------------------------------------------------------------------------