aboutsummaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/scenefilereader.cpp94
-rw-r--r--src/utils/sceneparser.cpp24
-rw-r--r--src/utils/sceneparser.h2
3 files changed, 76 insertions, 44 deletions
diff --git a/src/utils/scenefilereader.cpp b/src/utils/scenefilereader.cpp
index de5dce4..ad744a5 100644
--- a/src/utils/scenefilereader.cpp
+++ b/src/utils/scenefilereader.cpp
@@ -447,17 +447,23 @@ bool ScenefileReader::parseCameraData(const QJsonObject &cameradata) {
// Parse the camera data
if (cameradata["position"].isArray()) {
QJsonArray position = cameradata["position"].toArray();
- if (position.size() != 3) {
- std::cout << "cameraData position must have 3 elements" << std::endl;
+ if (position.size() != 3 && position.size() != 4) {
+ std::cout << "cameraData position must have 3-4 elements" << std::endl;
return false;
}
- if (!position[0].isDouble() || !position[1].isDouble() || !position[2].isDouble()) {
+ if (!position[0].isDouble() || !position[1].isDouble() || !position[2].isDouble() || (position.size() == 4 && !position[3].isDouble())) {
std::cout << "cameraData position must be a floating-point value" << std::endl;
return false;
}
m_cameraData.pos.x = position[0].toDouble();
m_cameraData.pos.y = position[1].toDouble();
m_cameraData.pos.z = position[2].toDouble();
+ if (position.size() == 4) {
+ m_cameraData.pos.w = position[3].toDouble();
+ }
+ else {
+ m_cameraData.pos.w = 1.f;
+ }
}
else {
std::cout << "cameraData position must be an array" << std::endl;
@@ -466,17 +472,23 @@ bool ScenefileReader::parseCameraData(const QJsonObject &cameradata) {
if (cameradata["up"].isArray()) {
QJsonArray up = cameradata["up"].toArray();
- if (up.size() != 3) {
- std::cout << "cameraData up must have 3 elements" << std::endl;
+ if (up.size() != 3 && up.size() != 4) {
+ std::cout << "cameraData up must have 3-4 elements" << std::endl;
return false;
}
- if (!up[0].isDouble() || !up[1].isDouble() || !up[2].isDouble()) {
+ if (!up[0].isDouble() || !up[1].isDouble() || !up[2].isDouble() || (up.size() == 4 && !up[3].isDouble())) {
std::cout << "cameraData up must be a floating-point value" << std::endl;
return false;
}
m_cameraData.up.x = up[0].toDouble();
m_cameraData.up.y = up[1].toDouble();
m_cameraData.up.z = up[2].toDouble();
+ if (up.size() == 4) {
+ m_cameraData.up.w = up[3].toDouble();
+ }
+ else {
+ m_cameraData.up.w = 1.f;
+ }
}
else {
std::cout << "cameraData up must be an array" << std::endl;
@@ -516,17 +528,23 @@ bool ScenefileReader::parseCameraData(const QJsonObject &cameradata) {
if (cameradata.contains("look")) {
if (cameradata["look"].isArray()) {
QJsonArray look = cameradata["look"].toArray();
- if (look.size() != 3) {
- std::cout << "cameraData look must have 3 elements" << std::endl;
+ if (look.size() != 3 && look.size() != 4) {
+ std::cout << "cameraData look must have 3-4 elements" << std::endl;
return false;
}
- if (!look[0].isDouble() || !look[1].isDouble() || !look[2].isDouble()) {
+ if (!look[0].isDouble() || !look[1].isDouble() || !look[2].isDouble() || (look.size() == 4 && !look[3].isDouble())) {
std::cout << "cameraData look must be a floating-point value" << std::endl;
return false;
}
m_cameraData.look.x = look[0].toDouble();
m_cameraData.look.y = look[1].toDouble();
m_cameraData.look.z = look[2].toDouble();
+ if (look.size() == 4) {
+ m_cameraData.look.w = look[3].toDouble();
+ }
+ else {
+ m_cameraData.look.w = 1.f;
+ }
}
else {
std::cout << "cameraData look must be an array" << std::endl;
@@ -536,17 +554,23 @@ bool ScenefileReader::parseCameraData(const QJsonObject &cameradata) {
else if (cameradata.contains("focus")) {
if (cameradata["focus"].isArray()) {
QJsonArray focus = cameradata["focus"].toArray();
- if (focus.size() != 3) {
- std::cout << "cameraData focus must have 3 elements" << std::endl;
+ if (focus.size() != 3 && focus.size() != 4) {
+ std::cout << "cameraData focus must have 3-4 elements" << std::endl;
return false;
}
- if (!focus[0].isDouble() || !focus[1].isDouble() || !focus[2].isDouble()) {
+ if (!focus[0].isDouble() || !focus[1].isDouble() || !focus[2].isDouble() || (focus.size() == 4 && !focus[3].isDouble())) {
std::cout << "cameraData focus must be a floating-point value" << std::endl;
return false;
}
m_cameraData.look.x = focus[0].toDouble();
m_cameraData.look.y = focus[1].toDouble();
m_cameraData.look.z = focus[2].toDouble();
+ if (focus.size() == 4) {
+ m_cameraData.look.w = focus[3].toDouble();
+ }
+ else {
+ m_cameraData.look.w = 1.f;
+ }
}
else {
std::cout << "cameraData focus must be an array" << std::endl;
@@ -638,11 +662,11 @@ bool ScenefileReader::parseGroupData(const QJsonObject &object, SceneNode *node)
}
QJsonArray translateArray = object["translate"].toArray();
- if (translateArray.size() != 4) {
- std::cout << "group translate must have 4 elements" << std::endl;
+ if (translateArray.size() != 4 && translateArray.size() != 3) {
+ std::cout << "group translate must have 3-4 elements" << std::endl;
return false;
}
- if (!translateArray[0].isDouble() || !translateArray[1].isDouble() || !translateArray[2].isDouble() || !translateArray[3].isDouble()) {
+ if (!translateArray[0].isDouble() || !translateArray[1].isDouble() || !translateArray[2].isDouble() || (translateArray.size() == 4 && !translateArray[3].isDouble())) {
std::cout << "group translate must contain floating-point values" << std::endl;
return false;
}
@@ -652,7 +676,8 @@ bool ScenefileReader::parseGroupData(const QJsonObject &object, SceneNode *node)
translation->translate.x = translateArray[0].toDouble();
translation->translate.y = translateArray[1].toDouble();
translation->translate.z = translateArray[2].toDouble();
- translation->translate.w = translateArray[3].toDouble();
+ if (translateArray.size() == 4)
+ translation->translate.w = translateArray[3].toDouble();
node->transformations.push_back(translation);
}
@@ -665,11 +690,11 @@ bool ScenefileReader::parseGroupData(const QJsonObject &object, SceneNode *node)
}
QJsonArray rotateArray = object["rotate"].toArray();
- if (rotateArray.size() != 7) {
- std::cout << "group rotate must have 7 elements" << std::endl;
+ if (rotateArray.size() != 7 && rotateArray.size() != 4) {
+ std::cout << "group rotate must have 4 or 7 elements" << std::endl;
return false;
}
- if (!rotateArray[0].isDouble() || !rotateArray[1].isDouble() || !rotateArray[2].isDouble() || !rotateArray[3].isDouble() || !rotateArray[4].isDouble() || !rotateArray[5].isDouble() || !rotateArray[6].isDouble()) {
+ if (!rotateArray[0].isDouble() || !rotateArray[1].isDouble() || !rotateArray[2].isDouble() || !rotateArray[3].isDouble() || (rotateArray.size() == 7 && (!rotateArray[4].isDouble() || !rotateArray[5].isDouble() || !rotateArray[6].isDouble()))) {
std::cout << "group rotate must contain floating-point values" << std::endl;
return false;
}
@@ -679,10 +704,16 @@ bool ScenefileReader::parseGroupData(const QJsonObject &object, SceneNode *node)
rotation->rotate3.x = rotateArray[0].toDouble();
rotation->rotate3.y = rotateArray[1].toDouble();
rotation->rotate3.z = rotateArray[2].toDouble();
- rotation->rotateW.x = rotateArray[3].toDouble();
- rotation->rotateW.y = rotateArray[4].toDouble();
- rotation->rotateW.z = rotateArray[5].toDouble();
- rotation->angle = rotateArray[6].toDouble() * M_PI / 180.f;
+ if (rotateArray.size() == 7) {
+ rotation->rotateW.x = rotateArray[4].toDouble();
+ rotation->rotateW.y = rotateArray[5].toDouble();
+ rotation->rotateW.z = rotateArray[6].toDouble();
+ } else {
+ rotation->rotateW.x = 0;
+ rotation->rotateW.y = 0;
+ rotation->rotateW.z = 0;
+ }
+ rotation->angle = rotateArray[(rotateArray.size() == 7) ? 3 : 6].toDouble() * M_PI / 180.f;
node->transformations.push_back(rotation);
}
@@ -695,11 +726,11 @@ bool ScenefileReader::parseGroupData(const QJsonObject &object, SceneNode *node)
}
QJsonArray scaleArray = object["scale"].toArray();
- if (scaleArray.size() != 4) {
- std::cout << "group scale must have 4 elements" << std::endl;
+ if (scaleArray.size() != 4 && scaleArray.size() != 3) {
+ std::cout << "group scale must have 3-4 elements" << std::endl;
return false;
}
- if (!scaleArray[0].isDouble() || !scaleArray[1].isDouble() || !scaleArray[2].isDouble() || !scaleArray[3].isDouble()) {
+ if (!scaleArray[0].isDouble() || !scaleArray[1].isDouble() || !scaleArray[2].isDouble() || (scaleArray.size() == 4 && !scaleArray[3].isDouble())) {
std::cout << "group scale must contain floating-point values" << std::endl;
return false;
}
@@ -709,7 +740,8 @@ bool ScenefileReader::parseGroupData(const QJsonObject &object, SceneNode *node)
scale->scale.x = scaleArray[0].toDouble();
scale->scale.y = scaleArray[1].toDouble();
scale->scale.z = scaleArray[2].toDouble();
- scale->scale.w = scaleArray[3].toDouble();
+ if (scaleArray.size() == 4)
+ scale->scale.w = scaleArray[3].toDouble();
node->transformations.push_back(scale);
}
@@ -722,8 +754,8 @@ bool ScenefileReader::parseGroupData(const QJsonObject &object, SceneNode *node)
}
QJsonArray matrixArray = object["matrix"].toArray();
- if (matrixArray.size() != 5) {
- std::cout << "group matrix must be 5x5" << std::endl;
+ if (matrixArray.size() != 5 && matrixArray.size() != 4) {
+ std::cout << "group matrix must be 4x4 or 5x5" << std::endl;
return false;
}
@@ -742,8 +774,8 @@ bool ScenefileReader::parseGroupData(const QJsonObject &object, SceneNode *node)
}
QJsonArray rowArray = row.toArray();
- if (rowArray.size() != 5) {
- std::cout << "group matrix must be 5x5" << std::endl;
+ if (rowArray.size() != 5 && rowArray.size() != 4) {
+ std::cout << "group matrix must be 4x4 or 5x5" << std::endl;
return false;
}
diff --git a/src/utils/sceneparser.cpp b/src/utils/sceneparser.cpp
index 12f83bc..6d668ff 100644
--- a/src/utils/sceneparser.cpp
+++ b/src/utils/sceneparser.cpp
@@ -43,7 +43,7 @@ void initTree(SceneNode* currentNode, std::vector<RenderShapeData> *shapes, std:
SceneParser::translate4(currentTranslation4d, t->translate);
break;
case TransformationType::TRANSFORMATION_SCALE:
- SceneParser::scale4(currentTranslation4d, t->scale);
+ SceneParser::scale4(currentCTM, t->scale);
break;
case TransformationType::TRANSFORMATION_ROTATE:
currentCTM *= SceneParser::getRotationMatrix4(t->angle, t->rotate3, t->rotateW);
@@ -62,11 +62,11 @@ void initTree(SceneNode* currentNode, std::vector<RenderShapeData> *shapes, std:
for(auto primitive : currentNode->primitives) {
// primitive->material.textureData = loadTextureFromFile(QString::fromStdString(primitive->material.textureMap.filename));
RenderShapeData rsd = {
- primitive: *primitive,
- ctm: currentCTM,
- translation4d: currentTranslation4d,
- inverseCTM: glm::inverse(currentCTM),
- inverseTranslation4d: -currentTranslation4d,
+ .primitive = *primitive,
+ .ctm = currentCTM,
+ .translation4d = currentTranslation4d,
+ .inverseCTM = glm::inverse(currentCTM),
+ .inverseTranslation4d = -currentTranslation4d,
};
shapes->push_back(rsd);
}
@@ -176,11 +176,11 @@ void SceneParser::translate4(
}
void SceneParser::scale4(
- glm::vec4 &v1,
- glm::vec4 v2
+ glm::mat4 &m,
+ glm::vec4 v
) {
- v1.x *= v2.x;
- v1.y *= v2.y;
- v1.z *= v2.z;
- v1.w *= v2.w;
+ m[0][0] *= v.x;
+ m[1][1] *= v.y;
+ m[2][2] *= v.z;
+ m[3][3] *= v.w;
} \ No newline at end of file
diff --git a/src/utils/sceneparser.h b/src/utils/sceneparser.h
index fa8a2ac..130156a 100644
--- a/src/utils/sceneparser.h
+++ b/src/utils/sceneparser.h
@@ -35,5 +35,5 @@ public:
static void translate4(glm::vec4 &v1, glm::vec4 v2);
- static void scale4(glm::vec4 &v1, glm::vec4 v2);
+ static void scale4(glm::mat4 &m, glm::vec4 v);
};