void Graphix::cleanup()
{
delete shader_BBox;
+
SDL_SetWindowGrab(sdl_window, SDL_FALSE);
SDL_GL_DeleteContext(sdl_glcontext);
#pragma once
#include "Model\Model.h"
-#include "Model\IMetaMesh.h"
-#include "Model\SkyBox.h"
-#include "Model\BBox.h"
-
+//#include "Model\IMetaMesh.h"
+//#include "Model\SkyBox.h"
+//#include "Model\BBox.h"
BBox::~BBox()
{
+ glDeleteBuffers(1, &vertexBuffer);
+ //glDeleteBuffers(1, &indexBuffer);
+ //glDeleteBuffers(1, &normalBuffer);
+ //glDeleteBuffers(1, &uvBuffer);
}
+
void BBox::drawModel() const
{
uint indexL1[4]{ 0, 1, 2, 3 },
glDrawElements(GL_LINES, 8, GL_UNSIGNED_INT, indexS1);
glBindVertexArray(0);
}
+
+
+BBox::operator std::string() const
+{
+ return "BBox";
+}
BBox();
~BBox();
- void drawModel() const;
+ void drawModel() const override;
+ operator std::string() const override;
};
#include "../Graphix.h"
+using std::string;
-
-IMesh::IMesh(const string& _modelpath, uint _mindex)
+IMesh::IMesh(const string& _modelpath, uint _mindex) : modelpath(_modelpath)
{
float *vertex = nullptr, *normals = nullptr, *uvs = nullptr;
}
-IMesh::IMesh(const aiMesh* _mesh, const mat4& _transformation) : modelMat(_transformation)
+IMesh::IMesh(const aiMesh* _mesh, const mat4& _transformation) : modelMat(_transformation), modelpath("IMesh")
{
float *vertex = nullptr, *normals = nullptr, *uvs = nullptr;
return;
-}
\ No newline at end of file
+}
+
+IMesh::operator string() const
+{
+ return "IMesh";
+}
#include "Model.h"
-using std::string;
-
class Shader;
class Texture;
struct aiMesh;
class IMesh : public Model
{
public:
- IMesh(const string& modelpath, uint index=0);
+ IMesh(const std::string& modelpath, uint index=0);
IMesh(const aiMesh* mesh, const mat4& transformation);
virtual ~IMesh();
- void useModelMat(const mat4& model, Shader* shader) const;
+ void useModelMat(const mat4& model, Shader* shader) const override;
//void drawModel(Shader* shader, Texture* texture, const mat4& modelMat) const;
/* calls Colliding to check if self collides with model*/
virtual void checkColliding(float& overlap, float& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
-protected:
+ operator std::string() const override;
+protected:
+ std::string modelpath;
mat4 modelMat;
// Mesh Speichern?
- bool import(const string& modelpath, uint& numvertices, uint& numfaces, float*& vertex, float*& uvs, float*& normals, uint*& index , uint mindex = 0) const;
+ bool import(const std::string& modelpath, uint& numvertices, uint& numfaces, float*& vertex, float*& uvs, float*& normals, uint*& index , uint mindex = 0) const;
bool import(const aiMesh* mesh, uint& numvertices, uint& numfaces, float*& vertex, float*& uvs, float*& normals, uint*& index) const;
-
-
-
-
-};
-
+};
\ No newline at end of file
#include "../Shader.h"
#include "../../Message.h"
+using std::string;
IMetaMesh::IMetaMesh(const string& _modelpath)
{
}
-void IMetaMesh::drawBBox(Shader* _shader, const mat4& _modelMat) const
+void IMetaMesh::drawBBox(const mat4& _modelMat,const vec4& _color) const
{
- Model::drawBBox(_shader, _modelMat);
+ Model::drawBBox(_modelMat, _color);
if (models.size() > 1)
{
for (auto i = models.begin(); i != models.end(); ++i)
{
- (*i)->drawBBox(_shader, _modelMat);
+ (*i)->drawBBox(_modelMat, _color*0.8f);
}
}
}
}
}
+
+IMetaMesh::operator string() const
+{
+ return modelpath;
+}
\ No newline at end of file
#include <list>
#include "../GLM.h"
-using std::string;
-
class IMesh;
class Shader;
class Texture;
class IMetaMesh : public Model
{
public:
- IMetaMesh(const string& modelpath);
+ IMetaMesh(const std::string& modelpath);
~IMetaMesh();
- void bindShader(Shader* shader);
+ void bindShader(Shader* shader) override;
- void drawModel(Shader* shader, Texture* texture, const mat4& modelMat) const;
+ void drawModel(Shader* shader, Texture* texture, const mat4& modelMat) const override;
- void drawBBox(Shader* shader, const mat4& modelMat) const;
+ void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const override;
/* calls Colliding to check if self collides with model*/
void checkColliding(float& overlap, float& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
+ operator std::string() const override;
+
protected:
+ std::string modelpath;
std::list<IMesh*> models;
};
#include "../Graphix.h"
#include "BBox.h"
+#include "SkyBox.h"
+#include "IMetaMesh.h"
#include "../../Events.h"
//system("pause");
}
-void Model::drawBBox(Shader* _shader, const mat4& _modelMat) const
+void Model::drawBBox(const mat4& _modelMat, const vec4& _color) const
{
- if (BoundingBox == nullptr)
- {
- BoundingBox = new BBox();
- //BBoxShader = new Shader("basic_FS.hlsl", "basic_VS.hlsl");
- BoundingBox->bindShader(Graphix::shader_BBox);
-
- //int tmp = Graphix::shader_BBox->getUniformLocation("uFragmentColor");
- //if (tmp >= 0)
- // glUniform4fv(Graphix::shader_BBox->getHandle(), 1, value_ptr(vec4(.3f, .9f, .9f, 1.f)));
- }
- // BoundingBox->bindShader(_shader);
vec3 BBsiz, BBpos;
getBBsp(BBsiz, BBpos);
- BoundingBox->drawModel(Graphix::shader_BBox, (Texture*)nullptr, _modelMat*translate(BBpos)*glm::scale(BBsiz*2.f));
+ Graphix::getGlError();
+ Graphix::shader_BBox->useShader();
+ int tmp = Graphix::shader_BBox->getUniformLocation("uFragmentColor");
+ if (tmp >= 0)
+ glUniform4fv(tmp, 1, value_ptr(_color));
+ Graphix::getGlError();
+ getBBoxModel()->drawModel(Graphix::shader_BBox, NULL, _modelMat*translate(BBpos)*glm::scale(BBsiz*2.f));
}
void Model::updateBB(const vec3& _min, const vec3& _max)
return BoundingBox;
}
+Model* Model::getSkyBoxModel()
+{
+ if (SkyBoxModel == nullptr)
+ {
+ SkyBoxModel = new SkyBox();
+ //SkyBoxModel->bindShader(Graphix::shader_);
+ }
+ return SkyBoxModel;
+}
+
+Model* Model::newIMetaModel(const string& _modelpath)
+{
+ Model*& ptr = IMetaModel[_modelpath];
+ if (ptr == nullptr)
+ {
+ ptr = new IMetaMesh(_modelpath);
+ //ptr->bindShader(Graphix::shader_BBox);
+ }
+ ++IMetaModel_count[_modelpath];
+ return ptr;
+}
+
+void Model::deleteBBoxModel()
+{
+ delete BoundingBox;
+}
+
+void Model::deleteSkyBoxModel()
+{
+ delete SkyBoxModel;
+}
+
+
+void Model::deleteIMetaModel(const string& _modelpath)
+{
+ if (_modelpath == "SkyBox" || _modelpath == "BBox" || _modelpath == "IMesh")
+ {
+ Message::warning("deleteIMetaModel: dont use deleteIMetaModel with " + _modelpath);
+ return;
+ }
+
+ uint& count = IMetaModel_count[_modelpath];
+ --count;
+
+ if (!count)
+ delete IMetaModel[_modelpath];
+
+}
+
float Model::getPDistHit(const vec3& _P, const vec3& _direction) const
{
}
Model* Model::BoundingBox = nullptr;
-Shader* Model::BBoxShader = nullptr;
-bool Model::exBBox = false;
\ No newline at end of file
+Model* Model::SkyBoxModel = nullptr;
+std::unordered_map<string, Model*> Model::IMetaModel;
+std::unordered_map<string, uint> Model::IMetaModel_count;
\ No newline at end of file
#include "../GLM.h"
#include <unordered_map>
+#include <string>
class Shader;
class Texture;
virtual void drawModel(Shader* shader, Texture* texture, const mat4& modelMat) const;
/* Draws a BoundingBox around the Model */
- virtual void drawBBox(Shader* shader, const mat4& modelMat) const;
+ virtual void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const;
/* Get min&max from BBox */
virtual void getBBmm(vec3& min, vec3& max) const;
void checkColliding(float& overlap, float& inside, const Model* model, const mat4& modelMatThis, const mat4& modelMatOther) const;
static Model* getBBoxModel();
+ static Model* getSkyBoxModel();
+ static Model* newIMetaModel(const std::string& modelpath);
+
+ static void deleteBBoxModel();
+ static void deleteSkyBoxModel();
+ static void deleteIMetaModel(const std::string& modelpath);
virtual float getPDistHit(const vec3& P, const vec3& direction) const;
+ virtual operator std::string() const = 0;
+
protected:
uint numvertices, numfaces;
uint vertexBuffer, indexBuffer, normalBuffer, uvBuffer;
virtual void drawModel() const;
static Model* BoundingBox;
- static Shader* BBoxShader;
- static bool exBBox;
-
-
+ static Model* SkyBoxModel;
+ static std::unordered_map<std::string, Model*> IMetaModel;
+ static std::unordered_map<std::string, uint> IMetaModel_count;
static vec3 rotateSize(const vec3& size, const mat4& modelMat);
static void checkCollideByAxis(float& overlap, float& inside, uint dim, const float* posA, const float* posB, const float* sizeA, const float* sizeB);
{
}
-void SkyBox::drawBBox(Shader* _shader, const mat4& _modelMat) const
+void SkyBox::drawBBox(const mat4& _modelMat, const vec4& _color) const
{
}
+SkyBox::operator std::string() const
+{
+ return "SkyBox";
+}
\ No newline at end of file
SkyBox();
~SkyBox();
- void drawModel(Shader* shader, Texture* texture, const mat4& modelMat) const;
+ void drawModel(Shader* shader, Texture* texture, const mat4& modelMat) const override;
//uncommend following lines to use default Loaders
- void useModelMat(const mat4& model, Shader* shader) const;
- void useTexture(Texture* texture, Shader* shader) const;
+ void useModelMat(const mat4& model, Shader* shader) const override;
+ void useTexture(Texture* texture, Shader* shader) const override;
- void drawBBox(Shader* shader, const mat4& modelMat) const;
+ void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.f)) const override;
+
+ operator std::string() const override;
};
void EventBox::draw() const
{
if (Events::isKToggleActive(SDLK_F6))
- model->drawBBox(shader, modelMat);
+ model->drawBBox(modelMat,vec4(.3f,.9f,.9f,1.f));
}
void EventBox::collides(SceneObject* _other)
}
}
-}
\ No newline at end of file
+}
texture(nullptr),
ySpeed(0),
yStatic(true),
-ignore(false)
+ignore(false),
+newModel(true)
{
//Message::info("Error from befor?");
//Graphix::getGlError();
//modelID = _shader->getUniformLocation("modelMat");
if (_modelpath != "")
{
- model = new IMetaMesh(_modelpath);
+ model = Model::newIMetaModel(_modelpath);
+ model->bindShader(shader);
}
if (texturepath != "")
//Message::info("Creating SkyBox Shader");
//Graphix::getGlError();
- model->bindShader(shader);
+
//Message::info("Binding Shader");
//Graphix::getGlError();
//Message::info("Done");
texture(nullptr),
ySpeed(0),
yStatic(true),
-ignore(false)
+ignore(false),
+newModel(false)
{
//Message::info("Error from befor?");
//Graphix::getGlError();
SceneObject::~SceneObject()
{
delete texture;
+ if (newModel)
+ Model::deleteIMetaModel(*model);
}
float SceneObject::getFloor() const
void SceneObject::update(float deltaT)
{
+ //Fallen
if (!yStatic)
{
vec3 pos = getPosition();
model->drawModel(shader, texture, modelMat);
if (Events::isKToggleActive(SDLK_F6))
- model->drawBBox(shader, modelMat);
+ model->drawBBox(modelMat);
}
void SceneObject::checkCollision(SceneObject* _first, SceneObject* _second)
Shader* shader;
Texture* texture;
Model* model;
+ bool newModel;
Scene* mainScene;
#include "../Graphix/Model.h"
-Sky::Sky() : SceneObject(new Shader("skybox_VS.hlsl","skybox_color_FS.hlsl"), mat4(1.f), vec4(1.f), new SkyBox(), "")
-{
-
+Sky::Sky() : SceneObject(new Shader("skybox_VS.hlsl","skybox_color_FS.hlsl"), mat4(1.f), vec4(1.f), Model::getSkyBoxModel(), "")
+{
}
</Link>
</ItemDefinitionGroup>
<ItemGroup>
- <ClCompile Include="Graphix\Model\BBox.cpp" />
- <ClCompile Include="Graphix\Model\Model.cpp" />
<ClCompile Include="Events.cpp" />
<ClCompile Include="Fps.cpp" />
<ClCompile Include="Game.cpp" />
<ClCompile Include="Graphix\GLM.cpp" />
<ClCompile Include="Graphix\Graphix.cpp" />
+ <ClCompile Include="Graphix\Model\BBox.cpp" />
<ClCompile Include="Graphix\Model\IMesh.cpp" />
+ <ClCompile Include="Graphix\Model\IMetaMesh.cpp" />
+ <ClCompile Include="Graphix\Model\Model.cpp" />
+ <ClCompile Include="Graphix\Model\SkyBox.cpp" />
<ClCompile Include="Scene\EventBox.cpp" />
<ClCompile Include="Scene\Marvin.cpp" />
<ClCompile Include="Scene\Scene.cpp" />
<ClCompile Include="Scene\SceneObject.cpp" />
<ClCompile Include="Graphix\Shader.cpp" />
- <ClCompile Include="Graphix\Model\SkyBox.cpp" />
<ClCompile Include="Graphix\Texture.cpp" />
<ClCompile Include="Graphix\ViewPort.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="Message.cpp" />
- <ClCompile Include="Graphix\Model\IMetaMesh.cpp" />
<ClCompile Include="Scene\Sky.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="Average.h" />
<ClInclude Include="Graphix\Model.h" />
- <ClInclude Include="Graphix\Model\BBox.h" />
- <ClInclude Include="Graphix\Model\Model.h" />
<ClInclude Include="Events.h" />
<ClInclude Include="Fps.h" />
<ClInclude Include="Game.h" />
<ClInclude Include="Graphix\GLM.h" />
<ClInclude Include="Graphix\Graphix.h" />
+ <ClInclude Include="Graphix\Model\BBox.h" />
<ClInclude Include="Graphix\Model\IMesh.h" />
+ <ClInclude Include="Graphix\Model\IMetaMesh.h" />
+ <ClInclude Include="Graphix\Model\Model.h" />
+ <ClInclude Include="Graphix\Model\SkyBox.h" />
<ClInclude Include="Scene.h" />
<ClInclude Include="Scene\EventBox.h" />
<ClInclude Include="Scene\Marvin.h" />
<ClInclude Include="Scene\Scene.h" />
<ClInclude Include="Scene\SceneObject.h" />
<ClInclude Include="Graphix\Shader.h" />
- <ClInclude Include="Graphix\Model\SkyBox.h" />
<ClInclude Include="Graphix\Texture.h" />
<ClInclude Include="Graphix\ViewPort.h" />
<ClInclude Include="Message.h" />
- <ClInclude Include="Graphix\Model\IMetaMesh.h" />
<ClInclude Include="Scene\Sky.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ClCompile Include="Game.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="Graphix\Model\IMesh.cpp">
+ <ClCompile Include="Scene\SceneObject.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="Graphix\Model\IMetaMesh.cpp">
+ <ClCompile Include="Scene\Scene.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="Graphix\Model\BBox.cpp">
+ <ClCompile Include="Scene\Marvin.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="Graphix\Model\Model.cpp">
+ <ClCompile Include="Scene\Sky.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="Graphix\Model\SkyBox.cpp">
+ <ClCompile Include="Scene\EventBox.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="Scene\SceneObject.cpp">
+ <ClCompile Include="Graphix\Model\BBox.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="Scene\Scene.cpp">
+ <ClCompile Include="Graphix\Model\IMesh.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="Scene\Marvin.cpp">
+ <ClCompile Include="Graphix\Model\IMetaMesh.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="Scene\Sky.cpp">
+ <ClCompile Include="Graphix\Model\Model.cpp">
<Filter>Source Files</Filter>
</ClCompile>
- <ClCompile Include="Scene\EventBox.cpp">
+ <ClCompile Include="Graphix\Model\SkyBox.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ClInclude Include="Game.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Graphix\Model\IMesh.h">
+ <ClInclude Include="Graphix\Model.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Graphix\Model\IMetaMesh.h">
+ <ClInclude Include="Scene\SceneObject.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Graphix\Model\BBox.h">
+ <ClInclude Include="Scene\Scene.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Graphix\Model\Model.h">
+ <ClInclude Include="Scene\Marvin.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Graphix\Model\SkyBox.h">
+ <ClInclude Include="Scene\Sky.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Graphix\Model.h">
+ <ClInclude Include="Scene\EventBox.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Scene\SceneObject.h">
+ <ClInclude Include="Scene.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Scene\Scene.h">
+ <ClInclude Include="Graphix\Model\BBox.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Scene\Marvin.h">
+ <ClInclude Include="Graphix\Model\IMesh.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Scene\Sky.h">
+ <ClInclude Include="Graphix\Model\IMetaMesh.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Scene\EventBox.h">
+ <ClInclude Include="Graphix\Model\Model.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="Scene.h">
+ <ClInclude Include="Graphix\Model\SkyBox.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>