浏览代码

Add radius and count parameters. Add spawn window layout

szamq 11 年之前
父节点
当前提交
e17dea61cf
共有 2 个文件被更改,包括 352 次插入37 次删除
  1. 70 37
      Bin/Data/Scripts/Editor/EditorSpawn.as
  2. 282 0
      Bin/Data/UI/EditorSpawnWindow.xml

+ 70 - 37
Bin/Data/Scripts/Editor/EditorSpawn.as

@@ -6,11 +6,15 @@ LineEdit@ randomRotationZ;
 LineEdit@ randomScaleMinEdit;
 LineEdit@ randomScaleMaxEdit;
 LineEdit@ NumberSpawnedObjectsEdit;
+LineEdit@ spawnRadiusEdit;
+LineEdit@ spawnCountEdit;
 
 Window@ spawnWindow;
 Vector3 randomRotation=Vector3(0.f,0.f,0.f);
 float randomScaleMin=1;
 float randomScaleMax=1;
+float spawnCount=1;
+float spawnRadius=0;
 bool useNormal=true;
 
 int numberSpawnedObjects=1;
@@ -44,15 +48,25 @@ void CreateSpawnEditor()
 	randomScaleMaxEdit.text=String(randomScaleMax);
 	CheckBox@ useNormalToggle = spawnWindow.GetChild("UseNormal", true);
     useNormalToggle.checked = useNormal;
+
 	
 	NumberSpawnedObjectsEdit=spawnWindow.GetChild("NumberSpawnedObjects", true);
 	NumberSpawnedObjectsEdit.text=String(numberSpawnedObjects);
 	
+		
+	spawnRadiusEdit=spawnWindow.GetChild("SpawnRadius", true);
+	spawnCountEdit=spawnWindow.GetChild("SpawnCount", true);
+	spawnRadiusEdit.text=String(spawnRadius);
+	spawnCountEdit.text=String(spawnCount);
+	
+	
 	SubscribeToEvent(randomRotationX, "TextChanged", "EditRandomRotation");
     SubscribeToEvent(randomRotationY, "TextChanged", "EditRandomRotation");
     SubscribeToEvent(randomRotationZ, "TextChanged", "EditRandomRotation");
 	SubscribeToEvent(randomScaleMinEdit, "TextChanged", "EditRandomScale");
 	SubscribeToEvent(randomScaleMaxEdit, "TextChanged", "EditRandomScale");
+	SubscribeToEvent(spawnRadiusEdit, "TextChanged", "EditSpawnRadius");
+	SubscribeToEvent(spawnCountEdit, "TextChanged", "EditSpawnCount");
 	SubscribeToEvent(useNormalToggle, "Toggled", "ToggleUseNormal");
 	SubscribeToEvent(NumberSpawnedObjectsEdit, "TextFinished", "UpdateNumberSpawnedObjects");
 	SubscribeToEvent(spawnWindow.GetChild("SetSpawnMode", true), "Released", "SetSpawnMode");
@@ -61,7 +75,6 @@ void CreateSpawnEditor()
 
 bool ShowSpawnEditor()
 {
-    //RefreshMaterialEditor();
     spawnWindow.visible = true;
     spawnWindow.BringToFront();
     return true;
@@ -91,12 +104,12 @@ void EditRandomRotation(StringHash eventType, VariantMap& eventData)
 {
     LineEdit@ edit = eventData["Element"].GetPtr();
     randomRotation = Vector3(randomRotationX.text.ToFloat(), randomRotationY.text.ToFloat(), randomRotationZ.text.ToFloat());
-    if (edit.name == "RandomRotation.x")
-        edit.text = String(randomRotation.x);
-    else if (edit.name == "RandomRotation.y")
-        edit.text = String(randomRotation.y);
-    else if (edit.name == "RandomRotation.z")
-        edit.text = String(randomRotation.z);
+    //if (edit.name == "RandomRotation.x")
+    //    edit.text = String(randomRotation.x);
+    //else if (edit.name == "RandomRotation.y")
+    //    edit.text = String(randomRotation.y);
+    //else if (edit.name == "RandomRotation.z")
+    //    edit.text = String(randomRotation.z);
     UpdateHierarchyItem(editorScene);
 }
 
@@ -105,10 +118,10 @@ void EditRandomScale(StringHash eventType, VariantMap& eventData)
     LineEdit@ edit = eventData["Element"].GetPtr();
     randomScaleMin = randomScaleMinEdit.text.ToFloat();
 	randomScaleMax = randomScaleMaxEdit.text.ToFloat();
-	if (edit.name == "RandomScaleMin")
-        edit.text = String(randomScaleMin);
-    else if (edit.name == "RandomScaleMax")
-        edit.text = String(randomScaleMax);
+	//if (edit.name == "RandomScaleMin")
+    //    edit.text = String(randomScaleMin);
+    //else if (edit.name == "RandomScaleMax")
+    //    edit.text = String(randomScaleMax);
     UpdateHierarchyItem(editorScene);
 }
 
