Exemple #1
0
		protected void InterfaceWithBlocks()
		{
			RaycastHit hit;

			var viewPos = VoxManager.ViewPosition;
			var viewForward = VoxManager.ViewForward;

			var ray = VoxManager.ViewRay;

			var blocksModified = false;

			var click = false;
			var clickDown = false;
			var clickUp = false;

			if (Input.GetKeyDown(KeyCode.F2))
			{
//				OVRManager.display.RecenterPose();
                UnityEngine.VR.InputTracking.Recenter();
			}

			if (Input.GetButtonDown(VoxInput.rightShoulder))
			{
				clickDown = true;
				//interactionMode = VoxInteractionMode.AddBlocks;
				AddMode = true;
			}

			if (Input.GetButtonDown(VoxInput.leftShoulder))
			{
				clickDown = true;
                //interactionMode = VoxInteractionMode.SubtractBlocks;

                AddMode = false;
			}
			if (VoxInput.GetSelectDown())
			{
				clickDown = true;
			}

		    if (mouseLeftRightSwitchesAddAndSubtract)
		    {
		        if (Input.GetMouseButtonDown(0))
		        {
		            clickDown = true;
		            //interactionMode = VoxInteractionMode.SubtractBlocks;
		            AddMode = true;
		        }
		        if (Input.GetMouseButtonDown(1))
		        {
		            clickDown = true;
		            //interactionMode = VoxInteractionMode.SubtractBlocks;
		            AddMode = false;
		        }
		    }

		    if (Input.GetMouseButton(1))
			{
				click = true;
			}

			if (Input.GetMouseButtonUp(1))
			{
				clickUp = true;
			}

			if (Input.GetButton(VoxInput.rightShoulder)) click = true;
			if (Input.GetButton(VoxInput.leftShoulder)) click = true;
			if (VoxInput.GetSelect()) click = true;

			if (Input.GetButtonUp(VoxInput.rightShoulder)) clickUp = true;
			if (Input.GetButtonUp(VoxInput.leftShoulder)) clickUp = true;
			if (VoxInput.GetSelectUp()) clickUp = true;

			if (clickUp) click = false;

			var doubleClick = false;

			if (clickDown && doubleClickTimer <= doubleClickDelay)
			{
				doubleClick = true;
			}
			else if (clickDown)
			{
				doubleClickTimer = 0;
			}

			doubleClickTimer += Time.deltaTime;

			//if (Input.GetKeyDown(KeyCode.X))
			//{
			//	interactionMode++;

			//	if ((int) interactionMode >= Enum.GetValues(typeof (VoxInteractionMode)).Length)
			//	{
			//		interactionMode = 0;
			//	}
			//	//AddMode = !AddMode;
			//}

			var sampleColor = Input.GetButtonDown(VoxInput.ButtonB) || Input.GetKeyDown(KeyCode.C);

			if (Input.GetButtonDown(VoxInput.Select) || Input.GetKeyDown(KeyCode.P))
			{
				PaintButton.isSelected = !PaintButton.isSelected;

				if (PaintButton.isSelected)
				{
					interactionMode = VoxInteractionMode.Paint;

					PaintButton.isSelected = true;
					AddButton.isSelected = false;
					SubtractButton.isSelected = false;

					VoxManager.ShowMessage("Paint Mode Enabled");
				}
				else
				{
					interactionMode = VoxInteractionMode.Create;

					if (AddMode)
					{
						AddButton.isSelected = true;
						SubtractButton.isSelected = false;
					}
					else
					{
						AddButton.isSelected = false;
						SubtractButton.isSelected = true;
					}

					VoxManager.ShowMessage("Create Mode Enabled");
				}
			}

			if (Input.GetButtonDown(VoxInput.ButtonX) || Input.GetKeyDown(KeyCode.T))
			{
				DrawStraightButton.isSelected = !DrawStraightButton.isSelected;

				drawStraight = DrawStraightButton.isSelected;

				if (drawStraight)
				{
					secondBlockDrawn = false;
					startBlockPos = lastBlockPos;
				}

				VoxManager.ShowMessage(drawStraight ? "Draw Straight Mode Enabled" : "Draw Straight Mode Disabled");
			}


			if (Input.GetButtonDown(VoxInput.Start) || Input.GetKeyDown(KeyCode.U))
			{
				CreateAtFixedDistanceButton.isSelected = !CreateAtFixedDistanceButton.isSelected;

				createAtFixedDistance = CreateAtFixedDistanceButton.isSelected;

				if (createAtFixedDistance)
				{
					fixedDistance = Vector3.Distance(VoxManager.ViewPosition, VoxTerrain.GetUnityPosition(lastBlockPos));
				}
				else
				{
					//var bpu = VoxTerrain.GetUnityPosition(lastBlockPos);
					//var tobpu = viewPos - bpu;

					//constructionPlane = new Plane(viewForward, bpu);
					drawStarted = false;

					if(interactionMode == VoxInteractionMode.Create) clickDown = true;
				}

				VoxManager.ShowMessage(createAtFixedDistance ? "Draw At Fixed Distance Mode Enabled" : "Draw At Fixed Distance Mode Disabled");
			}

			if (Input.GetButtonDown(VoxInput.ButtonY) || Input.GetKeyDown(KeyCode.Y))
			{
				switch (interactionMode)
				{
					case VoxInteractionMode.Create:
						DoubleClickLayerButton.isSelected = !DoubleClickLayerButton.isSelected;

						doubleClickToIncreaseHeight = DoubleClickLayerButton.isSelected;

						VoxManager.ShowMessage(doubleClickToIncreaseHeight ? "Match Height Mode Enabled" : "Match Height Mode Disabled");
						break;
					case VoxInteractionMode.Paint:

						PaintUsingPlanesButton.isSelected = !PaintUsingPlanesButton.isSelected;

						paintUsingConstructionPlanes = PaintUsingPlanesButton.isSelected;

						VoxManager.ShowMessage(paintUsingConstructionPlanes ? "Paint Using Construction Planes Enabled" : "Paint Using Construction Planes  Disabled");
						break;
				}
			}

			var dpadX = Input.GetAxis(VoxInput.DPadX);

			if (Input.GetKeyDown(KeyCode.X)) dpadX = 1;
			if (Input.GetKeyDown(KeyCode.Z)) dpadX = -1;


			if (dpadX <= -0.95f && lastDPadX > -0.95f)
			{
				PrefabIndex--;
				if (PrefabIndex < 0) PrefabIndex = Prefabs.Length - 1;

				VoxManager.ShowMessage("Brush " + (PrefabIndex + 1).ToString("D"));
			}
			else if (dpadX >= 0.95f && lastDPadX < 0.95f)
			{
				PrefabIndex++;
				if (PrefabIndex >= Prefabs.Length) PrefabIndex = 0;
				VoxManager.ShowMessage("Brush " + (PrefabIndex + 1).ToString("D"));
			}

			lastDPadX = dpadX;

			Crosshair.SetCrosshairMode(AddMode);

			//Crosshair.mode = AddMode ? VoxCrosshair.CrosshairMode.Add : VoxCrosshair.CrosshairMode.Subtract;

			if (!drawStarted) // No drawing is happening, we need to create a cube by first clicking, then the draw starts until we release button
			{
				drawSecondLayer = false;
				inverseAdd = false;
				secondBlockDrawn = false;

				if (Physics.Raycast(ray, out hit, RayCastDistance, Layers.value)) // Looking at a block
				{
					//Debug.Log("Raycasting");
					var chunk = hit.collider.GetComponent<Chunk>();
					if (chunk != null)
					{
						var distance = hit.distance;
						//Debug.Log("Block hit");

						var blockPos = VoxTerrain.GetBlockPos(hit);
						var adjacentPos = VoxTerrain.GetBlockPos(hit, true);

						var blockPosUnity = VoxTerrain.GetUnityPosition(blockPos);
						var adjacentPosUnity = VoxTerrain.GetUnityPosition(adjacentPos);

						var facePosUnity = blockPosUnity + hit.normal*World.HalfUnitScale;

						if (sampleColor)
						{
							var block = chunk.World.GetBlock(VoxTerrain.GetBlockPos(hit));
							NewBlockColor = block.BlockColor;
							//VoxManager.ShowMessage("Color sampled");
						}

						// Place the crosshair on the face
						Crosshair.newPosition = facePosUnity;
						Crosshair.transform.forward = hit.normal;

						if (distance >= minBuildDistance)
						{

							switch (interactionMode)
							{
								case VoxInteractionMode.Create:
									if (clickDown) // Just pressed
									{
										if (PrefabIndex >= Prefabs.Length || PrefabIndex < 0) break;
										var prefab = Prefabs[PrefabIndex];
										var positions = prefab.GetWorldPositions();

										if (AddMode) // Add
										{
											PlayClip(sndCreate, true);
											if (doubleClickToIncreaseHeight)
											{
												var buildPos = doubleClick ? blockPos + hit.normal : blockPos;

												//lastBlockPos = buildPos;

												startBlockPos = buildPos;

												foreach (var pos in positions)
												{
													var newPos = buildPos + pos;
													//VoxWorld.SetBlock(newPos, new Block(NewBlockColor), true);

													VoxWorld.SetBlock(newPos, VoxBlockType.Default, NewBlockColor, true);
												}

												constructionBlockPos = blockPosUnity + hit.normal*World.UnitScale - hit.normal*World.HalfUnitScale;

												if (doubleClick)
												{
													drawSecondLayer = true;

													//constructionBlockPos = constructionBlockPos + constructionPlane.normal * World.UnitScale;
													//constructionPlane = new Plane(constructionPlane.normal, constructionBlockPos);
												}
												else
												{
													//constructionPlane = new Plane(hit.normal, constructionBlockPos);
												}

												constructionPlane = new Plane(hit.normal, constructionBlockPos);

												startBlockPos = buildPos;

												
											}
											else
											{
												var buildPos = adjacentPos;
												startBlockPos = buildPos;

												if (doubleClick)
												{
												}
												else
												{
													//lastBlockPos = buildPos;

													foreach (var pos in positions)
													{
														var newPos = buildPos + pos;
														VoxWorld.SetBlock(newPos, VoxBlockType.Default, NewBlockColor, true);
													}

													constructionBlockPos = adjacentPosUnity - hit.normal*World.HalfUnitScale;
													constructionPlane = new Plane(hit.normal, constructionBlockPos);
												}
											}
										}
										else // Subtract
										{
											PlayClip(sndDelete, true);

											var buildPos = blockPos;

											startBlockPos = buildPos;

											foreach (var pos in positions)
											{
												var newPos = buildPos + pos;
												VoxWorld.SetBlock(newPos, VoxBlockType.Empty, NewBlockColor, true);
											}

											constructionBlockPos = adjacentPosUnity - hit.normal*World.HalfUnitScale;
											constructionPlane = new Plane(hit.normal, constructionBlockPos);
										}
										adjacentPlane = new Plane(hit.normal, hit.point);
										drawStarted = true;
										blocksModified = true;

										
									}
									break;
								case VoxInteractionMode.Paint:
									if (clickDown)
									{
										PlayClip(sndPaint, true);

										if (PrefabIndex >= Prefabs.Length || PrefabIndex < 0) break;
										var prefab = Prefabs[PrefabIndex];
										var buildPos = blockPos;

										var positions = prefab.GetWorldPositions();

										startBlockPos = buildPos;

										foreach (var pos in positions)
										{
											var newPos = buildPos + pos;

											var block = VoxWorld.GetBlock(newPos);

											if (!block.IsEmpty())
											{
												VoxWorld.SetBlock(newPos, VoxBlockType.Default, NewBlockColor, false);

												//block.BlockColor = NewBlockColor;
												//block.Modified = true;
												//VoxWorld.GetChunk(newPos.x, newPos.y, newPos.z, false).RebuildNeeded = true;
											}
										}

										constructionPlane = new Plane(hit.normal, blockPosUnity + hit.normal*World.HalfUnitScale);
										adjacentPlane = new Plane(hit.normal, hit.point);
										drawStarted = true;
									}
									break;
								case VoxInteractionMode.Teleport:
									if (clickDown)
									{
										PlayClip(sndTeleport, true);

										VoxManager.TeleportPlayer(blockPosUnity);
										constructionPlane = new Plane(hit.normal, adjacentPosUnity - hit.normal*World.HalfUnitScale);
										adjacentPlane = new Plane(hit.normal, hit.point);
									}

									break;
							}
						}

						
					}
				}
				else // Not looking at anything
				{
					//Debug.Log("Not Raycasting");
					// Raycast against the construction plane
					float enter = 0f;
					var posOnPlaneUnity = Vector3.zero;
					if (constructionPlane.Raycast(ray, out enter))
					{
						posOnPlaneUnity = viewPos + viewForward*enter;
					}

					//if (adjacentPlane.Raycast(ray, out enter))
					//{
					//	posOnPlaneUnity = viewPos + viewForward * enter;

					//	var sign = constructionPlane.GetSide(posOnPlaneUnity) ? 1 : -1;

					//	posOnPlaneUnity += constructionPlane.normal * constructionPlane.GetDistanceToPoint(posOnPlaneUnity) * sign;
					//}

					var blockPos = VoxTerrain.GetBlockPos(posOnPlaneUnity + constructionPlane.normal * World.HalfUnitScale);

					var blockPosUnity = VoxTerrain.GetUnityPosition(blockPos);

					var facePosUnity = blockPosUnity - constructionPlane.normal*World.HalfUnitScale;

					Crosshair.newPosition = facePosUnity;
					Crosshair.transform.forward = constructionPlane.normal;

					if (enter >= minBuildDistance)
					{

						switch (interactionMode)
						{
							case VoxInteractionMode.Create:
								if (clickDown) // Create a block in air that is built on the construction plane
								{
									if (AddMode) // Add 
									{
										if (PrefabIndex >= Prefabs.Length || PrefabIndex < 0) break;
										var prefab = Prefabs[PrefabIndex];

										PlayClip(sndCreate, true);

										var positions = prefab.GetWorldPositions();


										blockPos = doubleClickToIncreaseHeight ? VoxTerrain.GetBlockPos(posOnPlaneUnity - constructionPlane.normal*World.HalfUnitScale) : VoxTerrain.GetBlockPos(posOnPlaneUnity + constructionPlane.normal*World.HalfUnitScale);

										var buildPos = blockPos;

										startBlockPos = buildPos;

										//if (doubleClickToIncreaseHeight) buildPos = buildPos - hit.normal * 2;

										//lastBlockPos = buildPos;

										foreach (var pos in positions)
										{
											var newPos = buildPos + pos;
											VoxWorld.SetBlock(newPos, VoxBlockType.Default, NewBlockColor, true);
										}

										adjacentPlane = constructionPlane;
									}
									else // Subtract
									{
										if (PrefabIndex >= Prefabs.Length || PrefabIndex < 0) break;
										var prefab = Prefabs[PrefabIndex];

										PlayClip(sndDelete, true);

										inverseAdd = true; // Draw opposite of construction plane

										var positions = prefab.GetWorldPositions();

										//var buildPos = doubleClick ? blockPos + hit.normal : blockPos;

										var buildPos = VoxTerrain.GetBlockPos(posOnPlaneUnity - constructionPlane.normal*World.HalfUnitScale);
										//VoxWorld.SetBlock(oppositeBlockPos, new Block(NewBlockColor), true);
										startBlockPos = buildPos;

										//lastBlockPos = buildPos;

										foreach (var pos in positions)
										{
											var newPos = buildPos + pos;
											VoxWorld.SetBlock(newPos, VoxBlockType.Default, NewBlockColor, true);
										}

										//constructionPlane = new Plane(constructionPlane.normal, VoxTerrain.GetUnityPosition(buildPos));
										adjacentPlane = constructionPlane;



										//if (UsePrefab)
										//{

										//}
										//else
										//{


										//}
									}
									drawStarted = true;
									blocksModified = true;

								}
								break;
							case VoxInteractionMode.Paint:
								break;
						}
					}
				}


				if (createAtFixedDistance)
				{
					fixedDistance = Vector3.Distance(VoxManager.ViewPosition, VoxTerrain.GetUnityPosition(startBlockPos));
				}

				if (drawStarted)
				{
					lastBlockPos = startBlockPos;

					DrawTimer = ActivateDrawTime;
				}
				//drawStarted = false; // stop draw when the click is released

			}
			else // Now we're drawing, new cubes are always added on construction plane, so we'll only raycast the construction plane
			{
				if (!click) drawStarted = false; // stop draw when the click is released

				if (DrawTimer < 0)
				{

					float enter = 0f;
					var posOnPlaneUnity = Vector3.zero;

					WorldPos blockPos;
					Vector3 blockPosUnity;
					Vector3 facePosUnity;

					switch (interactionMode)
					{
						case VoxInteractionMode.Create:
							if (createAtFixedDistance)
							{
								if (PrefabIndex >= Prefabs.Length || PrefabIndex < 0) break;

								var prefab = Prefabs[PrefabIndex];

								blockPosUnity = viewPos + viewForward * fixedDistance;

								blockPos = VoxTerrain.GetBlockPos(blockPosUnity);

								var positions = prefab.GetWorldPositions();

								if (!blockPos.Equals(lastBlockPos))
								{
									foreach (var pos in positions)
									{
										var newPos = blockPos + pos;
										if (AddMode)
										{
											VoxWorld.SetBlock(newPos, VoxBlockType.Default, NewBlockColor, true);
										}
										else
										{
											VoxWorld.SetBlock(newPos, VoxBlockType.Empty, NewBlockColor, true);
										}
									}
									PlayClip(sndCreateDrag);
								}

								lastBlockPos = blockPos;
							}
							else
							{
								if (AddMode)
								{
									if (PrefabIndex >= Prefabs.Length || PrefabIndex < 0) break;

									var prefab = Prefabs[PrefabIndex];

									if (doubleClickToIncreaseHeight)
									{
										if (constructionPlane.Raycast(ray, out enter))
										{
											posOnPlaneUnity = viewPos + viewForward*enter;

											if (!drawSecondLayer) posOnPlaneUnity -= constructionPlane.normal*World.UnitScale;
										}
									}
									else
									{
										if (adjacentPlane.Raycast(ray, out enter))
										{
											posOnPlaneUnity = viewPos + viewForward*enter;

											var sign = constructionPlane.GetSide(posOnPlaneUnity) ? 1 : -1;

											posOnPlaneUnity += constructionPlane.normal*constructionPlane.GetDistanceToPoint(posOnPlaneUnity)*sign;
										}
									}

									//if (adjacentPlane.Raycast(ray, out enter))
									//{
									//	posOnPlaneUnity = viewPos + viewForward * enter;

									//	var sign = constructionPlane.GetSide(posOnPlaneUnity) ? 1 : -1;

									//	posOnPlaneUnity += constructionPlane.normal * constructionPlane.GetDistanceToPoint(posOnPlaneUnity) * sign;
									//}




									//if (constructionPlane.Raycast(ray, out enter))
									//{
									//	posOnPlaneUnity = viewPos + viewForward * enter;

									//	//var sign = constructionPlane.GetSide(posOnPlaneUnity) ? 1 : -1;

									//	//posOnPlaneUnity += constructionPlane.normal * constructionPlane.GetDistanceToPoint(posOnPlaneUnity) * sign;

									//	//if (constructionPlane.Raycast(new Ray(posOnPlaneUnity, adjacentPlane.normal), out enter))
									//	//{
									//	//	posOnPlaneUnity = viewPos + viewForward * enter;
									//	//}
									//}

									//if (doubleClickToIncreaseHeight)
									//{
									//	blockPos = VoxTerrain.GetBlockPos(posOnPlaneUnity - constructionPlane.normal * World.HalfUnitScale - constructionPlane.normal * World.UnitScale);
									//}
									//else
									//{
									//	blockPos = VoxTerrain.GetBlockPos(posOnPlaneUnity + constructionPlane.normal * World.HalfUnitScale);
									//}

									blockPos = VoxTerrain.GetBlockPos(posOnPlaneUnity + constructionPlane.normal*World.HalfUnitScale);

									blockPosUnity = VoxTerrain.GetUnityPosition(blockPos);

									if (drawStraight)
									{
										if (!secondBlockDrawn)
										{
											if (!blockPos.Equals(startBlockPos))
											{
												secondBlockPos = blockPos;
												secondBlockDrawn = true;

												var drawNormal = secondBlockPos.vector - startBlockPos.vector;

												if (Mathf.Abs(Vector3.Dot(drawNormal, Vector3.up)) > 0.7f)
												{
													secondBlockPos.x = startBlockPos.x;
													secondBlockPos.z = startBlockPos.z;
												}
												else if (Mathf.Abs(Vector3.Dot(drawNormal, Vector3.forward)) > 0.7f)
												{
													secondBlockPos.x = startBlockPos.x;
													secondBlockPos.y = startBlockPos.y;
												}
												else if (Mathf.Abs(Vector3.Dot(drawNormal, Vector3.right)) > 0.7f)
												{
													secondBlockPos.y = startBlockPos.y;
													secondBlockPos.z = startBlockPos.z;
												}
											}
										}

										if (secondBlockDrawn)
										{
											var toNewBlock = blockPos.vector - startBlockPos.vector;
											var drawNormal = secondBlockPos.vector - startBlockPos.vector;

											var p = Vector3.Project(toNewBlock, drawNormal);

											blockPos = startBlockPos + p;
										}
									}

									facePosUnity = blockPosUnity - constructionPlane.normal*World.HalfUnitScale;

									Crosshair.newPosition = facePosUnity;

									var positions = prefab.GetWorldPositions();

									if (!blockPos.Equals(lastBlockPos))
									{
										foreach (var pos in positions)
										{
											var newPos = blockPos + pos;
											VoxWorld.SetBlock(newPos, VoxBlockType.Default, NewBlockColor, true);
										}
										PlayClip(sndCreateDrag);
									}

									lastBlockPos = blockPos;
								}
								else // Subtract mode
								{
									if (constructionPlane.Raycast(ray, out enter))
									{
										posOnPlaneUnity = viewPos + viewForward*enter - constructionPlane.normal*World.UnitScale;
									}

									//if (inverseAdd) blockPos = VoxTerrain.GetBlockPos(posOnPlaneUnity - constructionPlane.normal * World.HalfUnitScale);
									//else 

									blockPos = VoxTerrain.GetBlockPos(posOnPlaneUnity + constructionPlane.normal*World.HalfUnitScale);

									blockPosUnity = VoxTerrain.GetUnityPosition(blockPos);

									if (drawStraight)
									{
										if (!secondBlockDrawn)
										{
											if (!blockPos.Equals(startBlockPos))
											{
												secondBlockPos = blockPos;
												secondBlockDrawn = true;

												var drawNormal = secondBlockPos.vector - startBlockPos.vector;

												if (Mathf.Abs(Vector3.Dot(drawNormal, Vector3.up)) > 0.7f)
												{
													secondBlockPos.x = startBlockPos.x;
													secondBlockPos.z = startBlockPos.z;
												}
												else if (Mathf.Abs(Vector3.Dot(drawNormal, Vector3.forward)) > 0.7f)
												{
													secondBlockPos.x = startBlockPos.x;
													secondBlockPos.y = startBlockPos.y;
												}
												else if (Mathf.Abs(Vector3.Dot(drawNormal, Vector3.right)) > 0.7f)
												{
													secondBlockPos.y = startBlockPos.y;
													secondBlockPos.z = startBlockPos.z;
												}
											}
										}

										if (secondBlockDrawn)
										{
											var toNewBlock = blockPos.vector - startBlockPos.vector;
											var drawNormal = secondBlockPos.vector - startBlockPos.vector;

											var p = Vector3.Project(toNewBlock, drawNormal);

											blockPos = startBlockPos + p;
										}
									}


									facePosUnity = blockPosUnity - constructionPlane.normal*World.HalfUnitScale;

									Crosshair.newPosition = facePosUnity;

									if (PrefabIndex >= Prefabs.Length || PrefabIndex < 0) break;

									var prefab = Prefabs[PrefabIndex];

									var positions = prefab.GetWorldPositions();

									if (!lastBlockPos.Equals(blockPos))
									{
										foreach (var pos in positions)
										{
											var newPos = blockPos + pos;

											if (inverseAdd) VoxWorld.SetBlock(newPos, VoxBlockType.Default, NewBlockColor, true);
											else VoxWorld.SetBlock(newPos, VoxBlockType.Empty, NewBlockColor, true);
										}
										PlayClip(sndDeleteDrag);

									}
									lastBlockPos = blockPos;
								}
							}
							blocksModified = true;
							break;
						case VoxInteractionMode.Paint:

							if (paintUsingConstructionPlanes)
							{
								if (constructionPlane.Raycast(ray, out enter))
								{
									posOnPlaneUnity = viewPos + viewForward*enter;
								}

								blockPos = VoxTerrain.GetBlockPos(posOnPlaneUnity - constructionPlane.normal*World.HalfUnitScale);

								//blockPosUnity = VoxTerrain.GetUnityPosition(blockPos);

								//facePosUnity = blockPosUnity + constructionPlane.normal*World.HalfUnitScale;

								Crosshair.newPosition = posOnPlaneUnity;

								if (PrefabIndex >= Prefabs.Length || PrefabIndex < 0) break;

								var prefab = Prefabs[PrefabIndex];

								var positions = prefab.GetWorldPositions();

								if (!lastBlockPos.Equals(blockPos))
								{
									foreach (var pos in positions)
									{
										var newPos = blockPos + pos;
										var block = VoxWorld.GetBlock(newPos);
										if (!block.IsEmpty())
										{
											//block.BlockColor = NewBlockColor;
											//block.Modified = true;
											//VoxWorld.GetChunk(newPos.x, newPos.y, newPos.z, false).RebuildNeeded = true;

											VoxWorld.SetBlock(newPos, VoxBlockType.Default, NewBlockColor, false);

										}
									}
									PlayClip(sndPaintDrag);
								}
								lastBlockPos = blockPos;
							}
							else
							{
								if (Physics.Raycast(ray, out hit, RayCastDistance, Layers.value)) // Looking at a block
								{
									var chunk = hit.collider.GetComponent<Chunk>();
									if (chunk != null)
									{
										blockPos = VoxTerrain.GetBlockPos(hit);

										if (PrefabIndex >= Prefabs.Length || PrefabIndex < 0) break;

										var prefab = Prefabs[PrefabIndex];

										var positions = prefab.GetWorldPositions();

										if (!lastBlockPos.Equals(blockPos))
										{
											foreach (var pos in positions)
											{
												var newPos = blockPos + pos;
												var block = VoxWorld.GetBlock(newPos);
												if (!block.IsEmpty())
												{
													//block.BlockColor = NewBlockColor;
													//block.Modified = true;
													//VoxWorld.GetChunk(newPos.x, newPos.y, newPos.z, false).RebuildNeeded = true;

													VoxWorld.SetBlock(newPos, VoxBlockType.Default, NewBlockColor, false);

												}
											}
											PlayClip(sndPaintDrag);
										}
										lastBlockPos = blockPos;
									}
								}
							}
							break;
					}
				}
			}

			DrawTimer -= Time.deltaTime;


			if (blocksModified)
			{

				//var playerPos = VoxTerrain.GetBlockPos(VoxManager.Player.position);

				//for (var px = -3; px < 3; px++)
				//{
				//	for (var py = -3; py < 5; py++)
				//	{
				//		for (var pz = -3; pz < 3; pz++)
				//		{
				//			var p = playerPos + new WorldPos(px, py, pz);

				//			var b = VoxWorld.GetBlock(p);

				//			if (b.JustCreated && !b.IsEmpty()) VoxWorld.SetBlock(p, VoxBlockType.Empty, Color.white);
				//		}
				//	}
				//}
			}
		}
