Add origin and offsets
Origin point for a model part can be set with `origin` in model.toml; position and scale offsets can be set with `pos_offset` and `scale_offset` respectively.
This commit is contained in:
parent
4bb1c17ce4
commit
941c2043cd
13
TODO.md
13
TODO.md
|
@ -1,8 +1,11 @@
|
||||||
# Before 1.0
|
# Before 1.0
|
||||||
|
|
||||||
## model
|
|
||||||
- scale offset
|
|
||||||
- position offset (or origin)
|
|
||||||
|
|
||||||
## graphics
|
## graphics
|
||||||
- prevent stretching from windows aspect ratio
|
- prevent stretching from window aspect ratio
|
||||||
|
- smoothing
|
||||||
|
|
||||||
|
## docs
|
||||||
|
- model format documentation
|
||||||
|
|
||||||
|
## vision
|
||||||
|
- fix worse facemark on dnn mode (maybe due to non-square roi?)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <zip.h>
|
#include <zip.h>
|
||||||
#include <fmt/core.h>
|
#include <fmt/core.h>
|
||||||
|
#include <glm/vec2.hpp>
|
||||||
#include <tomlcpp.hpp> //dynamically link tomlcpp if it becomes common in repositories
|
#include <tomlcpp.hpp> //dynamically link tomlcpp if it becomes common in repositories
|
||||||
#include <model.hpp>
|
#include <model.hpp>
|
||||||
#include <config.hpp>
|
#include <config.hpp>
|
||||||
|
@ -11,7 +12,7 @@
|
||||||
#define BUFFER_SIZE_TEXTURE 16777220 // 16 MiB
|
#define BUFFER_SIZE_TEXTURE 16777220 // 16 MiB
|
||||||
|
|
||||||
#define SUPPORTED_MODEL_MAJOR 0
|
#define SUPPORTED_MODEL_MAJOR 0
|
||||||
#define SUPPORTED_MODEL_MINOR 2
|
#define SUPPORTED_MODEL_MINOR 3
|
||||||
|
|
||||||
void textureFromArchive(zip_t* archive, const char* path, ModelPart* part, size_t slot, std::string triggerName) {
|
void textureFromArchive(zip_t* archive, const char* path, ModelPart* part, size_t slot, std::string triggerName) {
|
||||||
zip_file_t* textureFile = zip_fopen(archive, path, 0);
|
zip_file_t* textureFile = zip_fopen(archive, path, 0);
|
||||||
|
@ -112,9 +113,9 @@ Model::Model(const char* path) {
|
||||||
newPart.setFollowTarget(parentResult.second);
|
newPart.setFollowTarget(parentResult.second);
|
||||||
|
|
||||||
if (factorResult.first) {
|
if (factorResult.first) {
|
||||||
newPart.setFollowFactor((float)factorResult.second);
|
newPart.factor = (float)factorResult.second;
|
||||||
} else {
|
} else {
|
||||||
newPart.setFollowFactor(1.0f);
|
newPart.factor = 1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,10 +124,35 @@ Model::Model(const char* path) {
|
||||||
auto scaleFacResult = partsVec[i].getDouble("scale_factor");
|
auto scaleFacResult = partsVec[i].getDouble("scale_factor");
|
||||||
|
|
||||||
if (rotFacResult.first) {
|
if (rotFacResult.first) {
|
||||||
newPart.setRotationFactor((float)rotFacResult.second);
|
newPart.rotFactor = (float)rotFacResult.second;
|
||||||
}
|
}
|
||||||
if (scaleFacResult.first) {
|
if (scaleFacResult.first) {
|
||||||
newPart.setScaleFactor((float)scaleFacResult.second);
|
newPart.scaleFactor = (float)scaleFacResult.second;
|
||||||
|
}
|
||||||
|
|
||||||
|
// origin
|
||||||
|
auto originArray = partsVec[i].getArray("origin");
|
||||||
|
|
||||||
|
if (originArray) {
|
||||||
|
auto originVec = *originArray->getDoubleVector();
|
||||||
|
|
||||||
|
newPart.origin = glm::vec2((float)originVec[0], (float)originVec[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// offsets
|
||||||
|
|
||||||
|
auto posOffsetArray = partsVec[i].getArray("pos_offset");
|
||||||
|
if (posOffsetArray) {
|
||||||
|
auto offsetVec = *posOffsetArray->getDoubleVector();
|
||||||
|
|
||||||
|
newPart.posOffset = glm::vec2((float)offsetVec[0], (float)offsetVec[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto scaleOffsetArray = partsVec[i].getArray("scale_offset");
|
||||||
|
if (scaleOffsetArray) {
|
||||||
|
auto offsetVec = *scaleOffsetArray->getDoubleVector();
|
||||||
|
|
||||||
|
newPart.scaleOffset = glm::vec2((float)offsetVec[0], (float)offsetVec[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// texture
|
// texture
|
||||||
|
|
|
@ -40,22 +40,11 @@ void ModelPart::setFollowTarget(std::string followTarget) {
|
||||||
follow = bindStringToNum[followTarget];
|
follow = bindStringToNum[followTarget];
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelPart::setFollowFactor(float followFactor) {
|
|
||||||
factor = followFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelPart::setRotationFactor(float rotationFactor) {
|
|
||||||
rotFactor = rotationFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelPart::setScaleFactor(float scaleFac) {
|
|
||||||
scaleFactor = scaleFac;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelPart::setTransform(glm::vec2 position, float rotation, float scale) {
|
void ModelPart::setTransform(glm::vec2 position, float rotation, float scale) {
|
||||||
transMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(position.x, -position.y, 0.0f));
|
transMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(position.x, -position.y, 0.0f) + glm::vec3(posOffset, 0.0f));
|
||||||
transMatrix = glm::rotate(transMatrix, rotation * rotFactor, glm::vec3(0.0f, 0.0f, 1.0f));
|
transMatrix = glm::rotate(transMatrix, rotation * rotFactor, glm::vec3(0.0f, 0.0f, 1.0f));
|
||||||
transMatrix = glm::scale(transMatrix, glm::vec3(1,1,1) + (scale - 1) * scaleFactor);
|
transMatrix = glm::scale(transMatrix, glm::vec3(1,1,1) + (scale - 1 + glm::vec3(scaleOffset, 0.0f)) * scaleFactor);
|
||||||
|
transMatrix = glm::translate(transMatrix, glm::vec3(-origin, 0.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelPart::processFaceData(struct FaceData faceData) {
|
void ModelPart::processFaceData(struct FaceData faceData) {
|
||||||
|
|
|
@ -24,6 +24,9 @@ class ModelPart {
|
||||||
|
|
||||||
glm::mat4 transMatrix = glm::mat4(1.0f);
|
glm::mat4 transMatrix = glm::mat4(1.0f);
|
||||||
|
|
||||||
|
bool empty = true;
|
||||||
|
|
||||||
|
public:
|
||||||
int bind = BIND_NULL;
|
int bind = BIND_NULL;
|
||||||
int follow = BIND_NULL;
|
int follow = BIND_NULL;
|
||||||
float factor = 0.0f; //default factor of 0 so part will not follow a null by default
|
float factor = 0.0f; //default factor of 0 so part will not follow a null by default
|
||||||
|
@ -31,19 +34,18 @@ class ModelPart {
|
||||||
float rotFactor = 1.0f;
|
float rotFactor = 1.0f;
|
||||||
float scaleFactor = 1.0f;
|
float scaleFactor = 1.0f;
|
||||||
|
|
||||||
bool empty = true;
|
glm::vec2 posOffset = glm::vec2(0,0);
|
||||||
|
glm::vec2 scaleOffset = glm::vec2(0,0);
|
||||||
|
|
||||||
|
glm::vec2 origin = glm::vec2(0,0);
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
ModelPart();
|
ModelPart();
|
||||||
|
|
||||||
void bindAndDraw();
|
void bindAndDraw();
|
||||||
|
|
||||||
void setBind(std::string bindString);
|
void setBind(std::string bindName);
|
||||||
void setFollowTarget(std::string followString);
|
void setFollowTarget(std::string followTarget);
|
||||||
void setFollowFactor(float followFactor);
|
|
||||||
|
|
||||||
void setRotationFactor(float rotationFactor);
|
|
||||||
void setScaleFactor(float scaleFactor);
|
|
||||||
|
|
||||||
void setTransform(glm::vec2 position, float rotation, float scale);
|
void setTransform(glm::vec2 position, float rotation, float scale);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue