void RenderableWater_WriteNextFrameEvent(Vector3 camerapos) { double xmultiplier = scale.x / numsectors; double ymultiplier = scale.y / numsectors; GraphicsHelperGl g = new GraphicsHelperGl(); g.SetMaterialColor(new double[] { 0, 0.2, 0.8, 0.6 }); g.EnableBlendSrcAlpha(); g.EnableModulate(); g.DisableTexture2d(); // note to self: could add texture??? (or vertex fragment) Gl.glDisable(Gl.GL_CULL_FACE); // water has two sides? g.Normal(new Vector3(0, 0, 1)); for (int x = 0; x < numsectors; x++) { Gl.glBegin(Gl.GL_TRIANGLE_STRIP); for (int y = 0; y <= numsectors; y++) { Vector3 posoffset = new Vector3(x * xmultiplier, y * ymultiplier, 0); Vector3 vertexpos = pos + posoffset; //Console.WriteLine(vertexpos); g.Vertex(vertexpos); vertexpos.x += xmultiplier; //Console.WriteLine(vertexpos); g.Vertex(vertexpos); } Gl.glEnd(); } Gl.glEnable(Gl.GL_CULL_FACE); Gl.glDisable(Gl.GL_BLEND); g.SetMaterialColor(new double[] { 1, 1, 1, 1 }); }
void RenderableWater_WriteNextFrameEvent(Vector3 camerapos) { double xmultiplier = scale.x / numsectors; double ymultiplier = scale.y / numsectors; GraphicsHelperGl g = new GraphicsHelperGl(); g.SetMaterialColor(new double[] { 0, 0.2, 0.8, 0.6 }); g.EnableBlendSrcAlpha(); g.EnableModulate(); g.DisableTexture2d(); // note to self: could add texture??? (or vertex fragment) Gl.glDisable( Gl.GL_CULL_FACE ); // water has two sides? g.Normal(new Vector3(0, 0, 1)); for (int x = 0; x < numsectors; x++) { Gl.glBegin(Gl.GL_TRIANGLE_STRIP); for (int y = 0; y <= numsectors; y++) { Vector3 posoffset = new Vector3( x * xmultiplier, y * ymultiplier, 0 ); Vector3 vertexpos = pos + posoffset; //Console.WriteLine(vertexpos); g.Vertex(vertexpos); vertexpos.x += xmultiplier; //Console.WriteLine(vertexpos); g.Vertex(vertexpos); } Gl.glEnd(); } Gl.glEnable( Gl.GL_CULL_FACE ); Gl.glDisable( Gl.GL_BLEND ); g.SetMaterialColor(new double[] { 1, 1, 1, 1 }); }
// note to self: move this to subscriber? void DrawFrustrum(Vector3 camerapos) { FrustrumCulling frustrum = FrustrumCulling.GetInstance(); Vector2 cameraposonmap = new Vector2(camerapos.x * minimapwidth / mapwidth, camerapos.y * minimapheight / mapheight); // ignore z Vector2 direction = new Vector2(frustrum.viewray.x, frustrum.viewray.y); // ignore z Gl.glDisable(Gl.GL_LIGHTING); Gl.glDisable(Gl.GL_CULL_FACE); GraphicsHelperGl g = new GraphicsHelperGl(); g.DisableTexture2d(); //g.SetColor(0, 0, 1); //g.SetMaterialColor(new Color(0, 0, 1)); Gl.glColor3ub(0, 255, 0); Gl.glDepthFunc(Gl.GL_ALWAYS); Gl.glBegin(Gl.GL_LINES); Gl.glVertex2d(minimapx + cameraposonmap.x, minimapy + cameraposonmap.y); Gl.glVertex2d(minimapx + cameraposonmap.x + direction.x * viewdirectionlinelength, minimapy + cameraposonmap.y + direction.y * viewdirectionlinelength); Gl.glEnd(); Gl.glEnable(Gl.GL_LIGHTING); Gl.glDepthFunc(Gl.GL_LEQUAL); Gl.glColor3ub(255, 255, 255); }
public void ApplyCamera() { UpdateCamera(); // rotate so z axis is up, and x axis is forward PlayerMovement playermovement = PlayerMovement.GetInstance(); GraphicsHelperGl g = new GraphicsHelperGl(); g.Rotate(90, 0, 0, 1); g.Rotate(90, 0, 1, 0); Rot inversecamerarot = camerarot.Inverse(); //inversecamerarot.Inverse(); g.Rotate(inversecamerarot); //g.Rotate(camerarot); g.Translate(-camerapos); }
void RenderableMinimap_WriteNextFrameEvent(Vector3 camerapos) { //Console.WriteLine( "RenderableMinimap_WriteNextFrameEvent" ); GetDimensions(); GraphicsHelperGl g = new GraphicsHelperGl(); g.CheckError(); //LogFile.WriteLine( windowwidth + " " + windowheight + " " + RendererSdl.GetInstance().OuterWindowWidth + " " + RendererSdl.GetInstance().OuterWindowHeight ); g.ApplyOrtho(windowwidth, windowheight, RendererSdl.GetInstance().OuterWindowWidth, RendererSdl.GetInstance().OuterWindowHeight); g.CheckError(); DrawMinimap(); g.CheckError(); DrawFrustrum(camerapos); g.CheckError(); if (Render != null) { Render(minimapx, minimapy, minimapwidth, minimapheight); } g.CheckError(); g.RemoveOrtho(); g.CheckError(); }
// note to self: move this to subscriber? void DrawFrustrum(Vector3 camerapos) { FrustrumCulling frustrum = FrustrumCulling.GetInstance(); Vector2 cameraposonmap = new Vector2(camerapos.x * minimapwidth / mapwidth, camerapos.y * minimapheight / mapheight ); // ignore z Vector2 direction = new Vector2(frustrum.viewray.x, frustrum.viewray.y); // ignore z Gl.glDisable(Gl.GL_LIGHTING); Gl.glDisable(Gl.GL_CULL_FACE); GraphicsHelperGl g = new GraphicsHelperGl(); g.DisableTexture2d(); //g.SetColor(0, 0, 1); //g.SetMaterialColor(new Color(0, 0, 1)); Gl.glColor3ub(0, 255, 0); Gl.glDepthFunc(Gl.GL_ALWAYS); Gl.glBegin(Gl.GL_LINES); Gl.glVertex2d(minimapx + cameraposonmap.x, minimapy + cameraposonmap.y); Gl.glVertex2d(minimapx + cameraposonmap.x + direction.x * viewdirectionlinelength, minimapy + cameraposonmap.y + direction.y * viewdirectionlinelength); Gl.glEnd(); Gl.glEnable(Gl.GL_LIGHTING); Gl.glDepthFunc(Gl.GL_LEQUAL); Gl.glColor3ub(255, 255, 255); }
public TerrainView( TerrainModel terrainmodel ) { LogFile.WriteLine( "TerrainView( " + terrainmodel + ")" ); this.terrainmodel = terrainmodel; terrainmodel.TerrainModified += new TerrainModel.TerrainModifiedHandler( terrainmodel_TerrainModified ); GraphicsHelperGl g = new GraphicsHelperGl(); g.CheckError(); foreach (MapTextureStageModel maptexturestagemodel in terrainmodel.texturestages) { LogFile.WriteLine( "create maptexturestageview for " + maptexturestagemodel ); mapviewbymapmodel.Add( maptexturestagemodel, new MapTextureStageView( maptexturestagemodel ) ); } g.CheckError(); renderableheightmap = new RenderableHeightMap( this, terrainmodel, 1, 1 ); //renderableallfeatures = new RenderableAllFeatures(this); // water must be last, otherwise you cant see through it ;-) renderablewater = new RenderableWater(new Vector3(), new Vector2(terrainmodel.HeightMapWidth , terrainmodel.HeightMapHeight )); // minimap last, covers everything else //renderableminimap = new RenderableMinimap(this, renderableheightmap); }
// dependencies: // - RendererFactory.GetInstance() // - Tao.OpenGl public HitTarget GetClickedHitTarget(IRenderable renderable, int MouseX, int MouseY) { GraphicsHelperGl g = new GraphicsHelperGl(); g.CheckError(); IRenderer renderer = RendererFactory.GetInstance(); ArrayList results = new ArrayList(); int[] viewport = new int[4]; Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport); g.CheckError(); CreateSelectBuffer(); g.CheckError(); // This Creates A Matrix That Will Zoom Up To A Small Portion Of The Screen, Where The Mouse Is. Gl.glMatrixMode(Gl.GL_PROJECTION); g.CheckError(); Gl.glPushMatrix(); // save old matrix, we restore it at end g.CheckError(); Gl.glLoadIdentity(); g.CheckError(); Glu.gluPickMatrix((float)MouseX, (float)(renderer.WindowHeight - MouseY), 1.0f, 1.0f, viewport); g.CheckError(); Glu.gluPerspective(renderer.FieldOfView, (float)renderer.WindowWidth / (float)renderer.WindowHeight, renderer.NearClip, renderer.FarClip); g.CheckError(); Gl.glMatrixMode(Gl.GL_MODELVIEW); g.CheckError(); Gl.glRenderMode(Gl.GL_SELECT); g.CheckError(); Gl.glInitNames(); g.CheckError(); Gl.glPushName(0); // Push one entry onto the stack; we will use LoadName to change this value throughout the rendering g.CheckError(); bAddingNames = true; hittargets = new ArrayList(); renderable.Render(); bAddingNames = false; // return projection matrix to normal Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); int iNumHits = Gl.glRenderMode(Gl.GL_RENDER); int hitname = GetNearestBufferName(iNumHits); LogFile.WriteLine("hitname: " + hitname.ToString()); if (hitname == -1 || hitname == 0) { LogFile.WriteLine("not in buffer"); return(null); } FreeSelectBuffer(); new GraphicsHelperGl().CheckError(); if (hittargets.Count == 0) { return(null); } if (iNumHits == 0) { //LogFile.WriteLine("no hits"); return(null); } //LogFile.WriteLine(hittargets[hitname - 1]); return((HitTarget)hittargets[hitname - 1]); }
public RendererPass(int maxtexels) { g = new GraphicsHelperGl(); //texturestages = new TextureStage[maxtexels]; this.maxtexels = maxtexels; }
// renders to 0,0,0 ; size will be (mapwidth + 1) * xscale by (mapheight + 1) * yscale public void Render(Vector3 camerapos) { //ExportAsSingleTexture.GetInstance().Export(""); Gl.glPushMatrix(); FrustrumCulling culling = FrustrumCulling.GetInstance(); //IGraphicsHelper g = GraphicsHelperFactory.GetInstance(); GraphicsHelperGl g = new GraphicsHelperGl(); int iSectorsDrawn = 0; int iChunkDrawsSkippedNoTextureSection = 0; int numxchunks = width / chunksize; int numychunks = height / chunksize; double chunkboundingradius = chunksize * xscale * 1.414 / 2; //Console.WriteLine("chunkboundingradius: " + chunkboundingradius); g.SetMaterialColor(new Color(1.0, 1.0, 1.0)); Gl.glDepthFunc(Gl.GL_LEQUAL); g.EnableBlendSrcAlpha(); foreach( RendererPass rendererpass in rendererpasses ) { rendererpass.Apply(); for (int chunkx = 0; chunkx < numxchunks - 1; chunkx++) { for (int chunky = 0; chunky < numychunks - 1; chunky++) { if (chunkusestexturestage[rendererpass.texturestages[0].maptexturestage.maptexturestagemodel][chunkx, chunky]) { //if (iSectorsDrawn == 0) //{ int chunkmapposx = chunkx * chunksize; int chunkmapposy = chunky * chunksize; int chunkdisplayposx = chunkmapposx * xscale; int chunkdisplayposy = chunkmapposy * yscale; Vector3 chunkmappos = new Vector3(chunkmapposx, chunkmapposy, heightmap[chunkmapposx, chunkmapposy]); Vector3 chunkdisplaypos = new Vector3(chunkdisplayposx, chunkdisplayposy, heightmap[chunkmapposx, chunkmapposy]); Vector3 chunkcentredisplaypos = chunkdisplaypos + new Vector3(chunksize * xscale / 2, chunksize * yscale / 2, 0); if (culling.IsInsideFrustum(chunkcentredisplaypos, chunkboundingradius)) //if (true) { 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(chunkcentredisplaypos, camerapos); //if ( distancesquared > detaildistance * detaildistance) int stepsize = 16; if (distancesquared < loddistances[0] * loddistances[0]) { stepsize = 1; } else if (distancesquared < loddistances[1] * loddistances[2]) { stepsize = 2; } else if (distancesquared < loddistances[3] * loddistances[3]) { stepsize = 4; } else if (distancesquared < loddistances[4] * loddistances[4]) { stepsize = 8; } else if (distancesquared < loddistances[5] * loddistances[5]) { stepsize = 16; } RenderChunk(chunkx, chunky, stepsize); } } else { iChunkDrawsSkippedNoTextureSection++; } // System.Environment.Exit(1); } } //Gl.glTranslated(0, 0, 500); } //System.Environment.Exit(0); // Console.WriteLine("chunk renders: " + iSectorsDrawn + " maptextureculls: " + iChunkDrawsSkippedNoTextureSection); for (int i = maxtexels - 1; i >= 0; i--) { g.ActiveTexture(i); g.SetTextureScale(1 ); g.DisableTexture2d(); } Gl.glDepthFunc(Gl.GL_LESS); Gl.glDisable(Gl.GL_BLEND); g.EnableModulate(); Gl.glPopMatrix(); }
// applies texture stage setup to gl. texturestagenum will be 0 except for blend // where it will be either 0 or 1 // texture coordinates are handled independently (?) // either we're using multipass or we're using multitexture. multipass still uses 2 multitexture units, but not 4, 6, 8, ... public void Apply(int texturestagenum, bool UsingMultipass, int mapwidth, int mapheight) { //Console.WriteLine( "MapTextureStageView for " + maptexturestagemodel + " " + ((GlTexture)splattexture).GlReference + " Apply" ); GlTextureCombine texturecombine; GraphicsHelperGl g = new GraphicsHelperGl(); switch (maptexturestagemodel.Operation) { case MapTextureStageModel.OperationType.NoTexture: g.DisableTexture2d(); g.EnableModulate(); break; case MapTextureStageModel.OperationType.Add: splattexture.Apply(); SetTextureScale(1 / (double)maptexturestagemodel.Tilesize); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Add; texturecombine.Args[0].SetRgbaSource(GlCombineArg.Source.Previous); texturecombine.Args[1].SetRgbaSource(GlCombineArg.Source.Texture); texturecombine.Apply(); break; case MapTextureStageModel.OperationType.Blend: if (UsingMultipass) { if (texturestagenum == 0) { blendtexture.Apply(); SetTextureScale(1 / (double)mapwidth); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Replace; texturecombine.Args[0].SetAlphaSource(GlCombineArg.Source.Texture, GlCombineArg.Operand.Alpha); texturecombine.Apply(); } else { splattexture.Apply(); SetTextureScale(1 / (double)maptexturestagemodel.Tilesize); new GraphicsHelperGl().EnableModulate(); } } else { if (texturestagenum == 0) { blendtexture.Apply(); SetTextureScale(1 / (double)mapwidth); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Replace; texturecombine.Args[0].SetRgbSource(GlCombineArg.Source.Previous, GlCombineArg.Operand.Rgb); texturecombine.Args[0].SetAlphaSource(GlCombineArg.Source.Texture, GlCombineArg.Operand.Alpha); texturecombine.Apply(); } else { splattexture.Apply(); SetTextureScale(1 / (double)maptexturestagemodel.Tilesize); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Interpolate; texturecombine.Args[0].SetRgbaSource(GlCombineArg.Source.Previous); texturecombine.Args[1].SetRgbaSource(GlCombineArg.Source.Texture); texturecombine.Args[2].SetRgbSource(GlCombineArg.Source.Previous, GlCombineArg.Operand.Alpha); texturecombine.Args[2].SetAlphaSource(GlCombineArg.Source.Previous, GlCombineArg.Operand.Alpha); texturecombine.Apply(); } } break; case MapTextureStageModel.OperationType.Multiply: splattexture.Apply(); SetTextureScale(1 / (double)maptexturestagemodel.Tilesize); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Modulate; texturecombine.Args[0].SetRgbaSource(GlCombineArg.Source.Previous); texturecombine.Args[1].SetRgbaSource(GlCombineArg.Source.Texture); texturecombine.Apply(); break; case MapTextureStageModel.OperationType.Subtract: splattexture.Apply(); SetTextureScale(1 / (double)maptexturestagemodel.Tilesize); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Subtract; texturecombine.Args[0].SetRgbaSource(GlCombineArg.Source.Previous); texturecombine.Args[1].SetRgbaSource(GlCombineArg.Source.Texture); texturecombine.Apply(); break; case MapTextureStageModel.OperationType.Replace: splattexture.Apply(); SetTextureScale(1 / (double)maptexturestagemodel.Tilesize); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Modulate; texturecombine.Args[0].SetRgbaSource(GlCombineArg.Source.Texture); texturecombine.Args[1].SetRgbaSource(GlCombineArg.Source.Fragment); texturecombine.Apply(); break; } }
// dependencies: // - RendererFactory.GetInstance() // - Tao.OpenGl public HitTarget GetClickedHitTarget( IRenderable renderable, int MouseX, int MouseY ) { GraphicsHelperGl g = new GraphicsHelperGl(); g.CheckError(); IRenderer renderer = RendererFactory.GetInstance(); ArrayList results = new ArrayList(); int[] viewport = new int[ 4 ]; Gl.glGetIntegerv( Gl.GL_VIEWPORT, viewport ); g.CheckError(); CreateSelectBuffer(); g.CheckError(); // This Creates A Matrix That Will Zoom Up To A Small Portion Of The Screen, Where The Mouse Is. Gl.glMatrixMode( Gl.GL_PROJECTION ); g.CheckError(); Gl.glPushMatrix(); // save old matrix, we restore it at end g.CheckError(); Gl.glLoadIdentity(); g.CheckError(); Glu.gluPickMatrix( (float)MouseX, (float)(renderer.WindowHeight - MouseY), 1.0f, 1.0f, viewport ); g.CheckError(); Glu.gluPerspective( renderer.FieldOfView, (float)renderer.WindowWidth / (float)renderer.WindowHeight, renderer.NearClip, renderer.FarClip ); g.CheckError(); Gl.glMatrixMode(Gl.GL_MODELVIEW); g.CheckError(); Gl.glRenderMode( Gl.GL_SELECT ); g.CheckError(); Gl.glInitNames(); g.CheckError(); Gl.glPushName( 0 ); // Push one entry onto the stack; we will use LoadName to change this value throughout the rendering g.CheckError(); bAddingNames = true; hittargets = new ArrayList(); renderable.Render(); bAddingNames = false; // return projection matrix to normal Gl.glMatrixMode( Gl.GL_PROJECTION ); Gl.glPopMatrix(); Gl.glMatrixMode( Gl.GL_MODELVIEW ); int iNumHits = Gl.glRenderMode( Gl.GL_RENDER ); int hitname = GetNearestBufferName( iNumHits ); LogFile.WriteLine( "hitname: " + hitname.ToString() ); if( hitname == -1 || hitname == 0 ) { LogFile.WriteLine("not in buffer"); return null; } FreeSelectBuffer(); new GraphicsHelperGl().CheckError(); if (hittargets.Count == 0) { return null; } if (iNumHits == 0) { //LogFile.WriteLine("no hits"); return null; } //LogFile.WriteLine(hittargets[hitname - 1]); return (HitTarget)hittargets[ hitname - 1 ]; }
// note to self: move this to subscriber? void DrawMinimap() { TerrainModel terrain = MetaverseClient.GetInstance().worldstorage.terrainmodel; if (DateTime.Now.Subtract(LastMinimapUpdate).TotalMilliseconds > 1000) //if( true ) { List <RendererPass> rendererpasses = new List <RendererPass>(); bool multipass = true; // force multipass for now for simplicity int maxtexels = RendererSdl.GetInstance().MaxTexelUnits; if (multipass) { for (int i = 0; i < terrain.texturestages.Count; i++) { MapTextureStageModel maptexturestage = terrain.texturestages[i]; int numtexturestagesrequired = maptexturestage.NumTextureStagesRequired; if (numtexturestagesrequired > 0) // exclude Nops { RendererPass rendererpass = new RendererPass(maxtexels); for (int j = 0; j < maptexturestage.NumTextureStagesRequired; j++) { rendererpass.AddStage(new RendererTextureStage(maptexturestage, j, true, mapwidth, mapheight)); } rendererpasses.Add(rendererpass); } } } GraphicsHelperGl g = new GraphicsHelperGl(); //g.ApplyOrtho(windowwidth, windowheight, RendererSdl.GetInstance().OuterWindowWidth, RendererSdl.GetInstance().OuterWindowHeight); g.EnableBlendSrcAlpha(); Gl.glDepthFunc(Gl.GL_LEQUAL); int chunkwidth = minimapwidth / numchunks; int chunkheight = minimapheight / numchunks; float[] ambientLight = new float[] { 0.4f, 0.4f, 0.4f, 1.0f }; float[] diffuseLight = new float[] { 0.6f, 0.6f, 0.6f, 1.0f }; float[] specularLight = new float[] { 0.2f, 0.2f, 0.2f, 1.0f }; float[] position = new float[] { -1.0f, 0.2f, -0.4f, 1.0f }; Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, ambientLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, diffuseLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, specularLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position); foreach (RendererPass rendererpass in rendererpasses) { rendererpass.Apply(); for (int x = 0; x + chunkwidth < minimapwidth; x += chunkwidth) { for (int y = 0; y + chunkheight < minimapheight; y += chunkheight) { Gl.glBegin(Gl.GL_QUADS); //double ul = 0; //double ur = mapwidth * Terrain.SquareSize; //double vt = 0; //double vb = mapheight * Terrain.SquareSize; double ul = (double)x / minimapwidth * mapwidth; double ur = (double)(x + chunkwidth) / minimapwidth * mapwidth; double vt = (double)y / minimapheight * mapheight; double vb = (double)(y + chunkheight) / minimapheight * mapheight; double xl = minimapx + x; double xr = minimapx + x + minimapwidth / (double)numchunks; double yt = minimapy + y; double yb = minimapy + y + minimapheight / (double)numchunks; Gl.glTexCoord2d(ul, vt); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ul, vt); g.Normal(renderableheightmap.GetNormal(x * mapwidth / minimapwidth, y * mapheight / minimapheight)); //g.Normal(renderableheightmap.normalsperquad[, ]); Gl.glVertex2d(xl, yt); Gl.glTexCoord2d(ul, vb); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ul, vb); g.Normal(renderableheightmap.GetNormal(x * mapwidth / minimapwidth, (y + chunkheight) * mapheight / minimapheight)); //g.Normal( renderableheightmap.normalsperquad[x * mapwidth / minimapwidth, (y + 1) * mapheight / minimapheight ] ); Gl.glVertex2d(xl, yb); Gl.glTexCoord2d(ur, vb); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ur, vb); g.Normal(renderableheightmap.GetNormal((x + chunkwidth) * mapwidth / minimapwidth, (y + chunkheight) * mapheight / minimapheight)); //g.Normal(renderableheightmap.normalsperquad[(x + 1) * mapwidth / minimapwidth, (y + 1) * mapheight / minimapheight]); Gl.glVertex2d(xr, yb); Gl.glTexCoord2d(ur, vt); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ur, vt); g.Normal(renderableheightmap.GetNormal((x + chunkwidth) * mapwidth / minimapwidth, y * mapheight / minimapheight)); //g.Normal(renderableheightmap.normalsperquad[(x + 1) * mapwidth / minimapwidth, y * mapheight / minimapheight]); Gl.glVertex2d(xr, yt); Gl.glEnd(); } } } g.ActiveTexture(0); Gl.glBindTexture(Gl.GL_TEXTURE_2D, minimaptexture); Gl.glCopyTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, minimapx, RendererSdl.GetInstance().WindowHeight - minimapy - minimapsize, minimapsize, minimapsize, 0); Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST); LastMinimapUpdate = DateTime.Now; // g.RemoveOrtho(); g.ActiveTexture(1); g.DisableTexture2d(); g.SetTextureScale(1); g.ActiveTexture(0); g.SetTextureScale(1); g.EnableModulate(); Gl.glDisable(Gl.GL_BLEND); } else { GraphicsHelperGl g = new GraphicsHelperGl(); //Gl.glMatrixMode(Gl.GL_PROJECTION); //Gl.glPushMatrix(); //Gl.glLoadIdentity(); //Gl.glOrtho(0, windowwidth, windowheight - RendererSdl.GetInstance().OuterWindowHeight, 0, -1, 1); // we'll just draw the minimap directly onto our display //Gl.glOrtho(0, windowwidth, windowheight, windowheight - RendererSdl.GetInstance().OuterWindowHeight, -1, 1); // we'll just draw the minimap directly onto our display //Gl.glMatrixMode(Gl.GL_MODELVIEW); //Gl.glPushMatrix(); //Gl.glLoadIdentity(); g.ActiveTexture(0); g.EnableTexture2d(); Gl.glBindTexture(Gl.GL_TEXTURE_2D, minimaptexture); //Gl.glBindTexture(Gl.GL_TEXTURE_2D, (terrain.texturestages[0].texture as GlTexture).GlReference); Gl.glDisable(Gl.GL_LIGHTING); Gl.glBegin(Gl.GL_QUADS); Gl.glTexCoord2d(0, 1); Gl.glVertex2i(minimapx, minimapy); Gl.glTexCoord2d(0, 1 - minimapwidth / (double)minimapsize); Gl.glVertex2i(minimapx, minimapy + minimapheight); Gl.glTexCoord2d(minimapwidth / (double)minimapsize, 1 - minimapheight / (double)minimapsize); Gl.glVertex2i(minimapx + minimapwidth, minimapy + minimapheight); Gl.glTexCoord2d(minimapwidth / (double)minimapsize, 1); Gl.glVertex2i(minimapx + minimapwidth, minimapy); Gl.glEnd(); Gl.glEnable(Gl.GL_LIGHTING); //Gl.glMatrixMode(Gl.GL_PROJECTION); //Gl.glPopMatrix(); //Gl.glMatrixMode(Gl.GL_MODELVIEW); //Gl.glPopMatrix(); } }
// applies texture stage setup to gl. texturestagenum will be 0 except for blend // where it will be either 0 or 1 // texture coordinates are handled independently (?) // either we're using multipass or we're using multitexture. multipass still uses 2 multitexture units, but not 4, 6, 8, ... public void Apply(int texturestagenum, bool UsingMultipass, int mapwidth, int mapheight) { //Console.WriteLine( "MapTextureStageView for " + maptexturestagemodel + " " + ((GlTexture)splattexture).GlReference + " Apply" ); GlTextureCombine texturecombine; GraphicsHelperGl g = new GraphicsHelperGl(); switch (maptexturestagemodel.Operation) { case MapTextureStageModel.OperationType.NoTexture: g.DisableTexture2d(); g.EnableModulate(); break; case MapTextureStageModel.OperationType.Add: splattexture.Apply(); SetTextureScale(1 / (double)maptexturestagemodel.Tilesize); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Add; texturecombine.Args[0].SetRgbaSource(GlCombineArg.Source.Previous); texturecombine.Args[1].SetRgbaSource(GlCombineArg.Source.Texture); texturecombine.Apply(); break; case MapTextureStageModel.OperationType.Blend: if (UsingMultipass) { if (texturestagenum == 0) { blendtexture.Apply(); SetTextureScale(1 / (double)mapwidth); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Replace; texturecombine.Args[0].SetAlphaSource(GlCombineArg.Source.Texture, GlCombineArg.Operand.Alpha); texturecombine.Apply(); } else { splattexture.Apply(); SetTextureScale( 1 / (double)maptexturestagemodel.Tilesize ); new GraphicsHelperGl().EnableModulate(); } } else { if (texturestagenum == 0) { blendtexture.Apply(); SetTextureScale(1 / (double)mapwidth); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Replace; texturecombine.Args[0].SetRgbSource(GlCombineArg.Source.Previous, GlCombineArg.Operand.Rgb); texturecombine.Args[0].SetAlphaSource(GlCombineArg.Source.Texture, GlCombineArg.Operand.Alpha); texturecombine.Apply(); } else { splattexture.Apply(); SetTextureScale( 1 / (double)maptexturestagemodel.Tilesize ); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Interpolate; texturecombine.Args[0].SetRgbaSource(GlCombineArg.Source.Previous); texturecombine.Args[1].SetRgbaSource(GlCombineArg.Source.Texture); texturecombine.Args[2].SetRgbSource(GlCombineArg.Source.Previous, GlCombineArg.Operand.Alpha); texturecombine.Args[2].SetAlphaSource(GlCombineArg.Source.Previous, GlCombineArg.Operand.Alpha); texturecombine.Apply(); } } break; case MapTextureStageModel.OperationType.Multiply: splattexture.Apply(); SetTextureScale( 1 / (double)maptexturestagemodel.Tilesize ); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Modulate; texturecombine.Args[0].SetRgbaSource(GlCombineArg.Source.Previous); texturecombine.Args[1].SetRgbaSource(GlCombineArg.Source.Texture); texturecombine.Apply(); break; case MapTextureStageModel.OperationType.Subtract: splattexture.Apply(); SetTextureScale( 1 / (double)maptexturestagemodel.Tilesize ); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Subtract; texturecombine.Args[0].SetRgbaSource(GlCombineArg.Source.Previous); texturecombine.Args[1].SetRgbaSource(GlCombineArg.Source.Texture); texturecombine.Apply(); break; case MapTextureStageModel.OperationType.Replace: splattexture.Apply(); SetTextureScale( 1 / (double)maptexturestagemodel.Tilesize ); texturecombine = new GlTextureCombine(); texturecombine.Operation = GlTextureCombine.OperationType.Modulate; texturecombine.Args[0].SetRgbaSource(GlCombineArg.Source.Texture); texturecombine.Args[1].SetRgbaSource(GlCombineArg.Source.Fragment); texturecombine.Apply(); break; } }
void RenderableMinimap_WriteNextFrameEvent(Vector3 camerapos) { //Console.WriteLine( "RenderableMinimap_WriteNextFrameEvent" ); GetDimensions(); GraphicsHelperGl g = new GraphicsHelperGl(); g.CheckError(); //LogFile.WriteLine( windowwidth + " " + windowheight + " " + RendererSdl.GetInstance().OuterWindowWidth + " " + RendererSdl.GetInstance().OuterWindowHeight ); g.ApplyOrtho( windowwidth, windowheight, RendererSdl.GetInstance().OuterWindowWidth, RendererSdl.GetInstance().OuterWindowHeight ); g.CheckError(); DrawMinimap(); g.CheckError(); DrawFrustrum(camerapos); g.CheckError(); if (Render != null) { Render(minimapx, minimapy, minimapwidth, minimapheight); } g.CheckError(); g.RemoveOrtho(); g.CheckError(); }
// renders to 0,0,0 ; size will be (mapwidth + 1) * xscale by (mapheight + 1) * yscale public void Render(Vector3 camerapos) { //ExportAsSingleTexture.GetInstance().Export(""); Gl.glPushMatrix(); FrustrumCulling culling = FrustrumCulling.GetInstance(); //IGraphicsHelper g = GraphicsHelperFactory.GetInstance(); GraphicsHelperGl g = new GraphicsHelperGl(); int iSectorsDrawn = 0; int iChunkDrawsSkippedNoTextureSection = 0; int numxchunks = width / chunksize; int numychunks = height / chunksize; double chunkboundingradius = chunksize * xscale * 1.414 / 2; //Console.WriteLine("chunkboundingradius: " + chunkboundingradius); g.SetMaterialColor(new Color(1.0, 1.0, 1.0)); Gl.glDepthFunc(Gl.GL_LEQUAL); g.EnableBlendSrcAlpha(); foreach (RendererPass rendererpass in rendererpasses) { rendererpass.Apply(); for (int chunkx = 0; chunkx < numxchunks - 1; chunkx++) { for (int chunky = 0; chunky < numychunks - 1; chunky++) { if (chunkusestexturestage[rendererpass.texturestages[0].maptexturestage.maptexturestagemodel][chunkx, chunky]) { //if (iSectorsDrawn == 0) //{ int chunkmapposx = chunkx * chunksize; int chunkmapposy = chunky * chunksize; int chunkdisplayposx = chunkmapposx * xscale; int chunkdisplayposy = chunkmapposy * yscale; Vector3 chunkmappos = new Vector3(chunkmapposx, chunkmapposy, heightmap[chunkmapposx, chunkmapposy]); Vector3 chunkdisplaypos = new Vector3(chunkdisplayposx, chunkdisplayposy, heightmap[chunkmapposx, chunkmapposy]); Vector3 chunkcentredisplaypos = chunkdisplaypos + new Vector3(chunksize * xscale / 2, chunksize * yscale / 2, 0); if (culling.IsInsideFrustum(chunkcentredisplaypos, chunkboundingradius)) //if (true) { 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(chunkcentredisplaypos, camerapos); //if ( distancesquared > detaildistance * detaildistance) int stepsize = 16; if (distancesquared < loddistances[0] * loddistances[0]) { stepsize = 1; } else if (distancesquared < loddistances[1] * loddistances[2]) { stepsize = 2; } else if (distancesquared < loddistances[3] * loddistances[3]) { stepsize = 4; } else if (distancesquared < loddistances[4] * loddistances[4]) { stepsize = 8; } else if (distancesquared < loddistances[5] * loddistances[5]) { stepsize = 16; } RenderChunk(chunkx, chunky, stepsize); } } else { iChunkDrawsSkippedNoTextureSection++; } // System.Environment.Exit(1); } } //Gl.glTranslated(0, 0, 500); } //System.Environment.Exit(0); // Console.WriteLine("chunk renders: " + iSectorsDrawn + " maptextureculls: " + iChunkDrawsSkippedNoTextureSection); for (int i = maxtexels - 1; i >= 0; i--) { g.ActiveTexture(i); g.SetTextureScale(1); g.DisableTexture2d(); } Gl.glDepthFunc(Gl.GL_LESS); Gl.glDisable(Gl.GL_BLEND); g.EnableModulate(); Gl.glPopMatrix(); }
// note to self: move this to subscriber? void DrawMinimap() { TerrainModel terrain = MetaverseClient.GetInstance().worldstorage.terrainmodel; if (DateTime.Now.Subtract(LastMinimapUpdate).TotalMilliseconds > 1000) //if( true ) { List<RendererPass> rendererpasses = new List<RendererPass>(); bool multipass = true; // force multipass for now for simplicity int maxtexels = RendererSdl.GetInstance().MaxTexelUnits; if (multipass) { for (int i = 0; i < terrain.texturestages.Count; i++) { MapTextureStageModel maptexturestage = terrain.texturestages[i]; int numtexturestagesrequired = maptexturestage.NumTextureStagesRequired; if (numtexturestagesrequired > 0) // exclude Nops { RendererPass rendererpass = new RendererPass(maxtexels); for (int j = 0; j < maptexturestage.NumTextureStagesRequired; j++) { rendererpass.AddStage(new RendererTextureStage(maptexturestage, j, true, mapwidth, mapheight)); } rendererpasses.Add(rendererpass); } } } GraphicsHelperGl g = new GraphicsHelperGl(); //g.ApplyOrtho(windowwidth, windowheight, RendererSdl.GetInstance().OuterWindowWidth, RendererSdl.GetInstance().OuterWindowHeight); g.EnableBlendSrcAlpha(); Gl.glDepthFunc(Gl.GL_LEQUAL); int chunkwidth = minimapwidth / numchunks; int chunkheight = minimapheight / numchunks; float[] ambientLight = new float[] { 0.4f, 0.4f, 0.4f, 1.0f }; float[] diffuseLight = new float[] { 0.6f, 0.6f, 0.6f, 1.0f }; float[] specularLight = new float[] { 0.2f, 0.2f, 0.2f, 1.0f }; float[] position = new float[] { -1.0f, 0.2f, -0.4f, 1.0f }; Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, ambientLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, diffuseLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, specularLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position); foreach (RendererPass rendererpass in rendererpasses) { rendererpass.Apply(); for (int x = 0; x + chunkwidth < minimapwidth; x += chunkwidth) { for (int y = 0; y + chunkheight < minimapheight; y += chunkheight) { Gl.glBegin(Gl.GL_QUADS); //double ul = 0; //double ur = mapwidth * Terrain.SquareSize; //double vt = 0; //double vb = mapheight * Terrain.SquareSize; double ul = (double)x / minimapwidth * mapwidth; double ur = (double)(x + chunkwidth) / minimapwidth * mapwidth; double vt = (double)y / minimapheight * mapheight; double vb = (double)(y + chunkheight) / minimapheight * mapheight; double xl = minimapx + x; double xr = minimapx + x + minimapwidth / (double)numchunks; double yt = minimapy + y; double yb = minimapy + y + minimapheight / (double)numchunks; Gl.glTexCoord2d(ul, vt); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ul, vt); g.Normal(renderableheightmap.GetNormal(x * mapwidth / minimapwidth, y * mapheight / minimapheight)); //g.Normal(renderableheightmap.normalsperquad[, ]); Gl.glVertex2d(xl, yt); Gl.glTexCoord2d(ul, vb); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ul, vb); g.Normal(renderableheightmap.GetNormal(x * mapwidth / minimapwidth, (y + chunkheight) * mapheight / minimapheight)); //g.Normal( renderableheightmap.normalsperquad[x * mapwidth / minimapwidth, (y + 1) * mapheight / minimapheight ] ); Gl.glVertex2d(xl, yb); Gl.glTexCoord2d(ur, vb); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ur, vb); g.Normal(renderableheightmap.GetNormal((x + chunkwidth) * mapwidth / minimapwidth, (y + chunkheight) * mapheight / minimapheight)); //g.Normal(renderableheightmap.normalsperquad[(x + 1) * mapwidth / minimapwidth, (y + 1) * mapheight / minimapheight]); Gl.glVertex2d(xr, yb); Gl.glTexCoord2d(ur, vt); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ur, vt); g.Normal(renderableheightmap.GetNormal((x + chunkwidth) * mapwidth / minimapwidth, y * mapheight / minimapheight)); //g.Normal(renderableheightmap.normalsperquad[(x + 1) * mapwidth / minimapwidth, y * mapheight / minimapheight]); Gl.glVertex2d(xr, yt); Gl.glEnd(); } } } g.ActiveTexture(0); Gl.glBindTexture(Gl.GL_TEXTURE_2D, minimaptexture); Gl.glCopyTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, minimapx, RendererSdl.GetInstance().WindowHeight - minimapy - minimapsize, minimapsize, minimapsize, 0); Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST); LastMinimapUpdate = DateTime.Now; // g.RemoveOrtho(); g.ActiveTexture(1); g.DisableTexture2d(); g.SetTextureScale(1); g.ActiveTexture(0); g.SetTextureScale(1); g.EnableModulate(); Gl.glDisable(Gl.GL_BLEND); } else { GraphicsHelperGl g = new GraphicsHelperGl(); //Gl.glMatrixMode(Gl.GL_PROJECTION); //Gl.glPushMatrix(); //Gl.glLoadIdentity(); //Gl.glOrtho(0, windowwidth, windowheight - RendererSdl.GetInstance().OuterWindowHeight, 0, -1, 1); // we'll just draw the minimap directly onto our display //Gl.glOrtho(0, windowwidth, windowheight, windowheight - RendererSdl.GetInstance().OuterWindowHeight, -1, 1); // we'll just draw the minimap directly onto our display //Gl.glMatrixMode(Gl.GL_MODELVIEW); //Gl.glPushMatrix(); //Gl.glLoadIdentity(); g.ActiveTexture(0); g.EnableTexture2d(); Gl.glBindTexture(Gl.GL_TEXTURE_2D, minimaptexture); //Gl.glBindTexture(Gl.GL_TEXTURE_2D, (terrain.texturestages[0].texture as GlTexture).GlReference); Gl.glDisable(Gl.GL_LIGHTING); Gl.glBegin(Gl.GL_QUADS); Gl.glTexCoord2d(0, 1); Gl.glVertex2i(minimapx, minimapy); Gl.glTexCoord2d(0, 1 - minimapwidth / (double)minimapsize); Gl.glVertex2i(minimapx, minimapy + minimapheight); Gl.glTexCoord2d(minimapwidth / (double)minimapsize, 1 - minimapheight / (double)minimapsize); Gl.glVertex2i(minimapx + minimapwidth, minimapy + minimapheight); Gl.glTexCoord2d(minimapwidth / (double)minimapsize, 1); Gl.glVertex2i(minimapx + minimapwidth, minimapy); Gl.glEnd(); Gl.glEnable(Gl.GL_LIGHTING); //Gl.glMatrixMode(Gl.GL_PROJECTION); //Gl.glPopMatrix(); //Gl.glMatrixMode(Gl.GL_MODELVIEW); //Gl.glPopMatrix(); } }