fogd-engine/src/core/mesh_render_entity.c

58 lines
1.9 KiB
C

#include "mesh_render_entity.h"
#include "render.h"
START_REFLECT(MeshRenderEntity);
REFLECT_TYPECLASS(MeshRenderEntity, Drop);
REFLECT_TYPECLASS(MeshRenderEntity, SceneNodeEntity);
REFLECT_TYPECLASS(MeshRenderEntity, Renderable);
END_REFLECT(MeshRenderEntity);
impl_SceneNodeEntity_defaults(MeshRenderEntity)
impl_SceneNodeEntity_for(MeshRenderEntity,
MeshRenderEntityEnterTree,
MeshRenderEntityExitTree,
MeshRenderEntity_default_tick
)
impl_Drop_for(MeshRenderEntity,
DestroyMeshRenderEntity
)
impl_Renderable_for(MeshRenderEntity,
MeshRenderEntityDraw
)
SceneNode *CreateMeshRenderEntity(char const *resource_path) {
MeshRenderEntity *self = new(MeshRenderEntity);
GetModelResource(resource_path, &self->model);
GetShaderResource("default_shader", &self->shader);
return CreateSceneNode(MeshRenderEntity_as_SceneNodeEntity(self));
}
void DestroyMeshRenderEntity(MeshRenderEntity *self) {
free(self);
}
void MeshRenderEntityEnterTree(MeshRenderEntity *self) {
SceneNodeEntity parent_entity = self->node->parent->entity;
self->transform = TC_CAST(parent_entity, Transformable);
LoadResource(self->model.handle);
LoadResource(self->shader.handle);
for(size_t i = 0; i < self->model.resource->materialCount; ++i)
self->model.resource->materials[i].shader = *self->shader.resource;
AddRenderable(MeshRenderEntity_as_Renderable(self));
}
void MeshRenderEntityExitTree(MeshRenderEntity *self) {
ReleaseResource(self->model.handle);
ReleaseResource(self->shader.handle);
RemoveRenderable(MeshRenderEntity_as_Renderable(self));
}
void MeshRenderEntityDraw(MeshRenderEntity *self) {
self->model.resource->transform = TransformGetMatrix(self->transform.tc->get_global_transform(self->transform.data));
BeginShaderMode(*self->shader.resource);
DrawModel(*self->model.resource, Vector3Zero(), 1.0f, WHITE);
EndShaderMode();
}