Exemplo n.º 1
0
        public void apply(List <VertIndexWeight> verts, float intesinty, bool alternate)
        {
            //CLM DEBUGGING
            //  return;


            //   FoliageManager.setSelectedBladeToGrid(0, 0, alternate , false);
            //   FoliageManager.setSelectedBladeToGrid(16, 16, alternate, false);
            //   FoliageManager.setSelectedBladeToGrid(20, 20, alternate, false);
            //   return;


            // Go through points and adjust accordingly.
            for (int i = 0; i < verts.Count; i++)
            {
                int   index  = verts[i].index;
                float weight = verts[i].weight * 0.25f;

                double rnd = rand.NextDouble();
                //use our 'weight' as a randomization factor..
                if (rnd > (double)weight)
                {
                    continue;
                }

                int x = index / TerrainGlobals.getTerrain().getNumZVerts();
                int z = index % TerrainGlobals.getTerrain().getNumZVerts();

                FoliageManager.setSelectedBladeToGrid(x, z, alternate,
                                                      TerrainGlobals.getEditor().getMode() == BTerrainEditor.eEditorMode.cModeFoliageErase);
            }
        }
Exemplo n.º 2
0
        //set queary
        public static int newSet(string setFilename)
        {
            int setIndex = FoliageManager.giveIndexOfSet(setFilename);

            if (setIndex == -1)
            {
                FoliageSet fs = new FoliageSet();
                fs.loadSet(setFilename + ".xml");
                mFoliageSets.Add(fs);
                setIndex = mFoliageSets.Count - 1;
            }
            return(setIndex);
        }
Exemplo n.º 3
0
        public static void eraseSetFromMap(int setIndex)
        {
            long            id;
            FoliageVertData maskValue;

            mVertData.ResetIterator();
            while (mVertData.MoveNext(out id, out maskValue))
            {
                if (maskValue.compare(cEmptyVertData))
                {
                    continue;
                }
                if (FoliageManager.giveIndexOfSet(maskValue.mFoliageSetName) == setIndex)
                {
                    mVertData.SetValue(id, cEmptyVertData);
                }
            }
            clearAllChunkVBs();
            mFoliageSets.RemoveAt(setIndex);
        }
Exemplo n.º 4
0
        //-------------------------------------

        public void createRenderVBs()
        {
            destroyRenderVBs();
            int width = TerrainGlobals.getTerrain().getNumXVerts();

            for (int setI = 0; setI < mSetsUsed.Count; setI++)
            {
                List <int> validIndexes      = new List <int>();
                List <int> validBladeIndexes = new List <int>();
                for (int x = 0; x < BTerrainQuadNode.cMaxWidth; x++)
                {
                    for (int z = 0; z < BTerrainQuadNode.cMaxWidth; z++)
                    {
                        int             index = (x + mOwnerNodeDesc.mMinXVert) + width * (z + mOwnerNodeDesc.mMinZVert);
                        FoliageVertData fvd   = FoliageManager.mVertData.GetValue(index);
                        if (fvd.compare(FoliageManager.cEmptyVertData))
                        {
                            continue;
                        }

                        if (FoliageManager.giveIndexOfSet(fvd.mFoliageSetName) == FoliageManager.giveIndexOfSet(mSetsUsed[setI]))
                        {
                            int localIndex = x + FoliageManager.cNumXBladesPerChunk * z;
                            validIndexes.Add(localIndex);
                            validBladeIndexes.Add(fvd.mFoliageSetBladeIndex);
                        }
                    }
                }

                if (validIndexes.Count == 0)
                {
                    //remove this set from us
                    mSetsUsed.RemoveAt(setI);
                    setI--;
                    continue;
                }

                //now that we have our valid indexes
                int numVertsPerBlade = 10;
                int totalNumVerts    = (validIndexes.Count * numVertsPerBlade);

                //VERTEX BUFFERS
                mSetVBs.Add(new VertexBuffer(typeof(VertexTypes.Pos), totalNumVerts, BRenderDevice.getDevice(), Usage.WriteOnly, VertexTypes.Pos.FVF_Flags, Pool.Default));

                GraphicsStream gStream = mSetVBs[setI].Lock(0, 0, LockFlags.None);
                unsafe
                {
                    VertexTypes.Pos *verts = (VertexTypes.Pos *)gStream.InternalDataPointer;

                    mSetVertCount.Add(0);
                    //ADD OTHER STRIPS
                    for (int i = 0; i < validIndexes.Count; i++)
                    {
                        int vC = mSetVertCount[setI];

                        int startInd = validIndexes[i] * numVertsPerBlade;
                        //add 10 verts with:  index (x*width+z), bladeIndex, 0, 0
                        for (int k = 0; k < numVertsPerBlade; k++)
                        {
                            verts[vC].x = startInd + k;
                            verts[vC].y = validBladeIndexes[i];

                            vC++;
                        }

                        mSetVertCount[setI] += numVertsPerBlade;
                    }
                }

                gStream.Close();
                mSetVBs[setI].Unlock();


                //INDEX BUFFERS (UGG WE SHOULD BE USING TRI-STRIPS!!!)
                int numInds = (validIndexes.Count * ((numVertsPerBlade - 2) * 3));
                mSetIBs.Add(new IndexBuffer(typeof(short), numInds, BRenderDevice.getDevice(), Usage.WriteOnly, Pool.Default));

                gStream = mSetIBs[setI].Lock(0, 0, LockFlags.None);
                unsafe
                {
                    short *inds = (short *)gStream.InternalDataPointer;

                    mSetPolyCount.Add(0);

                    //add first strip
                    short startInd = (short)(0);
                    int   vC       = 0;

                    for (int i = 0; i < validIndexes.Count; i++)
                    {
                        startInd = (short)(i * (numVertsPerBlade));

                        short pC = (short)((numVertsPerBlade - 2) >> 1);
                        short sI = 0;
                        for (int k = 0; k < pC; k++)
                        {
                            inds[vC++] = (short)(startInd + sI + 0);
                            inds[vC++] = (short)(startInd + sI + 1);
                            inds[vC++] = (short)(startInd + sI + 2);

                            inds[vC++] = (short)(startInd + sI + 1);
                            inds[vC++] = (short)(startInd + sI + 2);
                            inds[vC++] = (short)(startInd + sI + 3);
                            sI        += 2;
                        }


                        mSetPolyCount[setI] += (numVertsPerBlade - 2);
                    }
                }
                gStream.Close();
                mSetIBs[setI].Unlock();
            }

            //COOL!
        }
