Created
June 11, 2018 11:57
-
-
Save slapin/6cfbfe4852cc2d9809f0b5ff7c9dcb36 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class BGroup { | |
struct BoneData { | |
Urho3D::Node *node; | |
Urho3D::Vector3 scale; | |
Urho3D::Vector3 translation; | |
Urho3D::Vector3 default_loc; | |
Urho3D::Vector3 default_scale; | |
}; | |
Urho3D::Vector<BoneData> modifiers; | |
struct PreserveData { | |
Urho3D::Node *node; | |
unsigned int flags; | |
Urho3D::Vector3 orig_scale; | |
Urho3D::Vector3 orig_pos; | |
Urho3D::Quaternion orig_rot; | |
}; | |
Urho3D::Vector<PreserveData> preserve; | |
public: | |
static const unsigned int SCALE = 1; | |
static const unsigned int TRANS = 2; | |
static const unsigned int ROT = 4; | |
Urho3D::String name; | |
float slider_min; | |
float slider_max; | |
float slider_cur; | |
BGroup() | |
{ | |
slider_min = 0.0f; | |
slider_max = 0.0f; | |
slider_cur = 0.0f; | |
} | |
bool Contains(Urho3D::Node *node) | |
{ | |
for (int i = 0; i < modifiers.Size(); i++) { | |
if (modifiers[i].node == node) | |
return true; | |
if (modifiers[i].node->GetName() == node->GetName()) | |
return true; | |
} | |
return false; | |
} | |
bool IsPreserve(Urho3D::Node *node) | |
{ | |
for (int i = 0; i < preserve.Size(); i++) { | |
if (preserve[i].node == node) | |
return true; | |
if (preserve[i].node->GetName() == node->GetName()) | |
return true; | |
} | |
return false; | |
} | |
bool IsPreserveFlag(const Urho3D::Node *node, unsigned int flags) const | |
{ | |
for (int i = 0; i < preserve.Size(); i++) { | |
if (preserve[i].node == node && (preserve[i].flags & flags)) | |
return true; | |
else if (preserve[i].node->GetName() == node->GetName() | |
&& (preserve[i].flags & flags)) | |
return true; | |
} | |
return false; | |
} | |
inline bool IsPreserveScale(const Urho3D::Node *node) const | |
{ | |
return IsPreserveFlag(node, SCALE); | |
} | |
inline bool IsPreserveTranslate(const Urho3D::Node *node) const | |
{ | |
return IsPreserveFlag(node, TRANS); | |
} | |
inline bool IsPreserveRotate(const Urho3D::Node *node) const | |
{ | |
return IsPreserveFlag(node, ROT); | |
} | |
void ClearPreserveFlag(const Urho3D::Node *node, unsigned int flags) | |
{ | |
for (int i = 0; i < preserve.Size(); i++) { | |
if (preserve[i].node == node) | |
preserve[i].flags &= ~flags; | |
else if (preserve[i].node->GetName() == node->GetName()) | |
preserve[i].flags &= ~flags; | |
} | |
} | |
inline void ClearPreserveAllFlags(const Urho3D::Node *node) | |
{ | |
ClearPreserveFlag(node, 0xffffffffU); | |
} | |
void SetPreserveFlag(const Urho3D::Node *node, unsigned int flags) | |
{ | |
for (int i = 0; i < preserve.Size(); i++) { | |
if (preserve[i].node == node) | |
preserve[i].flags |= flags; | |
else if (preserve[i].node->GetName() == node->GetName()) | |
preserve[i].flags |= flags; | |
} | |
} | |
inline void SetPreserveScale(const Urho3D::Node *node, bool val) | |
{ | |
if (val) | |
SetPreserveFlag(node, SCALE); | |
else | |
ClearPreserveFlag(node, SCALE); | |
} | |
inline void SetPreserveTranslate(const Urho3D::Node *node, bool val) | |
{ | |
if (val) | |
SetPreserveFlag(node, TRANS); | |
else | |
ClearPreserveFlag(node, TRANS); | |
} | |
inline void SetPreserveRotate(const Urho3D::Node *node, bool val) | |
{ | |
if (val) | |
SetPreserveFlag(node, ROT); | |
else | |
ClearPreserveFlag(node, ROT); | |
} | |
bool Contains(Urho3D::String name) | |
{ | |
for (int i = 0; i < modifiers.Size(); i++) { | |
if (modifiers[i].node->GetName() == name) | |
return true; | |
} | |
return false; | |
} | |
bool IsPreserve(Urho3D::String name) | |
{ | |
for (int i = 0; i < preserve.Size(); i++) { | |
if (preserve[i].node->GetName() == name) | |
return true; | |
} | |
return false; | |
} | |
void AddModifier(Urho3D::Node *node, Urho3D::Vector3 scale, Urho3D::Vector3 translation) | |
{ | |
struct BoneData m; | |
m.node = node; | |
m.scale = scale; | |
m.translation = translation; | |
m.default_loc = node->GetPosition(); | |
m.default_scale = node->GetScale(); | |
modifiers.Push(m); | |
} | |
void AddPreserve(Urho3D::Node *node, unsigned int flags) | |
{ | |
PreserveData pdata; | |
pdata.node = node; | |
pdata.flags = flags; | |
preserve.Push(pdata); | |
} | |
void RemoveModifier(Urho3D::Node *node) | |
{ | |
for (int i = 0; i < modifiers.Size(); i++) { | |
if (modifiers[i].node == node) { | |
modifiers.Erase(i); | |
return; | |
} | |
} | |
} | |
Urho3D::Vector3 GetModifierScale(Urho3D::Node *node) const | |
{ | |
for (int i = 0; i < modifiers.Size(); i++) { | |
if (modifiers[i].node == node) | |
return modifiers[i].scale; | |
} | |
return Urho3D::Vector3(1, 1, 1); | |
} | |
Urho3D::Vector3 GetModifierTranslation(Urho3D::Node *node) const | |
{ | |
for (int i = 0; i < modifiers.Size(); i++) { | |
if (modifiers[i].node == node) | |
return modifiers[i].translation; | |
} | |
return Urho3D::Vector3(0, 0, 0); | |
} | |
void SetModifierScale(Urho3D::Node *node, Urho3D::Vector3& scale) | |
{ | |
for (int i = 0; i < modifiers.Size(); i++) { | |
if (modifiers[i].node == node) | |
modifiers[i].scale = scale; | |
} | |
} | |
void SetModifierTranslation(Urho3D::Node *node, Urho3D::Vector3& translation) | |
{ | |
for (int i = 0; i < modifiers.Size(); i++) { | |
if (modifiers[i].node == node) | |
modifiers[i].translation = translation; | |
} | |
} | |
inline Urho3D::Vector3 GetModifierScale(int no) const | |
{ | |
return modifiers[no].scale; | |
} | |
inline Urho3D::Vector3 GetModifierTranslation(int no) const | |
{ | |
return modifiers[no].translation; | |
} | |
inline Urho3D::String GetModifierName(int no) const | |
{ | |
return modifiers[no].node->GetName(); | |
} | |
inline Urho3D::String GetPreserveName(int no) const | |
{ | |
return preserve[no].node->GetName(); | |
} | |
inline unsigned int GetPreserveFlags(int no) const | |
{ | |
return preserve[no].flags; | |
} | |
inline int GetModifierCount() const | |
{ | |
return modifiers.Size(); | |
} | |
inline int GetPreserveCount() const | |
{ | |
return preserve.Size(); | |
} | |
void Init() | |
{ | |
for (int i = 0; i < modifiers.Size(); i++) { | |
modifiers[i].node->SetScale(modifiers[i].default_scale); | |
modifiers[i].node->SetPosition(modifiers[i].default_loc); | |
} | |
} | |
void SetSliderValue(float value) | |
{ | |
slider_cur = value; | |
/* Save original transforms for bones we want to keep sizes */ | |
for (int i = 0; i < preserve.Size(); i++) { | |
preserve[i].orig_scale = preserve[i].node->GetWorldScale(); | |
preserve[i].orig_pos = modifiers[i].node->GetWorldPosition(); | |
preserve[i].orig_rot = modifiers[i].node->GetWorldRotation(); | |
} | |
for (int i = 0; i < modifiers.Size(); i++) { | |
Urho3D::Vector3 orig_scale = modifiers[i].node->GetScale(); | |
Urho3D::Vector3 orig_pos = modifiers[i].node->GetPosition(); | |
modifiers[i].node->SetScale(orig_scale + modifiers[i].scale * value); | |
modifiers[i].node->SetPosition(orig_pos + modifiers[i].translation * value); | |
} | |
/* Restore original transforms for bones we want to keep sizes */ | |
for (int i = 0; i < preserve.Size(); i++) { | |
if (preserve[i].flags & SCALE) | |
preserve[i].node->SetWorldScale(preserve[i].orig_scale); | |
if (preserve[i].flags & TRANS) | |
preserve[i].node->SetWorldPosition(preserve[i].orig_pos); | |
if (preserve[i].flags & ROT) | |
preserve[i].node->SetWorldRotation(preserve[i].orig_rot); | |
} | |
} | |
float GetSliderValue() const | |
{ | |
return slider_cur; | |
} | |
}; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment