coeng

annotate src/co_xform.cc @ 8:8cce82794f90

seems to work nicely
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 15 Feb 2015 05:14:20 +0200
parents 2f872a179914
children
rev   line source
nuclear@2 1 #include <assert.h>
nuclear@5 2 #include "co_xform.h"
nuclear@5 3 #include "gobj.h"
nuclear@2 4
nuclear@5 5 static CoXForm reg_co_xform;
nuclear@5 6 static CoPRS reg_co_prs;
nuclear@3 7
nuclear@5 8 static Component *cons_xform() { return new CoXForm; }
nuclear@5 9 static Component *cons_prs() { return new CoPRS; }
nuclear@2 10
nuclear@5 11 CoXForm::CoXForm()
nuclear@2 12 {
nuclear@2 13 name = "xform";
nuclear@2 14
nuclear@2 15 register_component(name, cons_xform);
nuclear@2 16 }
nuclear@2 17
nuclear@6 18 // ---- class CoPRS ----
nuclear@6 19
nuclear@5 20 CoPRS::CoPRS()
nuclear@6 21 : scale(1, 1, 1)
nuclear@2 22 {
nuclear@2 23 name = "prs";
nuclear@8 24 co_xform = 0;
nuclear@2 25
nuclear@2 26 register_component(name, cons_prs);
nuclear@2 27 }
nuclear@2 28
nuclear@6 29 const char **CoPRS::update_before() const
nuclear@6 30 {
nuclear@6 31 static const char *before[] = { "xform", 0 };
nuclear@6 32 return before;
nuclear@6 33 }
nuclear@6 34
nuclear@6 35 void CoPRS::update(float dt)
nuclear@2 36 {
nuclear@2 37 if(!gobj) return;
nuclear@2 38
nuclear@2 39 if(!co_xform) {
nuclear@6 40 if(!(co_xform = COCAST(CoXForm, gobj->get_component("xform")))) {
nuclear@2 41 assert(co_xform);
nuclear@2 42 return;
nuclear@2 43 }
nuclear@2 44 }
nuclear@2 45
nuclear@2 46 Matrix4x4 rmat = rot.get_rotation_matrix();
nuclear@2 47 Matrix4x4 tmat, smat;
nuclear@2 48
nuclear@2 49 tmat.set_translation(pos);
nuclear@2 50 smat.set_scaling(scale);
nuclear@2 51
nuclear@2 52 co_xform->xform = rmat * tmat * smat;
nuclear@2 53 }
nuclear@8 54
nuclear@8 55 CoXForm *gobj_co_xform(const GObject *obj, bool nofail)
nuclear@8 56 {
nuclear@8 57 CoXForm *co = COCAST(CoXForm, obj->get_component("xform"));
nuclear@8 58 if(co) return co;
nuclear@8 59
nuclear@8 60 return nofail ? &reg_co_xform : 0;
nuclear@8 61 }
nuclear@8 62
nuclear@8 63 CoPRS *gobj_co_prs(const GObject *obj, bool nofail)
nuclear@8 64 {
nuclear@8 65 CoPRS *co = COCAST(CoPRS, obj->get_component("prs"));
nuclear@8 66 if(co) return co;
nuclear@8 67
nuclear@8 68 return nofail ? &reg_co_prs : 0;
nuclear@8 69 }