Shader* shader1 = new Shader("basicTexture_VS.hlsl", "lightingTexture_FS.hlsl");
// load LVL
- 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");
+ SceneObject* tmp_world = new SceneObject(shader1, scale(3.f * vec3(1.f, .32f, 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);
+ float test = tmp_world->getModel()->getPDistHit(vec3(3.f, 3.f, 4.f), vec3(0.f, -1.f, 0.f));
+
// 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(), ""));
//Player
- SceneObject* tmp_playerObject = new Marvin(shader1, translate(vec3(1.f, 3.f, 1.f))*rotate((float)M_PI_4,vec3(0.f,1.f,0.f)));
+ SceneObject* tmp_playerObject = new Marvin(shader1, translate(vec3(1.f, 3.f, 1.f))*rotate((float)M_PI_4,vec3(0.f,1.f,0.f))*scale(vec3(.2f)));
tmp_playerObject->yStatic= false;
//current_world->addObject(new SceneObject(shader1, glm::mat4(1.0f), "Player.dae", "model_player.png"));
//current_world->addObject(new SceneObject(shader1, translate(vec3(-3.f, .4f, 0.f))*scale(vec3(3.f)), "cow/cow.dae", "model_cow_2D.jpg"));
- current_world->addObject(new SceneObject(shader1, translate(vec3(-3.f, .4f, 0.f))*scale(vec3(.3f)), vec4(3.0f, 0.5f, 0.4f, 1.5f), "duck.dae", "model_duck_2D.png"));
+ current_world->addObject(new SceneObject(shader1, translate(vec3(-3.f, .4f, 0.f))*scale(vec3(.32f)), vec4(3.0f, 0.5f, 0.4f, 1.5f), "duck.dae", "model_duck_2D.png"));
current_world->addObject(new EventBox(translate(vec3(3.f, .4f, 0.f))));
{
}
-
Model::~Model()
{
for (auto i = shader_map.begin(); i != shader_map.end(); ++i){
}
}
+
void Model::bindShader(Shader* _shader)
{
//Message::info("bindShader");
// BoundingBox->bindShader(_shader);
vec3 BBsiz, BBpos;
getBBsp(BBsiz, BBpos);
- BoundingBox->drawModel(Graphix::shader_BBox, (Texture*)nullptr, _modelMat*translate(BBpos)*glm::scale(BBsiz));
+ BoundingBox->drawModel(Graphix::shader_BBox, (Texture*)nullptr, _modelMat*translate(BBpos)*glm::scale(BBsiz*2.f));
}
void Model::updateBB(const vec3& _min, const vec3& _max)
{
BBmin = _min;
BBmax = _max;
- BBsize = _max - _min;
- BBposition = (_min + _max) / 2.f;
+ BBsize = (BBmax - BBmin) / 2.f;
+ BBposition = (BBmin + BBmax) / 2.f;
}
void Model::updateBB(const uint _numvertices, const float* _vertices)
BBmax[i % 3] = _vertices[i];
}
- BBsize = BBmax - BBmin;
+ BBsize = (BBmax - BBmin) / 2.f;
BBposition = (BBmin + BBmax) / 2.f;
}
}
}
- BBsize = BBmax - BBmin;
+ BBsize = (BBmax - BBmin) / 2.f;
BBposition = (BBmin + BBmax) / 2.f;
}
void Model::isColliding(float& _overlap, float& _inside, const Model* _modelThis, const Model* _modelOther, const mat4& _modelMatThis, const mat4& _modelMatOther)
{
vec3 posA, sizeA, posB, sizeB;
- float overlap, inside;
+ float overlap=INFINITY, inside=INFINITY;
_modelThis->getBBsp(sizeA, posA);
_modelOther->getBBsp(sizeB, posB);
vec3 posAR = (vec3)(modelAR*vec4(posA, 1.f));
vec3 posBR = (vec3)(modelBR*vec4(posB, 1.f));
- sizeA /= 2;
- sizeB /= 2;
-
vec3 sizeAR = rotateSize(sizeA, modelAR);
vec3 sizeBR = rotateSize(sizeB, modelBR);
+ vec3 scaleA = getScale(_modelMatThis);
+ vec3 scaleB = getScale(_modelMatOther);
+
+ scaleVec3(posA, scaleA);
+ scaleVec3(posB, scaleB);
+
+ scaleVec3(sizeA, scaleA);
+ scaleVec3(sizeB, scaleB);
+
checkCollideByAxis(_overlap, _inside, 3, value_ptr(posAR), value_ptr(posB), value_ptr(sizeAR), value_ptr(sizeB));
if (_overlap >= 0)
{
vec3 posAR = (vec3)(modelAR*vec4(posA, 1.f));
vec3 posBR = (vec3)(modelBR*vec4(posB, 1.f));
- sizeA /= 2;
- sizeB /= 2;
-
vec3 sizeAR = rotateSize(sizeA, modelAR);
vec3 sizeBR = rotateSize(sizeB, modelBR);
+ vec3 scaleA = getScale(_modelMatThis);
+ vec3 scaleB = getScale(_modelMatOther);
+
+ scaleVec3(posA, scaleA);
+ scaleVec3(posB, scaleB);
+
+ scaleVec3(sizeA, scaleA);
+ scaleVec3(sizeB, scaleB);
+
+
checkCollideByAxis(_overlap, _inside, 3, value_ptr(posAR), value_ptr(posB), value_ptr(sizeAR), value_ptr(sizeB));
if (_overlap >= 0)
{
void Model::checkCollideByAxis(float& _overlap, float& _inside, uint dim, const float* posA, const float* posB, const float* sizeA,const float* sizeB)
{
- _overlap = sizeA[0] + sizeB[0] - abs(posA[0] - posB[0]);
- _inside = abs(sizeA[0] - sizeB[0]) - abs(posA[0] - posB[0]);
+ _overlap = INFINITY;
+ _inside = INFINITY;
for (uint i = 0; i < dim; ++i)
{
_overlap = min(sizeA[i] + sizeB[i] - abs(posA[i] - posB[i]), _overlap);
return BoundingBox;
}
+float Model::getPDistHit(const vec3& _P, const vec3& _direction) const
+{
+ vec3 n2 = cross(_direction, vec3(1.f, 0.f, 0.f));
+ if (n2.length()<=0.01f)
+ n2 = cross(_direction, vec3(0.f, 1.f, 0.f));
+ vec3 n3 = cross(_direction, n2);
+
+ vec3 posA, sizeA;
+ getBBsp(sizeA, posA);
+
+ //vec3 posAR = (vec3)(modelAR*vec4(posA, 1.f));
+ //vec3 posBR = (vec3)(modelBR*vec4(posB, 1.f));
+
+
+ return 1;
+}
+
Model* Model::BoundingBox = nullptr;
Shader* Model::BBoxShader = nullptr;
bool Model::exBBox = false;
\ No newline at end of file