124 lines
4.3 KiB
C
124 lines
4.3 KiB
C
// A bunch of component definitions that might not
|
|
// be useful in general, but who knows?
|
|
|
|
#ifndef __HALOO3D_ECSCOMP_H
|
|
#define __HALOO3D_ECSCOMP_H
|
|
|
|
#include "ecs.h"
|
|
#include "haloo3d/haloo3d.h"
|
|
|
|
// A component that simply points back to an object instance. If combined
|
|
// with movement, will pull pos from objin at start of frame, then write
|
|
// pos back to obj at end of frame.
|
|
typedef haloo3d_obj_instance *ecs_objin;
|
|
|
|
// Like objin, this component simply points to a camera. It will set the
|
|
// position AND rotation at the start of the frame, and pull the pos/
|
|
// rotation back into the camera at the end.
|
|
typedef haloo3d_camera *ecs_camera;
|
|
|
|
typedef struct {
|
|
struct vec3 pos;
|
|
struct vec3 dst;
|
|
int timer;
|
|
} ecs_moveto;
|
|
|
|
typedef struct {
|
|
struct vec2 rot;
|
|
struct vec2 dstrot;
|
|
int timer;
|
|
} ecs_rotateto;
|
|
|
|
// Move object position into moveto
|
|
// static void sys_ecs_objin_moveto(haloo_ecs *ecs, hecs_eidt id, hecs_cidt
|
|
// oiid,
|
|
// hecs_cidt mtid) {
|
|
// eprintf("Objin moveto %ld, %ld\n", oiid, mtid);
|
|
// ecs_moveto *mt = HECS_ENTITYCOMPONENT(ecs_moveto *, id, mtid, ecs);
|
|
// ecs_objin *oi = HECS_ENTITYCOMPONENT(ecs_objin *, id, oiid, ecs);
|
|
// eprintf("Objin moveto END\n");
|
|
// mt->pos = (*oi)->pos;
|
|
// }
|
|
|
|
// // Move camera position into moveto
|
|
// static void sys_ecs_camera_moveto(haloo_ecs *ecs, hecs_eidt id, hecs_cidt
|
|
// camid,
|
|
// hecs_cidt mtid) {
|
|
// // eprintf("Camera moveto %ld, %ld\n", camid, mtid);
|
|
// ecs_moveto *mt = HECS_ENTITYCOMPONENT(ecs_moveto *, id, mtid, ecs);
|
|
// ecs_camera *cam = HECS_ENTITYCOMPONENT(ecs_camera *, id, camid, ecs);
|
|
// // eprintf("Camera moveto END\n");
|
|
// mt->pos = (*cam)->pos;
|
|
// }
|
|
//
|
|
// static void sys_ecs_camera_rotateto(haloo_ecs *ecs, hecs_eidt id,
|
|
// hecs_cidt camid, hecs_cidt rtid) {
|
|
// ecs_rotateto *rt = HECS_ENTITYCOMPONENT(ecs_rotateto *, id, rtid, ecs);
|
|
// ecs_camera *cam = HECS_ENTITYCOMPONENT(ecs_camera *, id, camid, ecs);
|
|
// rt->rot.x = (*cam)->yaw;
|
|
// rt->rot.y = (*cam)->pitch;
|
|
// }
|
|
|
|
static void sys_ecs_moveto(
|
|
ecs_moveto *mt) { // haloo_ecs *ecs, hecs_eidt id, hecs_cidt mtid) {
|
|
// ecs_moveto *mt = HECS_ENTITYCOMPONENT(ecs_moveto *, id, mtid, ecs);
|
|
if (mt->timer <= 0) {
|
|
mt->pos = mt->dst;
|
|
return;
|
|
}
|
|
mfloat_t xdiff = mt->dst.x - mt->pos.x;
|
|
mfloat_t ydiff = mt->dst.y - mt->pos.y;
|
|
mfloat_t zdiff = mt->dst.z - mt->pos.z;
|
|
mt->pos.x += xdiff / mt->timer;
|
|
mt->pos.y += ydiff / mt->timer;
|
|
mt->pos.z += zdiff / mt->timer;
|
|
mt->timer--;
|
|
}
|
|
|
|
static void sys_ecs_rotateto(
|
|
ecs_rotateto *rt) { // haloo_ecs *ecs, hecs_eidt id, hecs_cidt rtid) {
|
|
// static void sys_ecs_rotateto(haloo_ecs *ecs, hecs_eidt id, hecs_cidt rtid)
|
|
// { ecs_rotateto *rt = HECS_ENTITYCOMPONENT(ecs_rotateto *, id, rtid, ecs);
|
|
if (rt->timer <= 0) {
|
|
rt->rot = rt->dstrot;
|
|
return;
|
|
}
|
|
mfloat_t xdiff = rt->dstrot.x - rt->rot.x;
|
|
mfloat_t ydiff = rt->dstrot.y - rt->rot.y;
|
|
rt->rot.x += xdiff / rt->timer;
|
|
rt->rot.y += ydiff / rt->timer;
|
|
rt->timer--;
|
|
}
|
|
|
|
// // Move movement pos back into object
|
|
// static void sys_ecs_moveto_objin(haloo_ecs *ecs, hecs_eidt id, hecs_cidt
|
|
// mtid,
|
|
// hecs_cidt oiid) {
|
|
// ecs_moveto *mt = HECS_ENTITYCOMPONENT(ecs_moveto *, id, mtid, ecs);
|
|
// ecs_objin *oi = HECS_ENTITYCOMPONENT(ecs_objin *, id, oiid, ecs);
|
|
// (*oi)->pos = mt->pos;
|
|
// }
|
|
|
|
// Move movement pos back into camera
|
|
// static void sys_ecs_moveto_camera(haloo_ecs *ecs, hecs_eidt id, hecs_cidt
|
|
// mtid, hecs_cidt camid) {
|
|
static void sys_ecs_moveto_camera(ecs_moveto *mt, ecs_camera *cam) {
|
|
// haloo_ecs *ecs, hecs_eidt id, hecs_cidt mtid, hecs_cidt camid) {
|
|
// ecs_moveto *mt = HECS_ENTITYCOMPONENT(ecs_moveto *, id, mtid, ecs);
|
|
// ecs_camera *cam = HECS_ENTITYCOMPONENT(ecs_camera *, id, camid, ecs);
|
|
(*cam)->pos = mt->pos;
|
|
}
|
|
|
|
// Move rotation back into camera
|
|
// static void sys_ecs_rotateto_camera(haloo_ecs *ecs, hecs_eidt id, hecs_cidt
|
|
// rtid, hecs_cidt camid) {
|
|
static void sys_ecs_rotateto_camera(ecs_rotateto *rt, ecs_camera *cam) {
|
|
// haloo_ecs *ecs, hecs_eidt id, hecs_cidt rtid, hecs_cidt camid) {
|
|
// ecs_rotateto *rt = HECS_ENTITYCOMPONENT(ecs_rotateto *, id, rtid, ecs);
|
|
// ecs_camera *cam = HECS_ENTITYCOMPONENT(ecs_camera *, id, camid, ecs);
|
|
(*cam)->yaw = rt->rot.x;
|
|
(*cam)->pitch = rt->rot.y;
|
|
}
|
|
|
|
#endif
|