@@ -130,6 +143,19 @@ void UpdateNumberSpawnedObjects(StringHash eventType, VariantMap& eventData)
 	RefreshPickedObjects();
 }
 
+void EditSpawnRadius(StringHash eventType, VariantMap& eventData)
+{
+    LineEdit@ edit = eventData["Element"].GetPtr();
+	spawnRadius=edit.text.ToFloat();
+	//edit.text=String(spawnRadius);
+}
+void EditSpawnCount(StringHash eventType, VariantMap& eventData)
+{
+    LineEdit@ edit = eventData["Element"].GetPtr();
+	spawnCount=edit.text.ToFloat();
+	//edit.text=String(spawnCount);
+}
+
 void RefreshPickedObjects()
 {
 	spawnedObjectsNames.Resize(numberSpawnedObjects);
@@ -234,32 +260,39 @@ void SpawnObject()
 {
 	if(spawnedObjectsNames.length==0) return;
 	IntRect view = activeViewport.viewport.rect;
-	IntVector2 pos = ui.cursorPosition;
-	Ray cameraRay = camera.GetScreenRay(
-		float(pos.x - view.left) / view.width,
-		float(pos.y - view.top) / view.height);
-
-	if (pickMode < PICK_RIGIDBODIES)
-	{
-		if (editorScene.octree is null)
-			return;
-		RayQueryResult result = editorScene.octree.RaycastSingle(cameraRay, RAY_TRIANGLE, camera.farClip,
-			pickModeDrawableFlags[pickMode], 0x7fffffff);
-		if (result.drawable !is null)
-			PlaceObject(result.position, result.normal);
-	}
-	else
-	{
-		if (editorScene.physicsWorld is null)
-			return;
-
-		// If we are not running the actual physics update, refresh collisions before raycasting
-		if (!runUpdate)
-			editorScene.physicsWorld.UpdateCollisions();
-
-		PhysicsRaycastResult result = editorScene.physicsWorld.RaycastSingle(cameraRay, camera.farClip);
-		if (result.body !is null)
-			PlaceObject(result.position, result.normal);
+	
+	for(int i=0;i<spawnCount;i++)
+	{	
+		Vector2 norm=Vector2(Random(-1,1),Random(-1,1));
+		norm.Normalize();
+		norm=norm*(spawnRadius*Random(0,1));
+		IntVector2 pos = IntVector2(ui.cursorPosition.x+norm.x,ui.cursorPosition.y+norm.y);
+		Ray cameraRay = camera.GetScreenRay(
+			float(pos.x - view.left) / view.width,
+			float(pos.y - view.top) / view.height);
+
+		if (pickMode < PICK_RIGIDBODIES)
+		{
+			if (editorScene.octree is null)
+				return;
+			RayQueryResult result = editorScene.octree.RaycastSingle(cameraRay, RAY_TRIANGLE, camera.farClip,
+				pickModeDrawableFlags[pickMode], 0x7fffffff);
+			if (result.drawable !is null)
+				PlaceObject(result.position, result.normal);
+		}
+		else
+		{
+			if (editorScene.physicsWorld is null)
+				return;
+
+			// If we are not running the actual physics update, refresh collisions before raycasting
+			if (!runUpdate)
+				editorScene.physicsWorld.UpdateCollisions();
+
+			PhysicsRaycastResult result = editorScene.physicsWorld.RaycastSingle(cameraRay, camera.farClip);
+			if (result.body !is null)
+				PlaceObject(result.position, result.normal);
+		}
 	}
 }
 

+ 282 - 0
Bin/Data/UI/EditorSpawnWindow.xml

@@ -0,0 +1,282 @@
+<?xml version="1.0"?>
+<element type="Window">
+	<attribute name="Name" value="EditorSpawnDialog" />
+	<attribute name="Position" value="500 300" />
+	<attribute name="Size" value="320 301" />
+	<attribute name="Max Size" value="470 2147483647" />
+	<attribute name="Layout Mode" value="Vertical" />
+	<attribute name="Layout Spacing" value="4" />
+	<attribute name="Layout Border" value="6 6 6 6" />
+	<attribute name="Resize Border" value="0 6 0 6" />
+	<attribute name="Is Movable" value="true" />
+	<attribute name="Is Resizable" value="true" />
+	<element>
+		<attribute name="Min Size" value="128 16" />
+		<attribute name="Max Size" value="2147483647 16" />
+		<attribute name="Layout Mode" value="Horizontal" />
+		<element type="Text">
+			<attribute name="Top Left Color" value="0.85 0.85 0.85 1" />
+			<attribute name="Top Right Color" value="0.85 0.85 0.85 1" />
+			<attribute name="Bottom Left Color" value="0.85 0.85 0.85 1" />
+			<attribute name="Bottom Right Color" value="0.85 0.85 0.85 1" />
+			<attribute name="Text" value="Spawn settings" />
+		</element>
+		<element type="Button" style="CloseButton">
+			<attribute name="Name" value="CloseButton" />
+		</element>
+	</element>
+	<element type="BorderImage" style="EditorDivider" />
+	<element type="ListView" style="PanelView">
+		<attribute name="Min Size" value="0 60" />
+		<element type="ScrollBar" internal="true" style="none">
+			<attribute name="Size" value="308 16" />
+			<element type="Button" internal="true" style="none" />
+			<element type="Slider" internal="true" style="none">
+				<attribute name="Position" value="16 0" />
+				<attribute name="Size" value="276 16" />
+				<element type="BorderImage" internal="true" style="none" />
+			</element>
+			<element type="Button" internal="true" style="none">
+				<attribute name="Position" value="292 0" />
+			</element>
+		</element>
+		<element type="ScrollBar" internal="true" style="none">
+			<attribute name="Size" value="16 254" />
+			<element type="Button" internal="true" style="none" />
+			<element type="Slider" internal="true" style="none">
+				<attribute name="Position" value="0 16" />
+				<attribute name="Size" value="16 222" />
+				<element type="BorderImage" internal="true" style="none" />
+			</element>
+			<element type="Button" internal="true" style="none">
+				<attribute name="Position" value="0 238" />
+			</element>
+		</element>
+		<element type="BorderImage" internal="true" style="none">
+			<element internal="true" style="none">
+				<element style="ListRow">
+					<attribute name="Min Size" value="270 17" />
+					<attribute name="Layout Spacing" value="10" />
+					<element type="Text">
+						<attribute name="Top Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Top Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Text" value="Random rotation" />
+					</element>
+					<element type="LineEdit">
+						<attribute name="Name" value="RandomRotation.x" />
+						<attribute name="Min Size" value="40 0" />
+						<attribute name="Max Size" value="40 2147483647" />
+						<element type="Text" internal="true" style="none">
+							<attribute name="Top Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Top Right Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Right Color" value="0.9 1 0.9 1" />
+						</element>
+						<element type="BorderImage" internal="true" style="none">
+							<attribute name="Size" value="4 15" />
+						</element>
+					</element>
+					<element type="LineEdit">
+						<attribute name="Name" value="RandomRotation.y" />
+						<attribute name="Min Size" value="40 0" />
+						<attribute name="Max Size" value="40 2147483647" />
+						<element type="Text" internal="true" style="none">
+							<attribute name="Top Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Top Right Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Right Color" value="0.9 1 0.9 1" />
+						</element>
+						<element type="BorderImage" internal="true" style="none">
+							<attribute name="Size" value="4 15" />
+						</element>
+					</element>
+					<element type="LineEdit">
+						<attribute name="Name" value="RandomRotation.z" />
+						<attribute name="Min Size" value="40 0" />
+						<attribute name="Max Size" value="40 2147483647" />
+						<element type="Text" internal="true" style="none">
+							<attribute name="Top Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Top Right Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Right Color" value="0.9 1 0.9 1" />
+						</element>
+						<element type="BorderImage" internal="true" style="none">
+							<attribute name="Size" value="4 15" />
+						</element>
+					</element>
+				</element>
+				<element style="ListRow">
+					<attribute name="Min Size" value="260 17" />
+					<attribute name="Layout Spacing" value="10" />
+					<element type="Text">
+						<attribute name="Top Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Top Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Text" value="Random scale min/max" />
+					</element>
+					<element type="LineEdit">
+						<attribute name="Name" value="RandomScaleMin" />
+						<attribute name="Min Size" value="40 0" />
+						<attribute name="Max Size" value="40 2147483647" />
+						<element type="Text" internal="true" style="none">
+							<attribute name="Top Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Top Right Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Right Color" value="0.9 1 0.9 1" />
+						</element>
+						<element type="BorderImage" internal="true" style="none">
+							<attribute name="Size" value="4 15" />
+						</element>
+					</element>
+					<element type="LineEdit">
+						<attribute name="Name" value="RandomScaleMax" />
+						<attribute name="Min Size" value="40 0" />
+						<attribute name="Max Size" value="40 2147483647" />
+						<element type="Text" internal="true" style="none">
+							<attribute name="Top Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Top Right Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Right Color" value="0.9 1 0.9 1" />
+						</element>
+						<element type="BorderImage" internal="true" style="none">
+							<attribute name="Size" value="4 15" />
+						</element>
+					</element>
+				</element>
+				<element style="ListRow">
+					<attribute name="Min Size" value="200 17" />
+					<attribute name="Layout Spacing" value="8" />
+					<element type="CheckBox">
+						<attribute name="Name" value="UseNormal" />
+					</element>
+					<element type="Text">
+						<attribute name="Top Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Top Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Text" value="Normal vector oriented" />
+					</element>
+				</element>
+				<element style="ListRow">
+					<attribute name="Min Size" value="220 17" />
+					<attribute name="Layout Spacing" value="20" />
+					<element type="Text">
+						<attribute name="Top Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Top Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Text" value="Radius" />
+					</element>
+					<element type="LineEdit">
+						<attribute name="Name" value="SpawnRadius" />
+						<attribute name="Min Size" value="50 0" />
+						<attribute name="Max Size" value="50 2147483647" />
+						<element type="Text" internal="true" style="none">
+							<attribute name="Top Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Top Right Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Right Color" value="0.9 1 0.9 1" />
+						</element>
+						<element type="BorderImage" internal="true" style="none">
+							<attribute name="Size" value="4 15" />
+						</element>
+					</element>
+					<element type="Text">
+						<attribute name="Top Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Top Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Text" value="Count" />
+					</element>
+					<element type="LineEdit">
+						<attribute name="Name" value="SpawnCount" />
+						<attribute name="Min Size" value="50 0" />
+						<attribute name="Max Size" value="50 2147483647" />
+						<element type="Text" internal="true" style="none">
+							<attribute name="Top Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Top Right Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Right Color" value="0.9 1 0.9 1" />
+						</element>
+						<element type="BorderImage" internal="true" style="none">
+							<attribute name="Size" value="4 15" />
+						</element>
+					</element>
+				</element>
+				<element type="Button">
+						<attribute name="Name" value="SetSpawnMode" />
+						<attribute name="Layout Mode" value="Horizontal" />
+						<attribute name="Layout Border" value="1 1 1 1" />
+						<element type="Text">
+							<attribute name="Top Left Color" value="0.85 0.85 0.85 1" />
+							<attribute name="Top Right Color" value="0.85 0.85 0.85 1" />
+							<attribute name="Bottom Left Color" value="0.85 0.85 0.85 1" />
+							<attribute name="Bottom Right Color" value="0.85 0.85 0.85 1" />
+							<attribute name="Text" value="Spawn mode" />
+							<attribute name="Text Alignment" value="Center" />
+						</element>
+				</element>
+				<element type="BorderImage" style="EditorDivider" />
+				<element style="ListRow">
+					<attribute name="Min Size" value="270 17" />
+					<attribute name="Layout Spacing" value="20" />
+					<element type="Text">
+						<attribute name="Top Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Top Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Left Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Bottom Right Color" value="0.85 0.85 0.85 1" />
+						<attribute name="Text" value="Number of spawned objects" />
+					</element>
+					<element type="LineEdit">
+						<attribute name="Name" value="NumberSpawnedObjects" />
+						<attribute name="Min Size" value="50 0" />
+						<attribute name="Max Size" value="50 2147483647" />
+						<element type="Text" internal="true" style="none">
+							<attribute name="Top Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Top Right Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Left Color" value="0.9 1 0.9 1" />
+							<attribute name="Bottom Right Color" value="0.9 1 0.9 1" />
+						</element>
+						<element type="BorderImage" internal="true" style="none">
+							<attribute name="Size" value="4 15" />
+						</element>
+					</element>
+				</element>
+				<element type="ListView">
+					<attribute name="Name" value="SpawnedObjects" />
+					<attribute name="Min Size" value="0 120" />
+					<element type="ScrollBar" internal="true" style="none">
+						<attribute name="Size" value="296 16" />
+						<element type="Button" internal="true" style="none" />
+						<element type="Slider" internal="true" style="none">
+							<attribute name="Position" value="16 0" />
+							<attribute name="Size" value="264 16" />
+							<element type="BorderImage" internal="true" style="none" />
+						</element>
+						<element type="Button" internal="true" style="none">
+							<attribute name="Position" value="280 0" />
+						</element>
+					</element>
+					<element type="ScrollBar" internal="true" style="none">
+						<attribute name="Size" value="16 120" />
+						<element type="Button" internal="true" style="none" />
+						<element type="Slider" internal="true" style="none">
+							<attribute name="Position" value="0 16" />
+							<attribute name="Size" value="16 88" />
+							<element type="BorderImage" internal="true" style="none" />
+						</element>
+						<element type="Button" internal="true" style="none">
+							<attribute name="Position" value="0 104" />
+						</element>
+					</element>
+					<element type="BorderImage" internal="true" style="none">
+						<element internal="true" style="none" />
+					</element>
+				</element>
+			</element>
+		</element>
+	</element>
+</element>