Merge scene editor fixes. psp
authorachurch
Tue, 16 Aug 2011 18:58:45 +0900
branchpsp
changeset 681 a5d2035a0e21
parent 678 fb9f83735dc5 (current diff)
parent 680 8e56fbb5eac0 (diff)
child 683 d547e415fbb9
Merge scene editor fixes.
Aquaria/SceneEditor.cpp
BBGE/RenderObjectLayer.cpp
--- a/Aquaria/SceneEditor.cpp	Wed Jul 27 23:10:38 2011 +0900
+++ b/Aquaria/SceneEditor.cpp	Tue Aug 16 18:58:45 2011 +0900
@@ -2419,15 +2419,19 @@
 		{
 			Element *e = selectedElements[i];
 			core->removeRenderObject(e, Core::DO_NOT_DESTROY_RENDER_OBJECT);
+			dsq->removeElement(e);
+			e->bgLayer = bgLayer;
+			dsq->addElement(e);
 			core->addRenderObject(e, LR_ELEMENTS1+bgLayer);
-			e->bgLayer = bgLayer;
 		}
 	}
 	else if (e)
 	{
 		core->removeRenderObject(e, Core::DO_NOT_DESTROY_RENDER_OBJECT);
+		dsq->removeElement(e);
+		e->bgLayer = bgLayer;
+		dsq->addElement(e);
 		core->addRenderObject(e, LR_ELEMENTS1+bgLayer);
-		e->bgLayer = bgLayer;
 	}
 }
 
--- a/BBGE/RenderObjectLayer.cpp	Wed Jul 27 23:10:38 2011 +0900
+++ b/BBGE/RenderObjectLayer.cpp	Tue Aug 16 18:58:45 2011 +0900
@@ -229,8 +229,8 @@
 		renderObjects[curIdx] = 0;
 		renderObjects[newIdx] = r;
 		r->setIdx(newIdx);
-		if (firstFreeIdx == newIdx)
-			firstFreeIdx++;
+		if (firstFreeIdx > curIdx)
+			firstFreeIdx = curIdx;
 	}
 	else if (objectCount == size)
 	{
@@ -242,7 +242,7 @@
 		r->setIdx(size);
 		for (int i = size+1; i < newSize; i++)
 			renderObjects[i] = 0;
-		firstFreeIdx = size+1;
+		firstFreeIdx = curIdx;
 	}
 	else
 	{
@@ -254,17 +254,16 @@
 			if (!renderObjects[lastFree])
 				break;
 		}
-
 		for (int i = lastFree + 1; i <= lastUsed; i++)
 		{
 			renderObjects[i-1] = renderObjects[i];
-			renderObjects[i-1]->setIdx(i-1);
+			renderObjects[i-1]->setIdx(i-1);  // Known to be non-NULL.
 		}
-
 		renderObjects[lastUsed] = r;
 		r->setIdx(lastUsed);
-		if (firstFreeIdx == lastFree)
-			firstFreeIdx = lastUsed + 1;
+		firstFreeIdx = curIdx;
+		while (renderObjects[firstFreeIdx])
+			firstFreeIdx++;
 	}
 #endif  // RLT_FIXED
 #ifdef RLT_DYNAMIC
@@ -297,7 +296,9 @@
 		renderObjects[curIdx] = 0;
 		renderObjects[newIdx] = r;
 		r->setIdx(newIdx);
-		if (firstFreeIdx == newIdx)
+		// firstFreeIdx must be 0 here; if we filled slot 0, then
+		// scan forward for the next empty element.
+		while (!renderObjects[firstFreeIdx])
 			firstFreeIdx++;
 	}
 	else if (objectCount == size)
@@ -311,7 +312,7 @@
 		for (int i = newSize - 1; i >= sizeDiff; i--)
 		{
 			renderObjects[i] = renderObjects[i - sizeDiff];
-			renderObjects[i]->setIdx(i);
+			renderObjects[i]->setIdx(i);  // Known to be non-NULL.
 		}
 		for (int i = 0; i < newIdx; i++)
 			renderObjects[i] = 0;
@@ -327,7 +328,7 @@
 		for (int i = firstFreeIdx; i > 0; i--)
 		{
 			renderObjects[i] = renderObjects[i-1];
-			renderObjects[i]->setIdx(i);
+			renderObjects[i]->setIdx(i);  // Known to be non-NULL.
 		}
 		renderObjects[0] = r;
 		r->setIdx(0);