import(_modelpath, numvertices, numfaces, vertex, uvs, normals, index, _mindex);
+ updateBB(vertex);
+
genBuffer(vertexBuffer, numvertices * 3 * sizeof(float), (void*)vertex);
genBuffer(normalBuffer, numvertices * 3 * sizeof(float), (void*)normals);
genBuffer(uvBuffer, numvertices * 2 * sizeof(float), (void*)uvs);
import(_mesh, numvertices, numfaces, vertex, uvs, normals, index);
+ updateBB(vertex);
+
genBuffer(vertexBuffer, numvertices * 3 * sizeof(float), (void*)vertex);
genBuffer(normalBuffer, numvertices * 3 * sizeof(float), (void*)normals);
genBuffer(uvBuffer, numvertices * 2 * sizeof(float), (void*)uvs);
return;
}
+ IMesh* tmpIMesh = nullptr;
+ vec3 tmpMin, tmpMax;
if (scene->HasMeshes())// && scene->mNumMeshes > mindex)
{
- for (unsigned int i = 0; i < scene->mNumMeshes; i++)
+ tmpIMesh = new IMesh(scene->mMeshes[0]);
+ models.push_back(tmpIMesh);
+ tmpIMesh->getBBmm(BBmin, BBmax);
+
+ for (auto i = 1; i < scene->mNumMeshes; i++)
{
- models.push_back(new IMesh(scene->mMeshes[i]));
+ tmpIMesh = new IMesh(scene->mMeshes[i]);
+ models.push_back(tmpIMesh);
+ tmpIMesh->getBBmm(tmpMin, tmpMax);
+ for (auto j = 0; j < 3; ++j)
+ {
+ if (tmpMin[j] < BBmin[j])
+ BBmin[j] = tmpMin[j];
+ if (tmpMax[j] > BBmax[j])
+ BBmax[j] = tmpMax[j];
+ }
}
-
+ updateBB(BBmin, BBmax);
}
else
{
}
+//void IMetaMesh::drawBBox(Shader* _shader, const mat4 & _modelMat) const
+//{
+// Model::drawBBox(_shader, _modelMat);
+// for (auto i = models.begin(); i != models.end(); ++i)
+// {
+// (*i)->drawBBox(_shader, _modelMat);
+// }
+//
+//}
+
void drawModel(Shader* shader, Texture* texture, const mat4& modelMat) const;
+ //void drawBBox(Shader* shader, const mat4 & modelMat) const;
+
protected:
std::list<IMesh*> models;
};
}
BoundingBox->bindShader(_shader);
- BoundingBox->drawModel(_shader, (Texture*)nullptr, _modelMat);
+ BoundingBox->drawModel(_shader, (Texture*)nullptr, _modelMat*translate(BBposition)*scale(BBsize));
}
void Model::updateBB(const vec3& _min, const vec3& _max)
BBposition = (_min + _max) / 2.f;
}
+void Model::updateBB(const float* _vertices)
+{
+ BBmin = vec3(_vertices[0], _vertices[1], _vertices[2]);
+ BBmax = BBmin;
+ for (auto i = 3; i < numvertices * 3; ++i)
+ {
+ if (_vertices[i] < BBmin[i % 3])
+ BBmin[i % 3] = _vertices[i];
+ if (_vertices[i] > BBmax[i % 3])
+ BBmax[i % 3] = _vertices[i];
+ }
+
+ BBsize = BBmax - BBmin;
+ BBposition = (BBmin + BBmax) / 2.f;
+}
+
+
+void Model::getBBmm(vec3& _min, vec3& _max) const
+{
+ _min = BBmin;
+ _max = BBmax;
+}
+
+void Model::getBBsp(vec3& _size, vec3& _position) const
+{
+ _size = BBsize;
+ _position = BBposition;
+}
+
+
+
void Model::genBuffer(uint &buffer, uint size, void* value)
{
glGenBuffers(1, &buffer);
/* Draws a BoundingBox around the Model */
virtual void drawBBox(Shader* shader,const mat4 & modelMat) const;
+ void getBBmm(vec3& min, vec3& max) const;
+ void getBBsp(vec3& size, vec3& pos) const;
+
protected:
uint numvertices, numfaces;
uint vertexBuffer, indexBuffer, normalBuffer, uvBuffer;
std::unordered_map<uint, uint> shader_map;
void updateBB(const vec3& min, const vec3& max);
+ void updateBB(const float* vertices);
void genBuffer(uint &buffer, uint size, void* value);
void bindBuffer(const uint &buffer, const uint index, const uint dim = 3);
virtual void useModelMat(const mat4& model, Shader* shader) const;
virtual void drawModel() const;
+
static Model* BoundingBox;
static Shader* BBoxShader;
static bool exBBox;
+ vec3 BBmin, BBmax;
+
private:
vec3 BBsize, BBposition;
+
};