فهرست منبع

Fixed weighted scaling tracks in skeletal animation, fixed crash in the IDE when a clipboard data provider is destroyed

Ivan Safrin 11 سال پیش
والد
کامیت
ab747dddae

+ 1 - 2
Core/Contents/Source/PolySkeleton.cpp

@@ -447,9 +447,8 @@ void BoneTrack::Update(Number elapsed) {
 
     targetBone->setPosition((position * weight) + (targetBone->getPosition() * (1.0 - weight)));
     
-    targetBone->setScale(scale);
+    targetBone->setScale((scale * weight) + (targetBone->getScale() * (1.0 - weight)));
     
-    Vector3 newScale = ((scale - Vector3(1.0, 1.0, 1.0)) * weight) + Vector3(1.0, 1.0, 1.0);
 }
 
 void BoneTrack::setSpeed(Number speed) {

+ 2 - 0
IDE/Contents/Include/PolycodeClipboard.h

@@ -40,6 +40,8 @@ class PolycodeClipboard {
 		void setData(void *data, String type, ClipboardProvider *provider);
 		void *getData();
 		String getType();
+        ClipboardProvider *getCurrentProvider();
+        void setCurrentProvider(ClipboardProvider *provider);
 
 	protected:
 

+ 9 - 1
IDE/Contents/Source/PolycodeClipboard.cpp

@@ -31,7 +31,7 @@ void PolycodeClipboard::setData(void *data, String type, ClipboardProvider *prov
 	if(!data)
 		return;
 
-	if(this->data) {
+	if(this->data && currentProvider) {
 		currentProvider->destroyClipboardData(this->data, this->type);
 		this->data = NULL;
 		currentProvider = NULL;
@@ -42,6 +42,14 @@ void PolycodeClipboard::setData(void *data, String type, ClipboardProvider *prov
 	currentProvider = provider;
 }
 
+ClipboardProvider *PolycodeClipboard::getCurrentProvider() {
+    return currentProvider;
+}
+
+void PolycodeClipboard::setCurrentProvider(ClipboardProvider *provider) {
+    currentProvider = provider;
+}
+
 void *PolycodeClipboard::getData() {
 	return data;
 }

+ 6 - 0
IDE/Contents/Source/PolycodeEditor.cpp

@@ -181,6 +181,12 @@ PolycodeEditor::~PolycodeEditor() {
 	if(editorHolder) {
 		editorHolder->setEditor(NULL);
 	}
+    
+    if(globalClipboard->getCurrentProvider() == this) {
+        destroyClipboardData(globalClipboard->getData(), globalClipboard->getType());
+        globalClipboard->setCurrentProvider(NULL);
+    }
+    
 	Core *core = CoreServices::getInstance()->getCore();
 	core->removeAllHandlersForListener(this);
 }