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); } }
//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); }
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); }
//------------------------------------- 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! }
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); }