80 lines
2.0 KiB
C++
80 lines
2.0 KiB
C++
|
|
#include "object.h"
|
||
|
|
#include "../lib/math.h"
|
||
|
|
#include "../lib/geometry.h"
|
||
|
|
#include "../platform.h"
|
||
|
|
#include "string.h"
|
||
|
|
#include "state.h"
|
||
|
|
#include "2d.h"
|
||
|
|
|
||
|
|
|
||
|
|
r_object r_object_create(u64 count, r_mesh **meshes, r_material **materials, v3 position, v3 rotation, v3 scale)
|
||
|
|
{
|
||
|
|
r_object object;
|
||
|
|
|
||
|
|
object.meshes = (r_mesh**)p_alloc(count * sizeof(r_mesh*));
|
||
|
|
object.mesh_material = (r_material**)p_alloc(count * sizeof(r_material*));
|
||
|
|
object.mesh_local_transform = (m4*)p_alloc(count * sizeof(m4));
|
||
|
|
|
||
|
|
memcpy(object.meshes, meshes, count * sizeof(r_mesh*));
|
||
|
|
memcpy(object.mesh_material, materials, count * sizeof(r_material*));
|
||
|
|
for(u64 i = 0; i < count; i++)
|
||
|
|
object.mesh_local_transform[i] = m4_identity;
|
||
|
|
|
||
|
|
object.count = count;
|
||
|
|
|
||
|
|
object.position = position;
|
||
|
|
object.rotation = rotation;
|
||
|
|
object.scale = scale;
|
||
|
|
|
||
|
|
object.has_shadow = true;
|
||
|
|
|
||
|
|
return object;
|
||
|
|
}
|
||
|
|
|
||
|
|
r_object r_object_allocate(u64 count)
|
||
|
|
{
|
||
|
|
r_object object;
|
||
|
|
|
||
|
|
object.meshes = (r_mesh**)p_alloc(count * sizeof(r_mesh*));
|
||
|
|
object.mesh_material = (r_material**)p_alloc(count * sizeof(r_material*));
|
||
|
|
object.mesh_local_transform = (m4*)p_alloc(count * sizeof(m4));
|
||
|
|
|
||
|
|
for(u64 i = 0; i < count; i++)
|
||
|
|
object.mesh_local_transform[i] = m4_identity;
|
||
|
|
|
||
|
|
object.count = count;
|
||
|
|
|
||
|
|
object.position = v3{0,0,0};
|
||
|
|
object.rotation = v3{0,0,0};
|
||
|
|
object.scale = v3{1,1,1};
|
||
|
|
|
||
|
|
object.has_shadow = true;
|
||
|
|
|
||
|
|
return object;
|
||
|
|
}
|
||
|
|
|
||
|
|
void r_object_destroy(r_object *object)
|
||
|
|
{
|
||
|
|
p_free(object->mesh_material);
|
||
|
|
p_free(object->meshes);
|
||
|
|
p_free(object->mesh_local_transform);
|
||
|
|
object->mesh_material = NULL;
|
||
|
|
object->meshes = NULL;
|
||
|
|
object->mesh_local_transform = NULL;
|
||
|
|
object->count = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
m4 r_object_transform_matrix(r_object *object)
|
||
|
|
{
|
||
|
|
// @Performance: replace with rototranslation matrix
|
||
|
|
return translation_v3(object->position) * rotation_v3(object->rotation) * scale_v3(object->scale);
|
||
|
|
}
|
||
|
|
|
||
|
|
m4 r_object_mesh_transform_matrix(r_object *object, u64 mesh_i)
|
||
|
|
{
|
||
|
|
// @Performance: replace with rototranslation matrix
|
||
|
|
if(object->mesh_local_transform)
|
||
|
|
return r_object_transform_matrix(object) * object->mesh_local_transform[mesh_i];
|
||
|
|
return r_object_transform_matrix(object);
|
||
|
|
}
|