Small optimization, no having to recompute a matrix for all objects
This commit is contained in:
parent
a5bfa4c237
commit
0475f17110
|
@ -60,8 +60,10 @@ void initRenderer(GLFWwindow* window, CommandLineOptions options) {
|
||||||
|
|
||||||
// traverses and updates matricies
|
// traverses and updates matricies
|
||||||
void updateNodeTransformations(SceneNode* node, mat4 transformationThusFar, mat4 const& V, mat4 const& P) {
|
void updateNodeTransformations(SceneNode* node, mat4 transformationThusFar, mat4 const& V, mat4 const& P) {
|
||||||
mat4 transformationMatrix
|
mat4 M = (node->has_no_transforms())
|
||||||
= glm::translate(mat4(1.0), node->position)
|
? transformationThusFar
|
||||||
|
: transformationThusFar
|
||||||
|
* glm::translate(mat4(1.0), node->position)
|
||||||
* glm::translate(mat4(1.0), node->referencePoint)
|
* glm::translate(mat4(1.0), node->referencePoint)
|
||||||
* glm::rotate(mat4(1.0), node->rotation.z, vec3(0,0,1))
|
* glm::rotate(mat4(1.0), node->rotation.z, vec3(0,0,1))
|
||||||
* glm::rotate(mat4(1.0), node->rotation.y, vec3(0,1,0))
|
* glm::rotate(mat4(1.0), node->rotation.y, vec3(0,1,0))
|
||||||
|
@ -69,8 +71,6 @@ void updateNodeTransformations(SceneNode* node, mat4 transformationThusFar, mat4
|
||||||
* glm::scale(mat4(1.0), node->scale)
|
* glm::scale(mat4(1.0), node->scale)
|
||||||
* glm::translate(mat4(1.0), -node->referencePoint);
|
* glm::translate(mat4(1.0), -node->referencePoint);
|
||||||
|
|
||||||
mat4 M = transformationThusFar * transformationMatrix;
|
|
||||||
|
|
||||||
node->MV = V*M;
|
node->MV = V*M;
|
||||||
node->MVP = P*node->MV;
|
node->MVP = P*node->MV;
|
||||||
node->MVnormal = glm::inverse(glm::transpose(node->MV));
|
node->MVnormal = glm::inverse(glm::transpose(node->MV));
|
||||||
|
|
|
@ -77,6 +77,12 @@ void SceneNode::setMaterial(const Material& mat, bool recursive) {
|
||||||
child->setMaterial(mat, true);
|
child->setMaterial(mat, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SceneNode::has_no_transforms() const {
|
||||||
|
return position.x == 0 && position.y == 0 && position.z == 0
|
||||||
|
&& rotation.x == 0 && rotation.y == 0 && rotation.z == 0
|
||||||
|
&& scale.x == 1 && scale.y == 1 && scale.z == 1;
|
||||||
|
}
|
||||||
|
|
||||||
bool SceneNode::has_transparancy() const {
|
bool SceneNode::has_transparancy() const {
|
||||||
return opacity < 1.0
|
return opacity < 1.0
|
||||||
|| t_diffuse && t_diffuse->has_transparancy
|
|| t_diffuse && t_diffuse->has_transparancy
|
||||||
|
|
|
@ -42,6 +42,7 @@ struct SceneNode {
|
||||||
const PNGImage* reflection=nullptr,
|
const PNGImage* reflection=nullptr,
|
||||||
bool texture_reset=true);
|
bool texture_reset=true);
|
||||||
void setMaterial(const Material& mat, bool recursive=false);
|
void setMaterial(const Material& mat, bool recursive=false);
|
||||||
|
bool has_no_transforms() const;
|
||||||
bool has_transparancy() const;
|
bool has_transparancy() const;
|
||||||
SceneNode* clone() const;
|
SceneNode* clone() const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue