예제 #1
0
        public static void RenderAllTrees(RenderSystem targetRenderSystem)
        {
            int positionParamIndex;
            if (!initialized)
            {
                return;
            }

            allTreeRenderMeter.Enter();
            if (TerrainManager.Instance.RenderLeaves)
            {
                if (meterRenderingOfTrees)
                {
                    leavesMeter.Enter();
                }

                foreach (TreeGroup group in allGroups)
                {
                    if (group.visibleLeaves.Count != 0)
                    {
                        targetRenderSystem.BeginProfileEvent(ColorEx.White, "Render Leaves : " + group.name);

                        positionParamIndex = group.SetupLeafRenderMaterial();

                        foreach (Tree t in group.visibleLeaves)
                        {
                            group.RenderLeaves(targetRenderSystem, positionParamIndex, t);
                        }
                        // clear the constant from the previous material
                        group.positionParameters.ClearFloatConstant(positionParamIndex);
                    }
                    targetRenderSystem.EndProfileEvent();
                }
                if (meterRenderingOfTrees)
                {
                    leavesMeter.Exit();
                }
            }

            //
            // Render all fronds
            //
            if (meterRenderingOfTrees)
            {
                frondsMeter.Enter();
            }
            foreach (TreeGroup group in allGroups)
            {
                if (group.visibleFronds.Count != 0)
                {

                    targetRenderSystem.BeginProfileEvent(ColorEx.White, "Render Fronds : " + group.name);
                    positionParamIndex = group.SetupFrondRenderMaterial();

                    foreach (Tree t in group.visibleFronds)
                    {
                        group.RenderFrond(targetRenderSystem, positionParamIndex, t);
                    }
                    // clear the constant from the previous material
                    group.positionParameters.ClearFloatConstant(positionParamIndex);

                    targetRenderSystem.EndProfileEvent();
                }
            }
            if (meterRenderingOfTrees)
            {
                frondsMeter.Exit();
            }

            //
            // Render all branches
            //
            if (meterRenderingOfTrees)
            {
                branchesMeter.Enter();
            }
            foreach (TreeGroup group in allGroups)
            {
                if (group.visibleBranches.Count != 0)
                {
                    targetRenderSystem.BeginProfileEvent(ColorEx.White, "Render Branches : " + group.name);
                    positionParamIndex = group.SetupBranchRenderMaterial();
                    foreach (Tree t in group.visibleBranches)
                    {
                        group.RenderBranch(targetRenderSystem, positionParamIndex, t);
                    }
                    // clear the constant from the previous material
                    group.positionParameters.ClearFloatConstant(positionParamIndex);

                    targetRenderSystem.EndProfileEvent();
                }
            }
            if (meterRenderingOfTrees)
            {
                branchesMeter.Exit();
            }

            //
            // now deal with billboards
            //

            if (billboardsDirty)
            {
                if (meterRenderingOfTrees)
                {
                    rebuildBillboardsMeter.Enter();
                }
                // we need to rebuild the billboards
                TreeBillboardRenderer.Instance.StartRebuild();
                foreach (TreeGroup group in allGroups)
                {
                    foreach (Tree t in group.visibleBillboards)
                    {
                        if (t.Billboard0RenderArgs.Active)
                        {
                            TreeBillboardRenderer.Instance.AddBillboard(group.BillboardTextureName, t.Billboard0RenderArgs.AlphaTestValue, t.Billboard0);
                        }
                        if (t.Billboard1RenderArgs.Active)
                        {
                            TreeBillboardRenderer.Instance.AddBillboard(group.BillboardTextureName, t.Billboard1RenderArgs.AlphaTestValue, t.Billboard1);
                        }
                    }
                }
                TreeBillboardRenderer.Instance.FinishRebuild();
                if (meterRenderingOfTrees)
                {
                    rebuildBillboardsMeter.Exit();
                }
                billboardsDirty = false;
            }

            if (meterRenderingOfTrees)
            {
                billboardsMeter.Enter();
            }
            TreeBillboardRenderer.Instance.Render(targetRenderSystem);

            if (meterRenderingOfTrees)
            {
                billboardsMeter.Exit();
            }

            allTreeRenderMeter.Exit();
        }
예제 #2
0
        public void Render(RenderSystem targetRenderSystem)
        {
            // exit early if the entire group is not visible
            if (!visible)
            {
                return;
            }
            int positionParamIndex;

            if (meterRenderingOfTrees)
            {
                renderGroupMeter.Enter();
            }
            targetRenderSystem.BeginProfileEvent(ColorEx.White, "Render Branches : " + name);
            positionParamIndex = SetupBranchRenderMaterial();
            foreach (Tree t in trees)
            {
                if (t.RenderFlag && t.BranchRenderArgs.Active)
                {
                    RenderBranch(targetRenderSystem, positionParamIndex, t);
                }
            }
            // clear the constant from the previous material
            positionParameters.ClearFloatConstant(positionParamIndex);

            targetRenderSystem.EndProfileEvent();

            targetRenderSystem.BeginProfileEvent(ColorEx.White, "Render Fronds : " + name);
            positionParamIndex = SetupFrondRenderMaterial();

            foreach (Tree t in trees)
            {
                if (t.RenderFlag && t.FrondRenderArgs.Active)
                {
                    RenderFrond(targetRenderSystem, positionParamIndex, t);
                }
            }
            // clear the constant from the previous material
            positionParameters.ClearFloatConstant(positionParamIndex);

            targetRenderSystem.EndProfileEvent();

            targetRenderSystem.BeginProfileEvent(ColorEx.White, "Render Leaves : " + name);
            if (TerrainManager.Instance.RenderLeaves)
            {

                positionParamIndex = SetupLeafRenderMaterial();

                foreach (Tree t in trees)
                {
                    if (t.RenderFlag && (t.Leaf0RenderArgs.Active || t.Leaf1RenderArgs.Active))
                    {
                        RenderLeaves(targetRenderSystem, positionParamIndex, t);
                    }
                }
                // clear the constant from the previous material
                positionParameters.ClearFloatConstant(positionParamIndex);
            }
            targetRenderSystem.EndProfileEvent();

            if (meterRenderingOfTrees)
            {
                renderGroupMeter.Exit();
            }
        }