kick
/Users/morten/Programmering/cpp/kick/src/kick/scene/transform.h
00001 //
00002 //  transform.h
00003 //  KickCPP
00004 //
00005 //  Created by morten on 8/13/13.
00006 //  Copyright (c) 2013 Morten Nobel-Joergensen. All rights reserved.
00007 //
00008 
00009 #pragma once
00010 
00011 
00012 #include "component.h"
00013 #include <vector>
00014 
00015 #include <glm/glm.hpp>
00016 #include <glm/ext.hpp>
00017 
00018 namespace kick {
00019     class GameObject;
00020     class Transform;
00021     
00022     typedef std::vector<std::shared_ptr<Transform>>::iterator TransformIter;
00023     typedef std::vector<std::shared_ptr<Transform>>::const_iterator ConstTransformIter;
00024     
00025     class Transform : public Component {
00026     public:
00027         Transform(GameObject *gameObject);
00028         void setPosition(glm::vec3 position);
00029         glm::vec3 position();
00030         void setLocalPosition(glm::vec3 position);
00031         glm::vec3 localPosition();
00032         void setLocalRotationEuler(glm::vec3 rot);
00033         glm::vec3 localRotationEuler();
00034         void setRotationEuler(glm::vec3 rot);
00035         glm::vec3 rotationEuler();
00036         void setRotation(glm::quat rot);
00037         glm::quat rotation();
00038         void setLocalRotation(glm::quat rot);
00039         glm::quat localRotation();
00040         void setLocalScale(glm::vec3 scale);
00041         glm::vec3 localScale();
00042         void setParent(std::shared_ptr<Transform> parent);
00043         void lookAt(glm::vec3 target, glm::vec3 up = glm::vec3{0,1,0});
00044         void lookAt(Transform *target, glm::vec3 up = glm::vec3{0,1,0});
00045         glm::mat4 localMatrix();
00046         glm::mat4 globalMatrix();
00047         glm::mat4 localTRSInverse();
00048         glm::mat4 globalTRSInverse();
00049                 std::shared_ptr<Transform> root();
00050         std::shared_ptr<Transform> parent();
00051         TransformIter begin();
00052         TransformIter end();
00053         ConstTransformIter begin() const;
00054         ConstTransformIter end() const;
00055 
00056         glm::vec3 forward();
00057         glm::vec3 up();
00058         glm::vec3 right();
00059     private:
00060         void markGlobalDirty();
00061         void markLocalDirty();
00062         glm::mat4 mLocalMatrix = glm::mat4(0);
00063         glm::mat4 mGlobalMatrix = glm::mat4(0);
00064         glm::mat4 mLocalMatrixInverse = glm::mat4(0);
00065         glm::mat4 mGlobalMatrixInverse = glm::mat4(0);
00066         glm::vec3 mLocalPosition = glm::vec3(0);
00067         glm::vec3 mGlobalPosition = glm::vec3(0);
00068         glm::quat mGlobalRotationQuat = glm::quat(1,0,0,0);
00069         glm::quat mLocalRotationQuat = glm::quat(1,0,0,0);
00070         glm::vec3 mLocalScale = glm::vec3(1);
00071         struct {
00072             bool local = true;
00073             bool localInv = true;
00074             bool global = true;
00075             bool globalInv = true;
00076             bool globalPos = true;
00077             bool globalRot = true;
00078         } mDirty;
00079         std::vector<std::shared_ptr<Transform>> mChildren;
00080         std::shared_ptr<Transform> mParent = nullptr;
00081     };
00082 }
 All Classes Functions Variables