Loading surface objects dynamically

This commit is contained in:
jaburns
2020-10-17 14:03:17 -06:00
parent 43c99a9721
commit bec7b8399c
2 changed files with 65 additions and 24 deletions
+1 -10
View File
@@ -174,16 +174,7 @@ void sm64_global_terminate( void )
uint32_t sm64_load_surface_object( const struct SM64SurfaceObject *surfaceObject ) uint32_t sm64_load_surface_object( const struct SM64SurfaceObject *surfaceObject )
{ {
DEBUG_LOG( return surfaces_load_object( surfaceObject );
"sm64_load_surface_object : %f %f %f : %f %f %f : %d",
surfaceObject->transform.position[0],
surfaceObject->transform.position[1],
surfaceObject->transform.position[2],
surfaceObject->transform.eulerRotation[0],
surfaceObject->transform.eulerRotation[1],
surfaceObject->transform.eulerRotation[2],
surfaceObject->surfaceCount
);
} }
void sm64_move_object( uint32_t id, const struct SM64ObjectTransform *transform ) void sm64_move_object( uint32_t id, const struct SM64ObjectTransform *transform )
+64 -14
View File
@@ -1,13 +1,20 @@
#include "load_surfaces.h" #include "load_surfaces.h"
#include <stdlib.h>
#include <string.h>
#include "include/types.h" #include "include/types.h"
#include "include/surface_terrains.h" #include "include/surface_terrains.h"
#include "shim.h" #include "shim.h"
static uint32_t s_static_surface_count = 0;
static struct Surface *s_static_surface_list = NULL;
static struct Surface *s_loaded_static_surface_list = NULL; static uint32_t s_surface_object_count = 0;
static size_t s_loaded_static_surface_count = 0; static struct SM64SurfaceObject *s_surface_object_list = NULL;
static uint32_t s_dynamic_surface_count = 0;
static struct Surface *s_dynamic_surface_list = NULL;
/** /**
* Returns whether a surface has exertion/moves Mario * Returns whether a surface has exertion/moves Mario
@@ -33,8 +40,20 @@ static s32 surface_has_force(s16 surfaceType) {
return hasForce; return hasForce;
} }
static void read_surface_data( struct Surface *surface, int16_t type, int16_t force, s32 x1, s32 y1, s32 z1, s32 x2, s32 y2, s32 z2, s32 x3, s32 y3, s32 z3) static void engine_surface_from_lib_surface( struct Surface *surface, const struct SM64Surface *libSurf, const struct SM64ObjectTransform *transform )
{ {
int16_t type = libSurf->type;
int16_t force = libSurf->force;
s32 x1 = libSurf->vertices[0][0];
s32 y1 = libSurf->vertices[0][1];
s32 z1 = libSurf->vertices[0][2];
s32 x2 = libSurf->vertices[1][0];
s32 y2 = libSurf->vertices[1][1];
s32 z2 = libSurf->vertices[1][2];
s32 x3 = libSurf->vertices[2][0];
s32 y3 = libSurf->vertices[2][1];
s32 z3 = libSurf->vertices[2][2];
s32 maxY, minY; s32 maxY, minY;
f32 nx, ny, nz; f32 nx, ny, nz;
f32 mag; f32 mag;
@@ -70,6 +89,8 @@ static void read_surface_data( struct Surface *surface, int16_t type, int16_t fo
ny *= mag; ny *= mag;
nz *= mag; nz *= mag;
// TODO apply tranform
surface->vertex1[0] = x1; surface->vertex1[0] = x1;
surface->vertex2[0] = x2; surface->vertex2[0] = x2;
surface->vertex3[0] = x3; surface->vertex3[0] = x3;
@@ -107,32 +128,61 @@ static void read_surface_data( struct Surface *surface, int16_t type, int16_t fo
return surface; return surface;
} }
static void update_dynamic_surface_list( void )
{
if( s_dynamic_surface_list != NULL )
free( s_dynamic_surface_list );
s_dynamic_surface_count = 0;
s_dynamic_surface_list = NULL;
for( int i = 0; i < s_surface_object_count; ++i )
{
for( int j = 0; j < s_surface_object_list[i].surfaceCount; ++j )
{
s_dynamic_surface_count++;
s_dynamic_surface_list = realloc( s_dynamic_surface_list, s_dynamic_surface_count * sizeof( struct Surface ));
engine_surface_from_lib_surface( &s_dynamic_surface_list[s_dynamic_surface_count - 1], &s_surface_object_list[i].surfaces[j], &s_surface_object_list[i].transform );
}
}
}
struct Surface *loaded_surface_get_at_index( uint32_t index ) struct Surface *loaded_surface_get_at_index( uint32_t index )
{ {
return &s_loaded_static_surface_list[ index ]; if( index < s_static_surface_count )
return &s_static_surface_list[ index ];
return &s_dynamic_surface_list[ index - s_static_surface_count ];
} }
uint32_t loaded_surface_get_count() uint32_t loaded_surface_get_count()
{ {
return s_loaded_static_surface_count; return s_static_surface_count + s_dynamic_surface_count;
} }
void surfaces_load_static_libsm64( const struct SM64Surface *surfaceArray, uint32_t numSurfaces ) void surfaces_load_static_libsm64( const struct SM64Surface *surfaceArray, uint32_t numSurfaces )
{ {
s_loaded_static_surface_count = numSurfaces; s_static_surface_count = numSurfaces;
s_loaded_static_surface_list = malloc( sizeof( struct Surface ) * numSurfaces ); s_static_surface_list = malloc( sizeof( struct Surface ) * numSurfaces );
for( int i = 0; i < numSurfaces; ++i ) for( int i = 0; i < numSurfaces; ++i )
read_surface_data( engine_surface_from_lib_surface( &s_static_surface_list[i], &surfaceArray[i], NULL );
&s_loaded_static_surface_list[i], surfaceArray[i].type, surfaceArray[i].force,
surfaceArray[i].vertices[0][0], surfaceArray[i].vertices[0][1], surfaceArray[i].vertices[0][2],
surfaceArray[i].vertices[1][0], surfaceArray[i].vertices[1][1], surfaceArray[i].vertices[1][2],
surfaceArray[i].vertices[2][0], surfaceArray[i].vertices[2][1], surfaceArray[i].vertices[2][2]
);
} }
uint32_t surfaces_load_object( const struct SM64SurfaceObject *surfaceObject ) uint32_t surfaces_load_object( const struct SM64SurfaceObject *surfaceObject )
{ {
return 0; uint32_t idx = s_surface_object_count;
s_surface_object_count++;
s_surface_object_list = realloc( s_surface_object_list, s_surface_object_count * sizeof( struct SM64SurfaceObject ));
struct SM64SurfaceObject *obj = &s_surface_object_list[idx];
obj->transform = surfaceObject->transform;
obj->surfaceCount = surfaceObject->surfaceCount;
obj->surfaces = malloc( obj->surfaceCount * sizeof( struct SM64Surface ));
memcpy( obj->surfaces, surfaceObject->surfaces, obj->surfaceCount * sizeof( struct SM64Surface ));
update_dynamic_surface_list();
return idx;
} }