diff --git a/hide/view/Model.hx b/hide/view/Model.hx index f9623093..8232cc9f 100644 --- a/hide/view/Model.hx +++ b/hide/view/Model.hx @@ -38,7 +38,7 @@ class Model extends FileView { override function save() { - // if(!modified) return; + if(!modified) return; // Save render props if (Ide.inst.currentConfig.get("sceneeditor.renderprops.edit", false) && sceneEditor.renderPropsRoot != null) @@ -50,7 +50,15 @@ class Model extends FileView { if (hmd == null) continue; - h3d.prim.ModelDatabase.current.saveModelProps(o.name, hmd); + var input : h3d.prim.ModelDatabase.ModelDataInput = { + resourceDirectory : @:privateAccess hmd.lib.resource.entry.directory, + resourceName : @:privateAccess hmd.lib.resource.name, + objectName : o.name, + hmd : hmd, + skin : o.find((o) -> Std.downcast(o, h3d.scene.Skin)) + } + + h3d.prim.ModelDatabase.current.saveModelProps(input); } // Save current Anim data @@ -70,19 +78,6 @@ class Model extends FileView { hxd.File.saveBytes(getPropsPath(), bytes.getBytes()); } - // Save dynamic Bones - var skin = obj.find((o) -> Std.downcast(o, h3d.scene.Skin)); - if (skin != null) { - var skinData = skin.getSkinData(); - for (j in skinData.allJoints) { - var dynJoint = Std.downcast(j, h3d.anim.Skin.DynamicJoint); - if (dynJoint == null) - continue; - - trace(dynJoint.name); - } - } - super.save(); } @@ -642,44 +637,65 @@ class Model extends FileView { var dynJointEl = new Element('
Is Dynamic
-
Damping
-
Resistance
-
Stiffness
-
Slackness
+
+
Damping
+
Resistance
+
Stiffness
+
Slackness
+
'); var isDynEl = dynJointEl.find("#dynamic"); isDynEl.get(0).toggleAttribute('checked', Std.downcast(j, h3d.anim.Skin.DynamicJoint) != null); + if (!isDynEl.is(':checked')) + dynJointEl.find(".dynamic-edition").hide(); isDynEl.change(function(e) { - var newV = isDynEl.is(':checked'); - function setToDynamic(j : h3d.anim.Skin.Joint) { - var dynJ = new h3d.anim.Skin.DynamicJoint(); - dynJ.index = j.index; - dynJ.name = j.name; - dynJ.bindIndex = j.bindIndex; - dynJ.splitIndex = j.splitIndex; - dynJ.defMat = j.defMat; - dynJ.transPos = j.transPos; - dynJ.parent = j.parent; - dynJ.follow = j.follow; - dynJ.subs = j.subs; - dynJ.worldPos = j.worldPos; - dynJ.offsets = j.offsets; - dynJ.offsetRay = j.offsetRay; - dynJ.retargetAnim = j.retargetAnim; - skinData.allJoints[j.index] = dynJ; - - j.parent.subs.remove(j); - j.parent.subs.push(dynJ); - - for (s in dynJ.subs) - setToDynamic(s); + function toggleDynamicJoint(j : h3d.anim.Skin.Joint, isDynamic : Bool) { + var newJ = isDynamic ? new h3d.anim.Skin.DynamicJoint() : new h3d.anim.Skin.Joint(); + newJ.index = j.index; + newJ.name = j.name; + newJ.bindIndex = j.bindIndex; + newJ.splitIndex = j.splitIndex; + newJ.defMat = j.defMat; + newJ.transPos = j.transPos; + newJ.parent = j.parent; + newJ.follow = j.follow; + newJ.subs = j.subs; + newJ.worldPos = j.worldPos; + newJ.offsets = j.offsets; + newJ.offsetRay = j.offsetRay; + newJ.retargetAnim = j.retargetAnim; + skinData.allJoints[j.index] = newJ; + + j.parent?.subs.remove(j); + j.parent?.subs.push(newJ); + + if (!isDynamic) { + if (j.parent != null) + toggleDynamicJoint(j.parent, isDynamic); + } + else { + for (s in newJ.subs) + toggleDynamicJoint(s, isDynamic); + } } - if (newV) { - setToDynamic(j); + var v = isDynEl.is(':checked'); + var oldJoints = skinData.allJoints.copy(); + toggleDynamicJoint(j, v); + skin.setSkinData(skinData); + var newJoints = skinData.allJoints.copy(); + + function exec(undo) { + var joints = undo ? oldJoints : newJoints; + for (j in skinData.allJoints) + skinData.allJoints[j.index] = joints[j.index]; skin.setSkinData(skinData); + selectObject(obj); } + + exec(false); + properties.undo.change(Custom(exec)); }); var dynJoin = Std.downcast(j, h3d.anim.Skin.DynamicJoint); @@ -688,28 +704,60 @@ class Model extends FileView { damping.val(dynJoin.damping); damping.change(function(e) { var newV = damping.val(); - dynJoin.damping = newV; + var oldV = dynJoin.damping; + function exec(undo) { + var v = undo ? oldV : newV; + dynJoin.damping = v; + damping.val(v); + } + + exec(false); + properties.undo.change(Custom(exec)); }); var resistance = dynJointEl.find("#resistance"); resistance.val(dynJoin.resistance); resistance.change(function(e) { var newV = resistance.val(); - dynJoin.resistance = newV; + var oldV = dynJoin.resistance; + function exec(undo) { + var v = undo ? oldV : newV; + dynJoin.resistance = v; + resistance.val(v); + } + + exec(false); + properties.undo.change(Custom(exec)); }); var stiffness = dynJointEl.find("#stiffness"); stiffness.val(dynJoin.stiffness); stiffness.change(function(e) { var newV = stiffness.val(); - dynJoin.stiffness = newV; + var oldV = dynJoin.stiffness; + function exec(undo) { + var v = undo ? oldV : newV; + dynJoin.stiffness = v; + stiffness.val(v); + } + + exec(false); + properties.undo.change(Custom(exec)); }); var slackness = dynJointEl.find("#slackness"); slackness.val(dynJoin.slackness); slackness.change(function(e) { var newV = slackness.val(); - dynJoin.slackness = newV; + var oldV = dynJoin.slackness; + function exec(undo) { + var v = undo ? oldV : newV; + dynJoin.slackness = v; + slackness.val(v); + } + + exec(false); + properties.undo.change(Custom(exec)); }); }