예제 #1
0
        void DrawTranslucentPart( ChunkInfo info, ref ChunkPartInfo part )
        {
            api.BindVb( part.VbId );
            bool drawLeft = (drawAllFaces || info.DrawLeft) && part.LeftCount > 0;
            bool drawRight = (drawAllFaces || info.DrawRight) && part.RightCount > 0;
            bool drawBottom = (drawAllFaces || info.DrawBottom) && part.BottomCount > 0;
            bool drawTop = (drawAllFaces || info.DrawTop) && part.TopCount > 0;
            bool drawFront = (drawAllFaces || info.DrawFront) && part.FrontCount > 0;
            bool drawBack = (drawAllFaces || info.DrawBack) && part.BackCount > 0;

            if( drawLeft && drawRight ) {
                api.DrawIndexedVb_TrisT2fC4b( part.LeftCount + part.RightCount, part.LeftIndex );
            } else if( drawLeft ) {
                api.DrawIndexedVb_TrisT2fC4b( part.LeftCount, part.LeftIndex );
            } else if( drawRight ) {
                api.DrawIndexedVb_TrisT2fC4b( part.RightCount, part.RightIndex );
            }

            if( drawFront && drawBack ) {
                api.DrawIndexedVb_TrisT2fC4b( part.FrontCount + part.BackCount, part.FrontIndex );
            } else if( drawFront ) {
                api.DrawIndexedVb_TrisT2fC4b( part.FrontCount, part.FrontIndex );
            } else if( drawBack ) {
                api.DrawIndexedVb_TrisT2fC4b( part.BackCount, part.BackIndex );
            }

            if( drawBottom && drawTop ) {
                api.DrawIndexedVb_TrisT2fC4b( part.BottomCount + part.TopCount, part.BottomIndex );
            } else if( drawBottom ) {
                api.DrawIndexedVb_TrisT2fC4b( part.BottomCount, part.BottomIndex );
            } else if( drawTop ) {
                api.DrawIndexedVb_TrisT2fC4b( part.TopCount, part.TopIndex );
            }
        }
예제 #2
0
        void DrawPart( ChunkInfo info, ref ChunkPartInfo part )
        {
            api.BindVb( part.VbId );
            bool drawLeft = info.DrawLeft && part.LeftCount > 0;
            bool drawRight = info.DrawRight && part.RightCount > 0;
            bool drawBottom = info.DrawBottom && part.BottomCount > 0;
            bool drawTop = info.DrawTop && part.TopCount > 0;
            bool drawFront = info.DrawFront && part.FrontCount > 0;
            bool drawBack = info.DrawBack && part.BackCount > 0;

            if( drawLeft && drawRight ) {
                api.FaceCulling = true;
                api.DrawIndexedVb_TrisT2fC4b( part.LeftCount + part.RightCount, part.LeftIndex );
                api.FaceCulling = false;
            } else if( drawLeft ) {
                api.DrawIndexedVb_TrisT2fC4b( part.LeftCount, part.LeftIndex );
            } else if( drawRight ) {
                api.DrawIndexedVb_TrisT2fC4b( part.RightCount, part.RightIndex );
            }

            if( drawFront && drawBack ) {
                api.FaceCulling = true;
                api.DrawIndexedVb_TrisT2fC4b( part.FrontCount + part.BackCount, part.FrontIndex );
                api.FaceCulling = false;
            } else if( drawFront ) {
                api.DrawIndexedVb_TrisT2fC4b( part.FrontCount, part.FrontIndex );
            } else if( drawBack ) {
                api.DrawIndexedVb_TrisT2fC4b( part.BackCount, part.BackIndex );
            }

            if( drawBottom && drawTop ) {
                api.FaceCulling = true;
                api.DrawIndexedVb_TrisT2fC4b( part.BottomCount + part.TopCount, part.BottomIndex );
                api.FaceCulling = false;
            } else if( drawBottom ) {
                api.DrawIndexedVb_TrisT2fC4b( part.BottomCount, part.BottomIndex );
            } else if( drawTop ) {
                api.DrawIndexedVb_TrisT2fC4b( part.TopCount, part.TopIndex );
            }
        }