Exemplo n.º 5
0
        public bool render()
        {
            if (mSetVBs.Count == 0)
            {
                createRenderVBs();
                if (mSetVBs.Count == 0)
                {
                    return(false);
                }
            }

            BRenderDevice.getDevice().VertexDeclaration = VertexTypes.Pos.vertDecl;

            //my shader is started in the parent FoliageManager class..

            BTerrainQuadNode qn = TerrainGlobals.getTerrain().getQuadNodeLeafArray()[mOwnerQNIndex];

            //find our visual handle index
            //CLM the skirts f**k this up.. just find the highest LOD that's valid...
            BTerrainVisualDataHandle vdh = null;

            for (int i = 0; i < (int)Terrain.BTerrainVisual.eLODLevel.cLODCount; i++)
            {
                if (qn.mVisualDataIndxPerLOD[i] != -1)
                {
                    vdh = TerrainGlobals.getVisual().getVisualHandle(qn.mVisualDataIndxPerLOD[i]);
                    break;
                }
            }

            if (vdh == null)
            {
                return(false);
            }

            //bind my QN positions texture
            FoliageManager.mFoliageGPUShader.mShader.SetValue(FoliageManager.mTerrainQNPosTexture, vdh.mHandle.mPositionsTexture);

            Vector4 QnData = new Vector4((BTerrainQuadNode.getMaxNodeWidth() >> vdh.LOD), TerrainGlobals.getTerrain().getTileScale(), mOwnerNodeDesc.mMinXVert, mOwnerNodeDesc.mMinZVert);

            FoliageManager.mFoliageGPUShader.mShader.SetValue(FoliageManager.mTerrainQNData, QnData);


            for (int setI = 0; setI < mSetsUsed.Count; setI++)
            {
                FoliageSet set = FoliageManager.giveSet(mSetsUsed[setI]);

                float rcpBladeImgWidth = 1.0f / (float)set.mNumBlades;
                FoliageManager.mFoliageGPUShader.mShader.SetValue(FoliageManager.mSetRCPBladeTexWidth, rcpBladeImgWidth);


                FoliageManager.mFoliageGPUShader.mShader.SetValue(FoliageManager.mSetAlbedoTexture,
                                                                  set.mD3DAlbedoTexture == null?
                                                                  BRenderDevice.getTextureManager().getDefaultTexture(TextureManager.eDefaultTextures.cDefTex_Red):
                                                                  set.mD3DAlbedoTexture.mTexture);

                FoliageManager.mFoliageGPUShader.mShader.SetValue(FoliageManager.mSetOpacityTexture,
                                                                  set.mD3DOpacityTexture == null ?
                                                                  BRenderDevice.getTextureManager().getDefaultTexture(TextureManager.eDefaultTextures.cDefTex_White) :
                                                                  set.mD3DOpacityTexture.mTexture);


                FoliageManager.mFoliageGPUShader.mShader.SetValue(FoliageManager.mSetPositionsTexture, set.mD3DPositionsTexture);
                FoliageManager.mFoliageGPUShader.mShader.SetValue(FoliageManager.mSetUVsTexture, set.mD3DUVsTexture);

                //DRAW US FOOL!
                BRenderDevice.getDevice().SetStreamSource(0, mSetVBs[setI], 0);
                BRenderDevice.getDevice().Indices = mSetIBs[setI];

                FoliageManager.mFoliageGPUShader.mShader.CommitChanges();
                BRenderDevice.getDevice().DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, mSetVertCount[setI], 0, mSetPolyCount[setI]);
            }

            return(true);
        }