Exemple #2
0
		protected void OnPaintButton(VoxMenuButton button, bool state)
		{
			if (state == false) return;

			//Debug.Log("Painting");
			//interactionMode = VoxInteractionMode.PaintBlocks;
			//AddMode = false;

			if (button.isSelected)
			{
				interactionMode = VoxInteractionMode.Paint;

				PaintButton.isSelected = true;
				AddButton.isSelected = false;
				SubtractButton.isSelected = false;
			}
			else
			{
				interactionMode = VoxInteractionMode.Create;

				if (AddMode)
				{
					AddButton.isSelected = true;
					SubtractButton.isSelected = false;
				}
				else
				{
					AddButton.isSelected = false;
					SubtractButton.isSelected = true;
				}
			}
		}
Exemple #3
0
		protected void OnTeleportButton(VoxMenuButton button, bool state)
		{
			if (state == false) return;

			//Debug.Log("Adding");

			//interactionMode = VoxInteractionMode.AddBlocks;

			interactionMode = VoxInteractionMode.Teleport;

			AddButton.isSelected = false;
			SubtractButton.isSelected = false;
			PaintButton.isSelected = false;
			//PrefabButton.isSelected = false;
		}
Exemple #4
0
		protected void OnSubtractButton(VoxMenuButton button, bool state)
		{
			if (state == false) return;

			//Debug.Log("Subtracting");
			//interactionMode = VoxInteractionMode.SubtractBlocks;

			interactionMode = VoxInteractionMode.Create;

			AddMode = false;

			SubtractButton.isSelected = true;
			AddButton.isSelected = false;
			PaintButton.isSelected = false;
		}