示例#1
0
        private void Q3ModelViewerForm_Load(object sender, EventArgs e)
        {
            PresentParameters pp = new PresentParameters();

            pp.Windowed               = true;
            pp.SwapEffect             = SwapEffect.Discard;
            pp.EnableAutoDepthStencil = true;
            pp.AutoDepthStencilFormat = DepthFormat.D24X8;
            pp.BackBufferFormat       = Format.A8R8G8B8;

            d3dDevice = new Device(0, DeviceType.Hardware, this,
                                   CreateFlags.HardwareVertexProcessing | CreateFlags.PureDevice, pp);

            d3dDevice.DeviceReset += new EventHandler(d3dDevice_DeviceReset);

            d3dDevice.RenderState.CullMode            = Cull.None;
            d3dDevice.TextureState [0].ColorOperation = TextureOperation.SelectArg1;
            d3dDevice.SamplerState [0].MinFilter      = TextureFilter.Anisotropic;
            d3dDevice.SamplerState [0].MagFilter      = TextureFilter.Anisotropic;
            d3dDevice.SamplerState [0].MipFilter      = TextureFilter.Anisotropic;

            input = new Input(this,
                              Microsoft.DirectX.DirectInput.CooperativeLevelFlags.Background | Microsoft.DirectX.DirectInput.CooperativeLevelFlags.NonExclusive,
                              Microsoft.DirectX.DirectInput.CooperativeLevelFlags.Background | Microsoft.DirectX.DirectInput.CooperativeLevelFlags.NonExclusive);
            camera = new FpsCamera(input,
                                   ( float )d3dDevice.PresentationParameters.BackBufferWidth / d3dDevice.PresentationParameters.BackBufferHeight,
                                   ( float )Math.PI / 4, 1.0f, 5000.0f);
            camera.Position    = new Vector3(0.0f, 20.0f, -20);
            camera.Sensitivity = 5.0f;
            camera.MoveSpeed   = 50.0f;

            textureNotFound = Texture.FromBitmap(d3dDevice, Resources.texture_not_found, Usage.None, Pool.Managed);

            this.LoadModel(@"models/weapons2/rocketl/rocketl.md3");
        }
示例#2
0
文件: Q3Map.cs 项目: vsugrob/Q3Bot
        public int FindVisibleFaces(FpsCamera camera, int [] facesToRender)
        {
            int leaf;
            int visCluster;

            for (int i = 0; i < visibleFaces.Length; i++)
            {
                visibleFaces [i] = 0;
            }

            leaf = FindLeaf(camera.Position);

            visCluster = leafs [leaf].cluster;

            int faceindex;
            int renderindex = 0;

            for (int i = 0; i < leafs.Length; i++)
            {
                if (isClusterVisible(visCluster, leafs [i].cluster))
                {
                    bool vis = camera.ViewFrustum.isBoxInside(leafs [i].mins, leafs [i].maxs);

                    if (vis)
                    {
                        for (int k = 0; k < leafs [i].n_leaffaces; k++)
                        {
                            faceindex = leafFaces [leafs [i].leafface + k];

                            if (visibleFaces [faceindex] == 0)
                            {
                                visibleFaces [faceindex]      = 1;
                                facesToRender [renderindex++] = faceindex;
                            }
                        }
                    }
                }
            }

            facesToRender [renderindex] = -1;

            return(renderindex);
        }
示例#3
0
文件: Renderer.cs 项目: vsugrob/Q3Bot
        public Renderer(Q3Map map, Device d3dDevice)
        {
            bufferLocks [0] = ibLock;
            bufferLocks [1] = vbLock;
            bufferLocks [2] = bezierIbLock;
            bufferLocks [3] = bezierVbLock;

            this.d3dDevice = d3dDevice;
            this.Map       = map;

            input = new Input(d3dDevice.PresentationParameters.DeviceWindow,
                              DI.CooperativeLevelFlags.Background | DI.CooperativeLevelFlags.NonExclusive,
                              DI.CooperativeLevelFlags.Background | DI.CooperativeLevelFlags.NonExclusive);
            int w = d3dDevice.PresentationParameters.BackBufferWidth;
            int h = d3dDevice.PresentationParameters.BackBufferHeight;

            fpsCamera = new FpsCamera(input, ( float )w / ( float )h, 105.0f * ( float )System.Math.PI / 360.0f, 1.0f, 10000.0f);

            List <Dictionary <string, object> > respawns;

            if (map.GroupedEntities.TryGetValue("info_player_deathmatch", out respawns))
            {
                Random rnd     = new Random();
                int    respIdx = rnd.Next(respawns.Count);
                Dictionary <string, object> props = respawns [respIdx];
                Vector3 respPos = ( Vector3 )props ["origin"];
                //float angle = ( float ) props ["angle"];
                fpsCamera.Position = respPos;
            }

            // Create Vertex Buffer
            vb = new VertexBuffer(typeof(Q3VertexFormats.PositionNormalTexturedLightened),
                                  map.Vertices.Count,
                                  d3dDevice,
                                  Usage.WriteOnly,
                                  Q3VertexFormats.PositionNormalTexturedLightened.Format,
                                  Pool.Default);
            vb.Created += new EventHandler(vb_Created);
            vb_Created(this, null);

            // Create Index Buffer
            ib = new IndexBuffer(typeof(int),
                                 map.MeshVertices.Count,
                                 d3dDevice,
                                 Usage.WriteOnly,
                                 Pool.Default);
            ib.Created += new EventHandler(ib_Created);
            ib_Created(this, null);

            // Calculate Bezier Index Buffer size and ViertexBuffer Size
            int numIndex  = 0;
            int numVertex = 0;

            ReadOnlyCollection <Q3BspFace> faces = map.Faces;
            Q3BspFace face;

            for (int i = 0; i < faces.Count; i++)
            {
                face = faces [i];

                if (face.type == Q3BspFaceType.Patch)
                {
                    Q3BspPatch patch = face.patch;

                    if (patch != null)
                    {
                        for (int j = 0; j < patch.size; j++)
                        {
                            numIndex  += patch.bezier [j].indices.Length;
                            numVertex += patch.bezier [j].vertices.Length;
                        }
                    }
                }
            }

            if (numIndex != 0 && numVertex != 0)
            {
                // Create bezier buffers
                bezierIb = new IndexBuffer(typeof(int),
                                           numIndex,
                                           d3dDevice,
                                           Usage.WriteOnly,
                                           Pool.Default);
                bezierIb.Created += new EventHandler(bezierIb_Created);
                bezierIb_Created(this, null);

                bezierVb = new VertexBuffer(typeof(Q3VertexFormats.PositionNormalTexturedLightened),
                                            numVertex,
                                            d3dDevice,
                                            Usage.WriteOnly,
                                            Q3VertexFormats.PositionNormalTexturedLightened.Format,
                                            Pool.Default);
                bezierVb.Created += new EventHandler(bezierVb_Created);
                bezierVb_Created(this, null);
            }

            font = new Font(d3dDevice, new SysDraw.Font("Courier New", fontSize, fontStyle));
        }