kick
|
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 }