Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@slapin
Created June 11, 2018 11:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save slapin/6cfbfe4852cc2d9809f0b5ff7c9dcb36 to your computer and use it in GitHub Desktop.
Save slapin/6cfbfe4852cc2d9809f0b5ff7c9dcb36 to your computer and use it in GitHub Desktop.
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