]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
improved rotation Colliding (not final but works)
authorPeter Schaefer <schaeferpm@gmail.com>
Thu, 30 Apr 2015 08:24:26 +0000 (10:24 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Thu, 30 Apr 2015 08:24:26 +0000 (10:24 +0200)
Weave/Game.cpp
Weave/Graphix/Model/IMesh.cpp
Weave/Graphix/Model/IMesh.h
Weave/Graphix/Model/Model.cpp
Weave/Graphix/Model/Model.h
Weave/Scene/SceneObject.cpp
Weave/Scene/SceneObject.h

index 8d079d0f74119432fe8c94d79e27300493686899..b24c49dd81faf96208b11a8e95da8e73a4999707 100644 (file)
@@ -52,7 +52,9 @@ Game::Game() : playing(true)
 //     Shader* shaderSky = new Shader("skybox_VS.hlsl", "skybox_FS.hlsl");
 
        // load LVL
-       current_world->addObject(new SceneObject(shader1, scale(3.f * vec3(1.f, .3f, 1.f)), vec4(4.0f, 1.0f, 1.0f, 2.0f), "level_test.dae", "model_levelTest_2D.png"));
+       SceneObject* tmp_world = new SceneObject(shader1, scale(3.f * vec3(1.f, .3f, 1.f)), vec4(4.0f, 1.0f, 1.0f, 2.0f), "level_test.dae", "model_levelTest_2D.png");
+       tmp_world->ignore = true;
+       current_world->addObject(tmp_world);
 
        current_world->addObject(new SceneObject(shader1, translate(vec3(-3.f, 1.f, 0.f)), vec4(1.0f, 1.0f, 1.0f, 3.0f), new BBox(), ""));
 
index 9adaad2ee472aaabf85081b8a26ff81726957fd8..19edef9205e65a4a8dec1c82b3cf1482fa5f7f9d 100644 (file)
@@ -149,3 +149,8 @@ bool IMesh::import(const aiMesh* mesh, uint& numvertices, uint& numfaces, float*
 
        return true;
 }
+
+void IMesh::isColliding(int& _overlap, int& _inside, const Model* _model, const mat4& _modelMatThis, const mat4& _modelMatOther) const
+{
+       Model::isColliding(_overlap, _inside, _model, _modelMatThis*modelMat, _modelMatOther);
+}
\ No newline at end of file
index b36d7404d2a1fa74d486c90f2f314eca3214bfe5..164bc6a5f4116c518b23dc21d16f5aa5b58ffc2b 100644 (file)
@@ -26,6 +26,10 @@ public:
 
        //void bindShader(Shader* shader);
 
+       /* calls Colliding to check if self collides with model*/
+       virtual void isColliding(int& overlap, int& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
+
+
 protected:
 
        mat4 modelMat;
index b454685d67ad8ecd0f2ee0304ae6e25efa566cb7..15a0eae1753cb3680487d4ed27717e2d029002e0 100644 (file)
@@ -251,11 +251,11 @@ void Model::isColliding(int& _overlap, int& _inside, const Model* _model,const m
        getBBsp(sizeA, posA);
        _model->getBBsp(sizeB, posB);
 
-       posA = (vec3)(_modelMatThis*vec4(posA, 1.f));
+       posA = (vec3)(_modelMatThis*vec4(posA, 1.f)); //transpose sollte eigentlich reichen
        posB = (vec3)(_modelMatOther*vec4(posB, 1.f));
 
-       sizeA = (mat3)_modelMatThis * sizeA;
-       sizeB = (mat3)_modelMatOther * sizeB;
+       sizeA = rotateSize(sizeA, _modelMatThis);
+       sizeB = rotateSize(sizeB, _modelMatOther);
 
        vec3 pDist, sDist;
        vec3 overlap, inside;
@@ -279,6 +279,19 @@ void Model::isColliding(int& _overlap, int& _inside, const Model* _model,const m
        _inside = (int)sign(glm::min(glm::min(inside.x, inside.y), inside.z));
 }
 
+vec3 Model::rotateSize(const vec3& _size, const mat4& _modelMat)
+{
+       vec3 Size = vec3(0.f);
+       vec4 tmp;
+       for (auto i = 0; i < 3; ++i)
+       {
+               tmp = vec4(0.f);
+               tmp[i] = _size[i];
+               Size += abs((vec3)(_modelMat* tmp));
+       }
+       return Size;
+}
+
 
 Model* Model::BoundingBox = nullptr;
 Shader* Model::BBoxShader = nullptr;
index da6885453c7bb8c5d025d32e37049f2236ec34e6..d5f2df3073db669bb6d94080128bb82e1c8d1dd9 100644 (file)
@@ -54,6 +54,8 @@ protected:
        static Shader* BBoxShader;
        static bool exBBox;
 
+       static vec3 rotateSize(const vec3& size, const mat4& modelMat);
+
        vec3 BBmin, BBmax;
 
 private:
index 2bac5998a109ca5e1598afbad96d9573f8f9b595..5d11b0e7d98b3a75239d9ba9932f7367f9504d66 100644 (file)
@@ -29,7 +29,8 @@ mainScene(NULL),
 collision_ignore(false),
 texture(nullptr),
 ySpeed(0),
-yStatic(true)
+yStatic(true),
+ignore(false)
 {
        //Message::info("Error from befor?");
        //Graphix::getGlError();
@@ -61,7 +62,8 @@ mainScene(NULL),
 collision_ignore(false),
 texture(nullptr),
 ySpeed(0),
-yStatic(true)
+yStatic(true),
+ignore(false)
 {
        //Message::info("Error from befor?");
        //Graphix::getGlError();
@@ -159,8 +161,11 @@ void SceneObject::collisions(SceneObject* _other)
        model->isColliding(isOverlaping,isInside,_other->model,modelMat,_other->modelMat);
        /* overlapping 1 yes, 0 touch, -1 no*/
        /* inside 1 yes, 0 touch, -1 no*/
-       //if (isOverlaping >= 0)
-       //      Message::info("Kollision");
+       if ((texture != nullptr && texture->operator std::string() == "model_player_2D.png") || _other->texture != nullptr && (_other->texture->operator std::string() == "model_player_2D.png"))
+       {
+               if (isOverlaping >= 0 && (!ignore && !_other->ignore))
+                       Message::info("Kollision");
+       }
 }
 
 bool SceneObject::floorBound() const
index 8e221e663632a9c7729ab186af3facbdb87a137f..80a2309e56ea76caf82b0781689ba5ac70a2dcd3 100644 (file)
@@ -60,8 +60,12 @@ public:
        bool yStatic;
        float ySpeed;
 
+       bool ignore;
+
 protected:
 
+       
+
        mat4 modelMat;
        vec4 material;
        Shader* shader;