void renderableminimap_Render(int minimapleft, int minimaptop, int minimapwidth, int minimapheight) { //Console.WriteLine("renderableminimap_Render"); Vector3 intersectpoint = EditingHelper.GetIntersectPoint(); if (intersectpoint != null) { Vector2 minimappos = new Vector2(intersectpoint.x * minimapwidth / Terrain.GetInstance().MapWidth / Terrain.SquareSize, intersectpoint.y * minimapheight / Terrain.GetInstance().MapHeight / Terrain.SquareSize); //Console.WriteLine("minmappos: " + minimappos); //double distancefromcamera = (intersectpoint - camerapos).Det(); GraphicsHelperFactory.GetInstance().SetMaterialColor(new Color(0, 0, 1)); Gl.glPushMatrix(); Gl.glDisable(Gl.GL_LIGHTING); Gl.glDisable(Gl.GL_CULL_FACE); Gl.glColor3ub(0, 0, 255); Gl.glBegin(Gl.GL_POINTS); Gl.glVertex2d(minimapleft + minimappos.x, minimaptop + minimappos.y); Gl.glEnd(); Gl.glEnable(Gl.GL_CULL_FACE); Gl.glEnable(Gl.GL_LIGHTING); Gl.glColor3ub(255, 255, 255); //Gl.glTranslated(intersectpoint.x, intersectpoint.y, intersectpoint.z); //Gl.glScaled(0.01 * distancefromcamera, 0.01 * distancefromcamera, 0.01 * distancefromcamera); //GraphicsHelperFactory.GetInstance().DrawSphere(); Gl.glPopMatrix(); } }
// for testing only void FrustrumCulling_WriteNextFrameEvent() { SetupFrustrum(); IGraphicsHelper g = GraphicsHelperFactory.GetInstance(); /* * g.SetMaterialColor(new Color(1, 1, 0)); * Gl.glBegin(Gl.GL_LINES); * g.Vertex(camerapos + viewray * 0.51 + HNear / 2 * 0.95 * right + VNear / 2 * 0.95 * up); * g.Vertex(camerapos + viewray * 0.51 - HNear / 2 * 0.95 * right + VNear / 2 * 0.95 * up); * Gl.glEnd(); * Gl.glBegin(Gl.GL_LINES); * g.Vertex(camerapos + viewray * 0.51 - HNear / 2 * 0.95 * right - VNear / 2 * 0.95 * up); * g.Vertex(camerapos + viewray * 0.51 + HNear / 2 * 0.95 * right - VNear / 2 * 0.95 * up); * Gl.glEnd(); */ g.SetMaterialColor(new Color(1, 0, 1)); Gl.glBegin(Gl.GL_LINES); g.Vertex(camerapos + viewray * 1050 + HFar / 2 * 0.95 * right + VFar / 2 * 0.95 * up); g.Vertex(camerapos + viewray * 1050 - HFar / 2 * 0.95 * right + VFar / 2 * 0.95 * up); Gl.glEnd(); Gl.glBegin(Gl.GL_LINES); g.Vertex(camerapos + viewray * 1050 - HFar / 2 * 0.95 * right - VFar / 2 * 0.95 * up); g.Vertex(camerapos + viewray * 1050 + HFar / 2 * 0.95 * right - VFar / 2 * 0.95 * up); Gl.glEnd(); g.SetMaterialColor(new Color(1, 0, 0)); Gl.glBegin(Gl.GL_LINES); g.Vertex(viewray * 10); g.Vertex(viewray * 100); Gl.glEnd(); g.SetMaterialColor(new Color(0, 1, 0)); Gl.glBegin(Gl.GL_LINES); g.Vertex(viewray * 10); g.Vertex(viewray * 10 + right * 100); Gl.glEnd(); g.SetMaterialColor(new Color(0, 0, 1)); Gl.glBegin(Gl.GL_LINES); g.Vertex(viewray * 10); g.Vertex(viewray * 10 + up * 100); Gl.glEnd(); g.SetMaterialColor(new Color(0, 1, 1)); for (int i = 0; i < 6; i++) { Gl.glBegin(Gl.GL_LINES); g.Vertex(planes[i].point + viewray * 100); g.Vertex(planes[i].point + planes[i].normalizednormal * 100 + viewray * 100); Gl.glEnd(); } //Console.WriteLine( CheckObject(camerapos - 3 * viewray, 2) ); //System.Environment.Exit(0); }
public void ApplyCamera() { //PlayerMovement playermovement = PlayerMovement.GetInstance(); GLMatrix4d cameramatrix = GLMatrix4d.identity(); // rotate and reflect so x points right, y points backwards, z points up cameramatrix.applyRotate(-90, 1.0, 0.0, 0.0); cameramatrix.applyScale(1, -1, 1); // rotate so x points right, y points forward, z points up //cameramatrix.applyRotate(-90, 1.0, 0.0, 0.0); // rotate so z axis is up, and x axis is forward, y axis is left //cameramatrix.applyRotate(90, 0.0, 0.0, 1.0); //cameramatrix.applyRotate( 90, 0.0, 1.0, 0.0 ); if (bRoamingCameraEnabled) { Rot inversecamerarot = RoamingCameraRot.Inverse(); mvMath.ApplyRotToGLMatrix4d(ref cameramatrix, inversecamerarot); cameramatrix.applyTranslate(-RoamingCameraPos.x, -RoamingCameraPos.y, -RoamingCameraPos.z); } else if (viewpoint == Viewpoint.MouseLook) { //cameramatrix.applyRotate( - playermovement.avataryrot, 0f, 1f, 0f ); //cameramatrix.applyRotate( - playermovement.avatarzrot, 0f, 0f, 1f ); //cameramatrix.applyTranslate( - playermovement.avatarpos.x, - playermovement.avatarpos.y, - playermovement.avatarpos.z ); } else if (viewpoint == Viewpoint.BehindPlayer) { /* * cameramatrix.applyRotate( -18f, 0f, 1f, 0f ); * * // Vector3 V = new Vector3( 0, playermovement.avataryrot * mvMath.PiOver180, playermovement.avatarzrot * mvMath.PiOver180 ); * * cameramatrix.applyTranslate( 3.0f, 0.0f, -1.0f ); * * cameramatrix.applyRotate( - (float)playermovement.avataryrot, 0f, 1f, 0f ); * cameramatrix.applyRotate( - (float)playermovement.avatarzrot, 0f, 0f, 1f ); * * cameramatrix.applyTranslate( -playermovement.avatarpos.x, -playermovement.avatarpos.y, -playermovement.avatarpos.z ); */ } else if (viewpoint == Viewpoint.ThirdParty) { /* * cameramatrix.applyRotate( -18f, 0f, 1f, 0f ); * cameramatrix.applyRotate( -90f, 0f, 0f, 1f ); * * cameramatrix.applyTranslate( 0.0, - fThirdPartyViewZoom, fThirdPartyViewZoom / 3.0 ); * cameramatrix.applyRotate( - fThirdPartyViewRotate, 0f, 0f, 1f ); * cameramatrix.applyTranslate( - playermovement.avatarpos.x, - playermovement.avatarpos.y, - playermovement.avatarpos.z ); */ } GraphicsHelperFactory.GetInstance().LoadMatrix(cameramatrix.ToArray()); }
void CurrentEditSpot_WriteNextFrameEvent() { Vector3 intersectpoint = HeightEditor.GetInstance().GetIntersectPoint(); if (intersectpoint != null) { double distancefromcamera = (intersectpoint - Camera.GetInstance().RoamingCameraPos).Det(); GraphicsHelperFactory.GetInstance().SetMaterialColor(new Color(0, 0, 1)); Gl.glPushMatrix(); Gl.glTranslated(intersectpoint.x, intersectpoint.y, intersectpoint.z); Gl.glScaled(0.01 * distancefromcamera, 0.01 * distancefromcamera, 0.01 * distancefromcamera); GraphicsHelperFactory.GetInstance().DrawSphere(); Gl.glPopMatrix(); } }
void renderer_WriteNextFrameEvent() { Gl.glPushMatrix(); Gl.glBegin(Gl.GL_LINES); GraphicsHelperFactory.GetInstance().SetMaterialColor(new Color(1, 0, 0)); Gl.glVertex3d(1, 1, 1); Gl.glVertex3d(100, 1, 1); GraphicsHelperFactory.GetInstance().SetMaterialColor(new Color(0, 1, 0)); Gl.glVertex3d(1, 1, 1); Gl.glVertex3d(1, 100, 1); GraphicsHelperFactory.GetInstance().SetMaterialColor(new Color(0, 0, 1)); Gl.glVertex3d(1, 1, 1); Gl.glVertex3d(1, 1, 100); Gl.glEnd(); Gl.glPopMatrix(); }
/// <summary> /// Return current mouse intersect point to x-y plane on map, in display coordinates /// </summary> /// <returns></returns> public static Vector3 GetIntersectPoint() { // intersect mousevector with x-z plane. Terrain terrain = Terrain.GetInstance(); Vector3 mousevector = GraphicsHelperFactory.GetInstance().GetMouseVector( Camera.GetInstance().RoamingCameraPos, Camera.GetInstance().RoamingCameraRot, MouseFilterMouseCacheFactory.GetInstance().MouseX, MouseFilterMouseCacheFactory.GetInstance().MouseY); Vector3 camerapos = Camera.GetInstance().RoamingCameraPos; int width = terrain.HeightMapWidth; int height = terrain.HeightMapHeight; //Vector3 planenormal = mvMath.ZAxis; mousevector.Normalize(); if (mousevector.z < -0.0005) { //Vector3 intersectionpoint = camerapos + mousevector * (Vector3.DotProduct(camerapos, planenormal) + 0) / // (Vector3.DotProduct(mousevector, planenormal)); Vector3 intersectpoint = camerapos - mousevector * (camerapos.z / mousevector.z); //Console.WriteLine("intersection: " + intersectionpoint.ToString()); double heightmapx = intersectpoint.x / Terrain.SquareSize; double heightmapy = intersectpoint.y / Terrain.SquareSize; if (heightmapx >= 0 && heightmapy >= 0 && heightmapx < width && heightmapy < height) { intersectpoint.z = Terrain.GetInstance().Map[(int)heightmapx, (int)heightmapy]; return intersectpoint; } else { return null; } } else { // Console.WriteLine("no intersection"); return null; } }
// The terrain rendering code is adapted from some example code in sdl or glut void renderer_WriteNextFrameEvent() { Gl.glPushMatrix(); //Gl.glTranslatef(-MAXMESH / 2, MAXMESH * 2, 0); float[,] mesh = HeightMap.GetInstance().Map; int width = HeightMap.GetInstance().Width; int height = HeightMap.GetInstance().Height; FrustrumCulling culling = FrustrumCulling.GetInstance(); IGraphicsHelper g = GraphicsHelperFactory.GetInstance(); iSectorsDrawn = 0; //Gl.glColor3ub(255, 255, 255); //g.SetMaterialColor(new Color(1, 0, 0)); g.SetMaterialColor(new Color(0.3, 0.8, 0.3)); for (int sectorx = 0; sectorx < (width / sectorsize) - 1; sectorx++) { for (int sectory = 0; sectory < (height / sectorsize) - 1; sectory++) { //if (iSectorsDrawn == 0) //{ int sectorposx = sectorx * sectorsize; int sectorposy = sectory * sectorsize; int displayposx = sectorposx * SquareSize; int displayposy = sectorposy * SquareSize; Vector3 sectorpos = new Vector3(sectorposx, sectorposy, mesh[sectorposx, sectorposy]); Vector3 displaypos = new Vector3(displayposx, displayposy, mesh[sectorposx, sectorposy]); if (culling.IsInsideFrustum(displaypos + new Vector3(sectorsize * SquareSize / 2, sectorsize * SquareSize / 2, 0), sectorsize * SquareSize)) { iSectorsDrawn++; // check how far away sector is // if nearby we render it in detail // otherwise just render a few points from it double distancesquared = Vector3.DistanceSquared(displaypos, Camera.GetInstance().RoamingCameraPos); //if ( distancesquared > detaildistance * detaildistance) if (false) { g.SetMaterialColor(new Color(1, 0, 0)); Vector3 a = new Vector3(sectorsize * SquareSize, sectorsize * SquareSize, mesh[sectorposx + sectorsize, sectorposy + sectorsize] - mesh[sectorposx, sectorposy]); Vector3 b = new Vector3(sectorsize * SquareSize, -sectorsize * SquareSize, mesh[sectorposx + sectorsize, sectorposy] - mesh[sectorposx, sectorposy + sectorsize]); Vector3 normal = Vector3.CrossProduct(a, b).Normalize(); Gl.glNormal3d(normal.x, normal.y, normal.z); Gl.glBegin(Gl.GL_TRIANGLE_STRIP); Gl.glVertex3f(sectorposx * SquareSize, sectorposy * SquareSize, mesh[sectorposx, sectorposy]); Gl.glVertex3f(sectorposx * SquareSize, sectorposy * SquareSize + sectorsize * SquareSize, mesh[sectorposx, sectorposy + sectorsize]); Gl.glVertex3f(sectorposx * SquareSize + sectorsize * SquareSize, sectorposy * SquareSize, mesh[sectorposx + sectorsize, sectorposy]); Gl.glVertex3f(sectorposx * SquareSize + sectorsize * SquareSize, sectorposy * SquareSize + sectorsize * SquareSize, mesh[sectorposx + sectorsize, sectorposy + sectorsize]); Gl.glEnd(); } else { int stepsize = 16; if (distancesquared < 1200 * 1200) { stepsize = 1; } else if (distancesquared < 2400 * 2400) { stepsize = 2; } else if (distancesquared < 4000 * 4000) { stepsize = 4; } else if (distancesquared < 7200 * 7200) { stepsize = 8; } //else if (distancesquared < 1600 * 1600) //{ // stepsize = 16; //} if (colorlevelsofdetail) { g.SetMaterialColor(new Color(0, 0.5 + (float)stepsize * 8 / 255, 0)); } DrawSubGrid(sectorposx, sectorposy, sectorsize, sectorsize, stepsize); } } //} } } Gl.glPopMatrix(); //Console.WriteLine( "sectors drawn: " + iSectorsDrawn ); }