private void DrawLights(DrawStep drawStep) { drawStep.Effect.SetTextures(white); drawStep.Effect.Instancing = false; drawStep.Effect.PrepModel(sphere); for (int i = 0; i < lights.Count; i++) { PointLight light = lights[i]; drawStep.Effect.Color = light.Color.ToVector3() * 2f; drawStep.Effect.World = Matrix.CreateScale(0.1f) * Matrix.CreateTranslation(light.Position); drawStep.Effect.Emissive = 1f; if (i == 0) { drawStep.Effect.World = Matrix.CreateTranslation(light.Position); } foreach (var mesh in sphere.Meshes) { mesh.Draw(); } } }
public void Draw(DrawStep drawStep) { Matrix worldMatrix = Matrix.CreateRotationX(MathHelper.PiOver2); // Draw all meshes. foreach (var mesh in _model.Meshes) { foreach (var meshPart in mesh.MeshParts.Where(mp => mp.PrimitiveCount > 0)) { var basicEffect = (BasicEffect)meshPart.Effect; drawStep.Effect.Color = basicEffect.DiffuseColor; drawStep.Effect.World = _modelTransforms[mesh.ParentBone.Index] * worldMatrix; drawStep.Effect.SetTextures(white); foreach (var pass in drawStep.Effect.CurrentTechnique.Passes) { pass.Apply(); graphics.SetVertexBuffer(meshPart.VertexBuffer); graphics.Indices = meshPart.IndexBuffer; graphics.DrawIndexedPrimitives(PrimitiveType.TriangleList, meshPart.VertexOffset, 0, meshPart.PrimitiveCount); } } } }
public void Start(Point pos) { _startPos = pos; switch (DrawStepType) { case DrawStep.DrawStepType.DrawRect: _nowDrawing = StartDrawRect(); break; case DrawStep.DrawStepType.DrawEllipse: _nowDrawing = StartDrawEllipse(); break; case DrawStep.DrawStepType.DrawLine: _nowDrawing = StartDrawLine(); break; case DrawStep.DrawStepType.DrawText: _nowDrawing = StartDrawText(); break; } StepManager.InsertNext(_nowDrawing); if (_nowDrawing.Iterations != -1) { StepManager.RefreshToCurrentStep(); } }
private void ClearSelection() { horizontalCircleImage.gameObject.SetActive(false); verticalDistanceImage.gameObject.SetActive(false); pathLine.gameObject.SetActive(false); pathLine.positionCount = 0; pathList.Clear(); drawStep = DrawStep.Idle; }
private bool FindTargetPoint(out Vector3 targetPoint) { Vector3 mousePosition = Input.mousePosition; //mousePosition.z = circleCenter.z; Ray ray = Camera.main.ScreenPointToRay(mousePosition); RaycastHit[] hitInfos = Physics.RaycastAll(ray, Mathf.Infinity, layerMask); if (hitInfos.Length == 0) { targetPoint = Vector3.zero; return(false); } //Debug.Log($"Hit count: { hitInfos.Length } "); //Debug.Log($"circleCenter: { circleCenter }"); bool chooseInteractable = false; if (drawStep != DrawStep.DrawingVerticalDistance) { chooseInteractable = true; drawStep = DrawStep.DrawingHorizontalCircle; } targetPoint = hitInfos[0].point; foreach (RaycastHit hitInfo in hitInfos) { //Debug.Log($"collide: { hitInfo.collider.name } point: { hitInfo.point }"); if (chooseInteractable && hitInfo.collider.tag == Tags.Interactable) { IPointInteractable pointInteractable = hitInfo.collider.GetComponentInParent <IPointInteractable>(); if (pointInteractable != null) { targetPoint = pointInteractable.GetPoint(); drawStep = DrawStep.DrawToHotspot; break; } } else { if (hitInfo.collider.tag != Tags.Interactable) { targetPoint = hitInfo.point; } } } return(true); }
public void Draw(DrawStep drawStep) { drawStep.Effect.SpecularIntensity = 0; drawStep.Effect.SpecularExponent = 0; DrawLattice(drawStep); if (!drawStep.ShadowCastersOnly) { DrawLights(drawStep); } DrawShip(drawStep); }
private void StartDrawingVerticalDistance() { drawStep = DrawStep.DrawingVerticalDistance; lastHorizontalPosition = lastPosition; horizontalCircleCollider.enabled = false; verticalDistanceImage.transform.position = circleCenter; verticalDistanceImage.transform.localScale = new Vector3(moveDistance, moveDistance, 1); verticalDistanceImage.gameObject.SetActive(true); Vector3 circleVector = lastHorizontalPosition - circleCenter; float angle = Vector3.Angle(circleVector, Vector3.right) * Mathf.Sign(-circleVector.z); verticalDistanceImage.transform.rotation = Quaternion.AngleAxis(angle, Vector3.up); }
private void DrawShip(DrawStep drawStep) { drawStep.Effect.SetTextures(surface); drawStep.Effect.Emissive = 0; drawStep.Effect.Color = Color.White.ToVector3(); drawStep.Effect.Instancing = false; float phi = (1 + -0.1f * rot.X) % MathHelper.TwoPi; float heading = phi + MathHelper.Pi; Vector3 position = 100 * new Vector3((float)Math.Cos(phi), (float)Math.Sin(phi), 0) + 10 * Vector3.UnitZ; drawStep.Effect.PrepModel(ship); Matrix world = Matrix.CreateRotationX(MathHelper.PiOver2) * Matrix.CreateRotationZ(heading) * Matrix.CreateTranslation(position); ship.Draw(world, drawStep.Camera.View, drawStep.Camera.Projection); }
private void StartDrawingCircle() { if (pathLine.positionCount == 0) { Utils.AddPosition(pathLine, startPosition); circleCenter = startPosition; } lastPosition = circleCenter; horizontalCircleImage.transform.position = circleCenter; horizontalCircleImage.transform.localScale = new Vector3(minCircleSize, minCircleSize, 1); horizontalCircleCollider.enabled = true; horizontalCircleImage.gameObject.SetActive(true); verticalDistanceImage.gameObject.SetActive(false); drawStep = DrawStep.DrawingHorizontalCircle; Utils.AddPosition(pathLine, lastPosition); }
private void DrawLines(float[] currentCoordinates, MotionEventActions action, DrawView drawView) { int[] draw; try { draw = drawView.GetCoordinates(currentCoordinates); } catch (InvalidCoordinatesException) { try { LastDrawStep = DrawStep.StartProgram; int[] drawOld = drawView.GetCoordinates(lastDrawnCoordinates); SendToArduino("{p;" + drawOld[0] + "," + drawOld[1] + "}"); drawView.DrawLine(firstPointOfLineCoordinates, lastDrawnCoordinates); return; } catch (InvalidCoordinatesException) { LastDrawStep = DrawStep.StartProgram; return; } } if (!equalsNumbers(lastDraw, draw)) { drawningStep++; double lastDistancea = Math.Sqrt(Math.Pow((lastDrawnCoordinates[0] - currentCoordinates[0]), 2) + Math.Pow((lastDrawnCoordinates[1] - currentCoordinates[1]), 2)); int stepLimit = 2; if (lastDistancea < 8) { stepLimit = 3; } if (lastDistancea < 6) { stepLimit = 4; } if (lastDistancea < 3) { stepLimit = 5; } if (lastDistancea <= 1) { stepLimit = 7; } if (lastDistancea > 30) { stepLimit = 1; } if (lastDistancea > 40) { stepLimit = 0; } if ((LastDrawStep == DrawStep.GetAngle && drawningStep > stepLimit) || action == MotionEventActions.Up) { float x2x1 = 0 - firstPointOfLineCoordinates[0] - lastDrawnCoordinates[0]; float x3x1 = 0 - firstPointOfLineCoordinates[0] - currentCoordinates[0]; float point21 = (0 - firstPointOfLineCoordinates[1] - lastDrawnCoordinates[1]) / x2x1; float point31 = (0 - firstPointOfLineCoordinates[1] - currentCoordinates[1]) / x3x1; double distance = Math.Sqrt(Math.Pow((firstPointOfLineCoordinates[0] - currentCoordinates[0]), 2) + Math.Pow((firstPointOfLineCoordinates[1] - currentCoordinates[1]), 2)); double varDecided = 0.002; // DO DDEBUGOWANIA // Console.WriteLine("{0:F5} ; {1:F5} ; {2:F8} ; {3:F8} ; {10:F8} ; X - {4:F2} ; Y - {5:F2} ; x - {6:F2} ; y - {7:F2} ; x - {8:F2} ; y - {9:F2}", point21, point31, Math.Abs(point21 - point31), lastDistancea, firstPointOfLineCoordinates[0], firstPointOfLineCoordinates[1], lastDrawnCoordinatesOnCanva[0] , lastDrawnCoordinatesOnCanva[1] ,currentCoordinates[0], currentCoordinates[1], varDecided); // ----------------- if (x2x1 != 0 && x3x1 != 0) { if (Math.Abs(point21 - point31) > (float)varDecided || action == MotionEventActions.Up || lastDistance > distance) { lastDraw = drawView.GetCoordinates(lastDrawnCoordinates); SendToArduino("{p;" + lastDraw[0] + "," + lastDraw[1] + "}"); drawView.DrawLine(firstPointOfLineCoordinates, lastDrawnCoordinates); firstPointOfLineCoordinates = lastDrawnCoordinates; LastDrawStep = DrawStep.CreatePoint; } } if (action == MotionEventActions.Up) { LastDrawStep = DrawStep.CheckedAndDraw; } lastDistance = distance; drawningStep = 0; } if (LastDrawStep == DrawStep.CreatePoint) { lastDistance = Math.Sqrt((draw[0] * draw[0]) + (draw[1] * draw[1])); LastDrawStep = DrawStep.GetAngle; lastDrawnCoordinates = currentCoordinates; } } if (action == MotionEventActions.Down && (LastDrawStep == DrawStep.CheckedAndDraw || LastDrawStep == DrawStep.StartProgram)) { firstPointOfLineCoordinates = currentCoordinates; SendToArduino("{d;" + draw[0] + "," + draw[1] + "}"); LastDrawStep = DrawStep.CreatePoint; lastDrawnCoordinates = currentCoordinates; lastDistance = 0; drawView.DrawPoint(currentCoordinates); return; } lastDrawnCoordinates = currentCoordinates; }
private void DrawLattice(DrawStep drawStep) { var graphics = drawStep.GraphicsDevice; drawStep.Effect.Color = Color.White.ToVector3(); drawStep.Effect.SpecularExponent = 100; drawStep.Effect.SpecularIntensity = 0.9f; switch (technique) { case 2: drawStep.Effect.SetTextures(surface, surfaceNormalMap, surfaceSpecularMap); break; case 1: drawStep.Effect.SetTextures(surface, surfaceNormalMap); break; case 0: default: drawStep.Effect.SetTextures(surface); break; } graphics.SamplerStates[0] = SamplerState.AnisotropicClamp; graphics.SamplerStates[1] = SamplerState.AnisotropicClamp; graphics.SamplerStates[2] = SamplerState.AnisotropicClamp; icosahedronInstances.Instances.Clear(); foreach (Vector3 pt in LatticePoints(latticeSize)) { Vector3 rotation = new Vector3( (float)Math.Cos(this.rot.X * pt.X + pt.X), (float)Math.Cos(this.rot.Y * pt.Y + pt.Y), (float)Math.Cos(this.rot.Z * pt.Z + pt.Z)); var world = Matrix.CreateRotationX(rotation.X) * Matrix.CreateRotationY(rotation.Y) * Matrix.CreateRotationZ(rotation.Z) * Matrix.CreateTranslation(pt); if (pt == Vector3.Zero) { Vector3 disp = new Vector3(0, 0, -3); float scale = 400; float dispScale = 0.515f; Vector3 axis = new Vector3(-1, 1, 0); axis.Normalize(); var q = Quaternion.CreateFromAxisAngle(axis, MathHelper.PiOver2 * 1.4f + MathHelper.Pi); world = Matrix.CreateFromQuaternion(q) * Matrix.CreateScale(scale) * Matrix.CreateTranslation(disp * scale * dispScale); } icosahedronInstances.Instances.Add(world); if (!drawInstanced) { drawStep.Effect.World = world; drawStep.Effect.Instancing = false; foreach (var pass in drawStep.Effect.CurrentTechnique.Passes) { pass.Apply(); graphics.Textures[0] = surface; graphics.SetVertexBuffer(icosahedron.Vertices); graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, icosahedron.Vertices.VertexCount / 3); } } } if (drawInstanced) { drawStep.Effect.World = Matrix.Identity; drawStep.Effect.Instancing = true; icosahedronInstances.Draw(drawStep.Effect.AsEffect(), icosahedron); } }
public void Finish() { _nowDrawing = null; }