Ejemplo n.º 1
0
        public static PluginsLoader GetInstance()
        {
            instance.LoadAssemblyPlugins();

            Config.GetInstance();
            Terrain.GetInstance();
            HeightMapPersistence.GetInstance();
            SlopeMapPersistence.GetInstance();
            MouseFilterSdlMouseCache.GetInstance();
            KeyFilterSdlKeyCache.GetInstance();
            KeyFilterConfigMappingsFactory.GetInstance();
            //HeightEditor.GetInstance();
            EditController.GetInstance();
            Camera.GetInstance();
            Framerate.GetInstance();
            FrustrumCulling.GetInstance();

            BrushShapeController.GetInstance().Register(new RoundBrush());
            BrushShapeController.GetInstance().Register(new SquareBrush());

            BrushEffectController.GetInstance().Register(new RaiseLower());
            BrushEffectController.GetInstance().Register(new Flatten());
            BrushEffectController.GetInstance().Register(new PaintTexture());
            BrushEffectController.GetInstance().Register(new AddFeature());
            BrushEffectController.GetInstance().Register(new FixedHeight());

            //Sm3Persistence.GetInstance().LoadSm3("maps/Whakamatunga_Riri.sm3");
            //EditTexture.GetInstance();
            //FeatureEditing.GetInstance();

            MainUI.GetInstance();

            return(instance);
        }
Ejemplo n.º 2
0
        // note to self: move this to subscriber?
        void DrawFrustrum(Vector3 camerapos)
        {
            FrustrumCulling frustrum       = FrustrumCulling.GetInstance();
            Vector2         cameraposonmap = new Vector2(camerapos.x * minimapwidth / mapwidth / Terrain.SquareSize,
                                                         camerapos.y * minimapheight / mapheight / Terrain.SquareSize); // 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);
        }
Ejemplo n.º 3
0
        void RenderableAllFeatures_WriteNextFrameEvent(Vector3 camerapos)
        {
            //Console.WriteLine("raf writenextframe");
            GraphicsHelperGl g       = new GraphicsHelperGl();
            FrustrumCulling  culling = FrustrumCulling.GetInstance();

            foreach (FeatureInfo featureinfo in features)
            {
                Vector3 displaypos = new Vector3(featureinfo.x * Terrain.SquareSize, featureinfo.y * Terrain.SquareSize,
                                                 parent.Map[featureinfo.x, featureinfo.y]);
                //  Console.WriteLine("displaypos: " + displaypos );
                if (culling.IsInsideFrustum(displaypos, featureinfo.unit.Radius))
                {
                    //    Console.WriteLine("culling ok");
                    g.PushMatrix();
                    g.Translate(displaypos);
                    featureinfo.unit.Render();
                    g.PopMatrix();
                }
            }
        }
Ejemplo n.º 4
0
        // 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 );
        }
Ejemplo n.º 5
0
        // 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][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))
                            {
                                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();
        }