bool m_bDivingIntoWater = false; //to handle diving transions from water surface. if enabled,let finish it; //Vector3 m_LarasHeapPosition; // Use this for initialization void Start() { m_Transform = transform; OnGUIUpdate += GUIManager.HandleGUIUpdate; OnGUIPlayerHealth += GUIManager.HandleGUIPlayerHealth; OnPositionChanged += PositionChanged; //GotoKeyMapper.IdleState(); KeyMapper.OnKeyDown += StateCodeHandler; KeyMapper.OnKeyIdle += IdleStateHandler; Mouse.m_OnMouseMove += OnMouseMove; physics = new Physic3D(m_Transform.position); physics.g = 5000 * Settings.SceneScaling; //prevy = thistransform.position.y; LaraStatePlayer.OnJump += JumpHandler; LaraStatePlayer.OnJumping += JumpingHandler; LaraStatePlayer.OnMovement += MovementHandler; //LaraStatePlayer.OnPrimaryAction += PrimaryActionHandler; //this callback is not needed anymore //m_FreePosition = m_Transform.position; //m_PrevPlayPos = m_Transform.position; //m_GroundHeight = m_Transform.position.y; m_LarasHeap = m_Transform.Find("objPart:0"); m_LarasHead = m_LarasHeap.Find("objPart:7").Find("objPart:14"); //m_LarasHeapPosition = m_LarasHeap.position - Vector3.up * 0.25f; SetInitialPosition(m_Transform.position, transform.forward); physics.OnReachedMaximumHeight += DidReachedMaxJumpHeight; }
public bool HitTest(Vector3 origin, Vector3 dir, ref Vector3 normal, float raylength = 200) { Vector3 hitpoint = Vector3.zero; int faceid = Physic3D.RayCast(m_Transform, m_RoomVertices, m_SharedTriangles, origin, dir, raylength, ref hitpoint); if (faceid != -1) { Triangle face = m_RoomAnalyzer.LodTriangles[faceid]; normal = face.normal; } return(faceid != -1); }
// Update is called once per frame void Update() { Physic3D.RayCast(mf.transform, mesh.vertices, mesh.triangles, transform.position, transform.forward, 10000, ref hp); Debug.DrawLine(transform.position, hp); }
public List <Edge> RayCast(Vector3 origin, Vector3 dir, float raylength = 200) { //first select a face from face network //then find a edge that is normal to ground. //if normal going upward and found next edge diagonal - > go to mirror face //if normal going upward found next edge horizontal - > next edge lader step // -> if lader step found chek it is topmost go to mirror face //else //if normal going downward and found next edge horizontal - > go to mirror face //f normal going downward and found next edge diagonal - > third edge is lader step // -> if lader step found chek it is topmost go to mirror face Vector3 hitpoint = Vector3.zero; int faceid = Physic3D.RayCast(m_Transform, m_RoomVertices, m_SharedTriangles, origin, dir, raylength, ref hitpoint); //find all edeges connected to faceid List <Edge> edges = new List <Edge>(); if (faceid != -1) { //Debug.Log("Room.RayCast:" + faceid); Triangle face = m_RoomAnalyzer.LodTriangles[faceid]; int ntrycount = 0; Edge TempEdge = null; Edge platformEdge = null; while (platformEdge == null) { for (int k = 0; k < face.vertex.Length; k++) { int nextid = (k + 1) % face.vertex.Length; Vector3 upvec = (face.vertex[nextid].position - face.vertex[k].position).normalized; float dot = Vector3.Dot(Vector3.up, upvec); if (dot == 1.0f) //goin upward { //check if next edge is diagonal int diagonalvtx0 = nextid; int diagonalvtx1 = (nextid + 1) % face.vertex.Length; Vector3 diagvec = (face.vertex[diagonalvtx1].position - face.vertex[diagonalvtx0].position).normalized; bool isdiag = (Vector3.Dot(upvec, diagvec) != 0); bool gotomirrorface = false; if (!isdiag) //found ladder step { Edge e = new Edge(face.vertex[diagonalvtx0].position, face.vertex[diagonalvtx1].position); e.AtoB = diagvec; TempEdge = e; //check if this is top most step if (SurfaceAnalyzer.ComputeEdgeCollapseCost(face.vertex[diagonalvtx0], face.vertex[diagonalvtx1]) < 1) { platformEdge = e; break; } else { gotomirrorface = true; } } else { gotomirrorface = true; } if (gotomirrorface) { List <Triangle> faces = face.vertex[diagonalvtx0].face; for (int i = 0; i < faces.Count; i++) { if (faces[i].HasVertex(face.vertex[diagonalvtx1]) && !faces[i].HasVertex(face.vertex[k])) { face = faces[i]; break; } } } } else if (dot == -1.0f) { //check if next edge is diagonal int diagonalvtx0 = nextid; int diagonalvtx1 = (nextid + 1) % face.vertex.Length; Vector3 diagvec = (face.vertex[diagonalvtx1].position - face.vertex[diagonalvtx0].position).normalized; bool isdiag = (Vector3.Dot(upvec, diagvec) != 0); bool gotomirrorface = false; if (!isdiag) //found lowest ladder step { gotomirrorface = true; } else { Edge e = new Edge(face.vertex[diagonalvtx1].position, face.vertex[k].position); e.AtoB = (face.vertex[k].position - face.vertex[diagonalvtx1].position).normalized; TempEdge = e; //check if this is top most step if (SurfaceAnalyzer.ComputeEdgeCollapseCost(face.vertex[diagonalvtx1], face.vertex[k]) < 1) { platformEdge = e; break; } else { gotomirrorface = true; } } if (gotomirrorface) { List <Triangle> faces = face.vertex[diagonalvtx1].face; for (int i = 0; i < faces.Count; i++) { if (faces[i].HasVertex(face.vertex[k]) && !faces[i].HasVertex(face.vertex[diagonalvtx0])) { face = faces[i]; break; } } } } } ntrycount++; if (ntrycount > 20) { if (TempEdge != null) { platformEdge = TempEdge; } break; } } if (platformEdge != null) { edges.Add(platformEdge); } } return(edges); }
// Use this for initialization void Start() { m_Transform = transform; OnGUIUpdate += GUIManager.HandleGUIUpdate; OnGUIPlayerHealth += GUIManager.HandleGUIPlayerHealth; OnPositionChanged += PositionChanged; //GotoKeyMapper.IdleState(); KeyMapper.OnKeyDown += StateCodeHandler; KeyMapper.OnKeyIdle += IdleStateHandler; Mouse.m_OnMouseMove += OnMouseMove; physics = new Physic3D(transform.position); physics.g = 5000; //prevy = thistransform.position.y; LaraStatePlayer.OnJump += JumpHandler; LaraStatePlayer.OnJumping += JumpingHandler; LaraStatePlayer.OnMovement += MovementHandler; LaraStatePlayer.OnPrimaryAction += PrimaryActionHandler; //m_FreePosition = transform.position; //m_PrevPlayPos = m_Transform.position; //m_GroundHeight = transform.position.y; SetInitialPosition(transform.position, transform.forward); }