transforms

This commit is contained in:
John Alanbrook 2023-11-30 22:24:26 +00:00
parent 6b28e60e3a
commit de8c8c9168
6 changed files with 43 additions and 45 deletions

View file

@ -76,7 +76,7 @@ else
endif endif
endif endif
CPPFLAGS += -DHAVE_CEIL -DCP_USE_CGTYPES=0 -DCP_USE_DOUBLES=0 -DTINYSPLINE_FLOAT_PRECISION -DHAVE_FLOOR -DHAVE_FMOD -DHAVE_LRINT -DHAVE_LRINTF $(includeflag) -MD $(WARNING_FLAGS) -I. -DVER=\"$(VER)\" -DINFO=\"$(INFO)\" -DENABLE_SINC_MEDIUM_CONVERTER -DENABLE_SINC_FAST_CONVERTER CPPFLAGS += -DHAVE_CEIL -DCP_USE_CGTYPES=0 -DCP_USE_DOUBLES=0 -DTINYSPLINE_FLOAT_PRECISION -DHAVE_FLOOR -DHAVE_FMOD -DHAVE_LRINT -DHAVE_LRINTF $(includeflag) -MD $(WARNING_FLAGS) -I. -DVER=\"$(VER)\" -DINFO=\"$(INFO)\" #-DENABLE_SINC_MEDIUM_CONVERTER -DENABLE_SINC_FAST_CONVERTER
# ENABLE_SINC_[BEST|FAST|MEDIUM]_CONVERTER # ENABLE_SINC_[BEST|FAST|MEDIUM]_CONVERTER
# default, fast and medium available in game at runtime; best available in editor # default, fast and medium available in game at runtime; best available in editor

View file

@ -141,7 +141,8 @@ var gameobject = {
this.set_worldpos(this.level.this2world(x)); this.set_worldpos(this.level.this2world(x));
}, },
get pos() { get pos() { return cmd
if (!this.level) return this.worldpos(); if (!this.level) return this.worldpos();
return this.level.world2this(this.worldpos()); return this.level.world2this(this.worldpos());
}, },

View file