예제 #3
0
 void IncrementUsed( ChunkPartInfo[] parts )
 {
     if( parts == null ) return;
     for( int i = 0; i < parts.Length; i++ ) {
         if( parts[i].IndicesCount == 0 ) continue;
         renderer.totalUsed[i]++;
     }
 }
예제 #4
0
        void DrawBigPart( ChunkInfo info, ref ChunkPartInfo part )
        {
            api.BindVb( part.VbId );
            bool drawLeft = info.DrawLeft && part.LeftCount > 0;
            bool drawRight = info.DrawRight && part.RightCount > 0;
            bool drawBottom = info.DrawBottom && part.BottomCount > 0;
            bool drawTop = info.DrawTop && part.TopCount > 0;
            bool drawFront = info.DrawFront && part.FrontCount > 0;
            bool drawBack = info.DrawBack && part.BackCount > 0;

            if( drawLeft && drawRight ) {
                api.FaceCulling = true;
                api.DrawIndexedVb_TrisT2fC4b( part.LeftCount + part.RightCount, part.LeftIndex );
                api.FaceCulling = false;
            } else if( drawLeft ) {
                api.DrawIndexedVb_TrisT2fC4b( part.LeftCount, part.LeftIndex );
            } else if( drawRight ) {
                api.DrawIndexedVb_TrisT2fC4b( part.RightCount, part.RightIndex );
            }

            if( drawFront && drawBack ) {
                api.FaceCulling = true;
                api.DrawIndexedVb_TrisT2fC4b( part.FrontCount + part.BackCount, part.FrontIndex );
                api.FaceCulling = false;
            } else if( drawFront ) {
                api.DrawIndexedVb_TrisT2fC4b( part.FrontCount, part.FrontIndex );
            } else if( drawBack ) {
                api.DrawIndexedVb_TrisT2fC4b( part.BackCount, part.BackIndex );
            }

            // Special handling for top and bottom as these can go over 65536 vertices and we need to adjust the indices in this case.
            if( drawBottom && drawTop ) {
                api.FaceCulling = true;
                if( part.IndicesCount > maxIndices ) {
                    int part1Count = maxIndices - part.BottomIndex;
                    api.DrawIndexedVb_TrisT2fC4b( part1Count, part.BottomIndex );
                    api.DrawIndexedVb_TrisT2fC4b( part.BottomCount + part.TopCount - part1Count, maxVertex, 0 );
                } else {
                    api.DrawIndexedVb_TrisT2fC4b( part.BottomCount + part.TopCount, part.BottomIndex );
                }
                api.FaceCulling = false;
            } else if( drawBottom ) {
                int part1Count;
                if( part.IndicesCount > maxIndices &&
                   ( part1Count = maxIndices - part.BottomIndex ) < part.BottomCount ) {
                    api.DrawIndexedVb_TrisT2fC4b( part1Count, part.BottomIndex );
                    api.DrawIndexedVb_TrisT2fC4b( part.BottomCount - part1Count, maxVertex, 0 );
                } else {
                    api.DrawIndexedVb_TrisT2fC4b( part.BottomCount, part.BottomIndex );
                }
            } else if( drawTop ) {
                int part1Count;
                if( part.IndicesCount > maxIndices &&
                   ( part1Count = maxIndices - part.TopIndex ) < part.TopCount ) {
                    api.DrawIndexedVb_TrisT2fC4b( part1Count, part.TopIndex );
                    api.DrawIndexedVb_TrisT2fC4b( part.TopCount - part1Count, maxVertex, 0 );
                } else {
                    api.DrawIndexedVb_TrisT2fC4b( part.TopCount, part.TopIndex );
                }
            }
        }
예제 #5
0
        void DeleteData( ref ChunkPartInfo[] parts, bool decUsed )
        {
            if( decUsed ) DecrementUsed( parts );
            if( parts == null ) return;

            for( int i = 0; i < parts.Length; i++ )
                api.DeleteVb( parts[i].VbId );
            parts = null;
        }