@ -44,24 +44,35 @@ struct gameobject *shape2go(cpShape *shape)
return id2go(shape2gameobject(shape)); return id2go(shape2gameobject(shape));
} }
HMM_Vec2 go2pos(struct gameobject *go) HMM_Vec2 go_pos(struct gameobject *go)
{ {
cpVect p = cpBodyGetPosition(go->body); cpVect p = cpBodyGetPosition(go->body);
return (HMM_Vec2){p.x, p.y}; return (HMM_Vec2){p.x, p.y};
} }
HMM_Vec2 go_worldpos(struct gameobject *go)
{
HMM_Vec2 ret;
ret.cp = cpBodyGetPosition(go->body);
return ret;
}
float go_angle(struct gameobject *go) { return go_worldangle(go); }
float go_worldangle(struct gameobject *go) { return cpBodyGetAngle(go->body); }
float go2angle(struct gameobject *go) { return cpBodyGetAngle(go->body); } float go2angle(struct gameobject *go) { return cpBodyGetAngle(go->body); }
transform3d go2t3(gameobject *go) transform3d go2t3(gameobject *go)
{ {
transform3d t; transform3d t;
HMM_Vec2 p = go2pos(go); HMM_Vec2 p = go_pos(go);
t.pos.X = p.X; t.pos.X = p.X;
t.pos.Y = p.Y; t.pos.Y = p.Y;
t.pos.Z = go->drawlayer; t.pos.Z = go->drawlayer;
t.scale = go->scale; t.scale = go->scale;
t.scale.Z = go->scale.X; t.scale.Z = go->scale.X;
t.rotation = HMM_QFromAxisAngle_RH(vFWD, go2angle(go)); t.rotation = HMM_QFromAxisAngle_RH(vFWD, go_angle(go));
t.rotation = HMM_MulQ(HMM_QFromAxisAngle_RH(vRIGHT, -t.pos.Y/100), t.rotation); t.rotation = HMM_MulQ(HMM_QFromAxisAngle_RH(vRIGHT, -t.pos.Y/100), t.rotation);
t.rotation = HMM_MulQ(HMM_QFromAxisAngle_RH(vUP, t.pos.X/100), t.rotation); t.rotation = HMM_MulQ(HMM_QFromAxisAngle_RH(vUP, t.pos.X/100), t.rotation);
return t; return t;

View file

@ -35,8 +35,9 @@ struct component;
typedef struct gameobject { typedef struct gameobject {
cpBodyType bodytype; cpBodyType bodytype;
cpBody *body; /* NULL if this object is dead; has 2d position and rotation, relative to global 0 */
HMM_Vec3 scale; /* local */
int next; int next;
HMM_Vec3 scale; /* local */
float mass; float mass;
float f; /* friction */ float f; /* friction */
float e; /* elasticity */ float e; /* elasticity */
@ -48,7 +49,6 @@ typedef struct gameobject {
float damping; float damping;
unsigned int layer; unsigned int layer;
cpShapeFilter filter; cpShapeFilter filter;
cpBody *body; /* NULL if this object is dead */
int id; int id;
struct phys_cbs cbs; struct phys_cbs cbs;
struct shape_cb *shape_cbs; struct shape_cb *shape_cbs;
@ -82,7 +82,11 @@ HMM_Mat3 t_world2go(struct gameobject *go);
HMM_Mat4 t3d_go2world(struct gameobject *go); HMM_Mat4 t3d_go2world(struct gameobject *go);
HMM_Mat4 t3d_world2go(struct gameobject *go); HMM_Mat4 t3d_world2go(struct gameobject *go);
HMM_Vec2 go2pos(struct gameobject *go); HMM_Vec2 go_pos(struct gameobject *go);
HMM_Vec2 go_worldpos(struct gameobject *go);
//float go_angle(struct gameobject *go);
float go_worldangle(struct gameobject *go);
float go2angle(struct gameobject *go); float go2angle(struct gameobject *go);
HMM_Vec2 goscale(struct gameobject *go, HMM_Vec2 pos); HMM_Vec2 goscale(struct gameobject *go, HMM_Vec2 pos);

View file

@ -7,40 +7,14 @@ const transform2d t2d_unit = {
.angle = 0 .angle = 0
}; };
HMM_Vec3 trans_forward(const transform3d *const trans) HMM_Vec3 trans_forward(const transform3d *const trans) { return HMM_QVRot(vFWD, trans->rotation); }
{ HMM_Vec3 trans_back(const transform3d *trans) { return HMM_QVRot(vBKWD, trans->rotation); }
return HMM_QVRot(vFWD, trans->rotation); HMM_Vec3 trans_up(const transform3d *trans) { return HMM_QVRot(vUP, trans->rotation); }
} HMM_Vec3 trans_down(const transform3d *trans) { return HMM_QVRot(vDOWN, trans->rotation); }
HMM_Vec3 trans_right(const transform3d *trans) { return HMM_QVRot(vRIGHT, trans->rotation); }
HMM_Vec3 trans_left(const transform3d *trans) { return HMM_QVRot(vLEFT, trans->rotation); }
HMM_Vec3 trans_back(const transform3d *trans) HMM_Vec2 mat_t_pos(HMM_Mat3 m, HMM_Vec2 pos) { return HMM_MulM3V3(m, (HMM_Vec3){pos.x, pos.y, 0}).XY; }
{
return HMM_QVRot(vBKWD, trans->rotation);
}
HMM_Vec3 trans_up(const transform3d *trans)
{
return HMM_QVRot(vUP, trans->rotation);
}
HMM_Vec3 trans_down(const transform3d *trans)
{
return HMM_QVRot(vDOWN, trans->rotation);
}
HMM_Vec3 trans_right(const transform3d *trans)
{
return HMM_QVRot(vRIGHT, trans->rotation);
}
HMM_Vec3 trans_left(const transform3d *trans)
{
return HMM_QVRot(vLEFT, trans->rotation);
}
HMM_Vec2 mat_t_pos(HMM_Mat3 m, HMM_Vec2 pos)
{
return HMM_MulM3V3(m, (HMM_Vec3){pos.x, pos.y, 0}).XY;
}
HMM_Vec2 mat_t_dir(HMM_Mat3 m, HMM_Vec2 dir) HMM_Vec2 mat_t_dir(HMM_Mat3 m, HMM_Vec2 dir)
{ {
@ -48,10 +22,13 @@ HMM_Vec2 mat_t_dir(HMM_Mat3 m, HMM_Vec2 dir)
return HMM_MulM3V3(m, (HMM_Vec3){dir.x, dir.y, 1}).XY; return HMM_MulM3V3(m, (HMM_Vec3){dir.x, dir.y, 1}).XY;
} }
HMM_Vec3 mat3_t_pos(HMM_Mat4 m, HMM_Vec3 pos) HMM_Vec2 mat_up(HMM_Mat3 m) { return HMM_NormV2(m.Columns[1].XY); }
{ HMM_Vec2 mat_right(HMM_Mat3 m) { return HMM_NormV2(m.Columns[0].XY); }
return HMM_MulM4V4(m, (HMM_Vec4){pos.X, pos.Y, pos.Z, 1}).XYZ; float vec_angle(HMM_Vec2 a, HMM_Vec2 b) { return acos(HMM_DotV2(a,b)/(HMM_LenV2(a)*HMM_LenV2(b))); }
} float vec_dirangle(HMM_Vec2 a, HMM_Vec2 b) { return atan2(b.x, b.y) - atan2(a.x, a.y); }
HMM_Vec3 mat3_t_pos(HMM_Mat4 m, HMM_Vec3 pos) { return HMM_MulM4V4(m, (HMM_Vec4){pos.X, pos.Y, pos.Z, 1}).XYZ; }
HMM_Vec3 mat3_t_dir(HMM_Mat4 m, HMM_Vec3 dir) HMM_Vec3 mat3_t_dir(HMM_Mat4 m, HMM_Vec3 dir)
{ {

View file

@ -29,6 +29,11 @@ HMM_Vec2 mat_t_pos(HMM_Mat3 m, HMM_Vec2 pos);
/* Transform a direction via the matrix - does not take into account translation of matrix */ /* Transform a direction via the matrix - does not take into account translation of matrix */
HMM_Vec2 mat_t_dir(HMM_Mat3 m, HMM_Vec2 dir); HMM_Vec2 mat_t_dir(HMM_Mat3 m, HMM_Vec2 dir);
HMM_Vec2 mat_up(HMM_Mat3 m);
HMM_Vec2 mat_right(HMM_Mat3 m);
float vec_angle(HMM_Vec2 a, HMM_Vec2 b);
float vec_dirangle(HMM_Vec2 a, HMM_Vec2 b);
HMM_Vec3 mat3_t_pos(HMM_Mat4 m, HMM_Vec3 pos); HMM_Vec3 mat3_t_pos(HMM_Mat4 m, HMM_Vec3 pos);
HMM_Vec3 mat3_t_dir(HMM_Mat4 m, HMM_Vec3 dir); HMM_Vec3 mat3_t_dir(HMM_Mat4 m, HMM_Vec3 dir);