コード例 #1
0
		//-------------------------------------------------------------------------
		public HeightmapTerrainZonePageSource()
		{
			this.mIsRaw = false;
			this.mFlipTerrainZone = false;
			this.mPage = null;
		}
コード例 #2
0
		//-------------------------------------------------------------------------
		public override void Shutdown()
		{
			if ( null != this.mImage )
			{
				this.mImage.Dispose();
			}
			this.mPage = null;
		}
コード例 #3
0
		//-------------------------------------------------------------------------
		public void ExpirePage( ushort x, ushort y )
		{
			// Single page
			if ( x == 0 && y == 0 && null != this.mPage )
			{
				this.mPage = null;
			}
		}
コード例 #4
0
		//-------------------------------------------------------------------------
		public override void RequestPage( ushort x, ushort y )
		{
			// Only 1 page provided
			if ( x == 0 && y == 0 && this.mPage == null )
			{
				// Convert the image data to unscaled floats
				var totalPageSize = (ulong)( mPageSize*mPageSize );
				var heightData = new Real[totalPageSize];
				byte[] pOrigSrc, pSrc;
				Real[] pDest = heightData;
				Real invScale;
				bool is16bit = false;

				if ( this.mIsRaw )
				{
					pOrigSrc = this.mRawData.GetBuffer();
					is16bit = ( this.mRawBpp == 2 );
				}
				else
				{
					PixelFormat pf = this.mImage.Format;
					if ( pf != PixelFormat.L8 && pf != PixelFormat.L16 )
					{
						throw new AxiomException( "Error: Image is not a grayscale image. HeightmapTerrainZonePageSource.RequestPage" );
					}

					pOrigSrc = this.mImage.Data;
					is16bit = ( pf == PixelFormat.L16 );
				}
				// Determine mapping from fixed to floating
				ulong rowSize;
				if ( is16bit )
				{
					invScale = 1.0f/65535.0f;
					rowSize = (ulong)mPageSize*2;
				}
				else
				{
					invScale = 1.0f/255.0f;
					rowSize = (ulong)mPageSize;
				}
				// Read the data
				pSrc = pOrigSrc;
				//                for ( int j = 0; j < mPageSize; ++j )
				//                {
				//                    if ( mFlipTerrainZone )
				//                    {
				//                        //Array al = Array.CreateInstance(typeof(byte), pSrc.Length);
				//                        //pSrc.CopyTo(al, 0);
				//                        pOrigSrc.CopyTo( pSrc, 0 );
				//                        Array.Reverse( pSrc );
				//                        // Work backwards
				//                        // pSrc = pOrigSrc + (rowSize * (mPageSize - j - 1));
				//                    }
				//                    for ( int i = 0; i < mPageSize; ++i )
				//                    {
				//                        if ( is16bit )
				//                        {
				//#if OGRE_ENDIAN == OGRE_ENDIAN_BIG
				//                            int val = pSrc[ j + i ] << 8;
				//                            val += pSrc[ j + i ];
				//#else
				//                            ushort val = *pSrc++;
				//                            val += *pSrc++ << 8;
				//#endif
				//                            pDest[ j + i ] = new Real( val )*invScale;
				//                        }
				//                        else
				//                        {
				//                            pDest[ j + i ] = new Real( pSrc[ j + i ] )*invScale;
				//                        }
				//                    }
				//                }

				for ( ulong i = 0; i < totalPageSize - 1; i++ )
				{
					float height = pSrc[ i ]*invScale;
					pDest[ i ] = height;
				}

				heightData = pDest;
				// Call listeners
				OnPageConstructed( 0, 0, heightData );
				// Now turn into TerrainZonePage
				// Note that we're using a single material for now
				if ( null != mTerrainZone )
				{
					this.mPage = BuildPage( heightData, mTerrainZone.Options.terrainMaterial );
					mTerrainZone.AttachPage( 0, 0, this.mPage );
				}

				// Free temp store
				// OGRE_FREE(heightData, MEMCATEGORY_RESOURCE);
			}
		}
コード例 #5
0
		//-------------------------------------------------------------------------
		public override void Shutdown()
		{
			if ( null != mImage )
			{
				mImage.Dispose();
			}
			mPage = null;
		}
コード例 #6
0
		//-------------------------------------------------------------------------
		public HeightmapTerrainZonePageSource()
		{
			mIsRaw = false;
			mFlipTerrainZone = false;
			mPage = null;
		}
コード例 #7
0
		public virtual TerrainZonePage BuildPage( Real[] heightData, Material pMaterial )
		{
			string name;

			// Create a TerrainZone Page
			var page = new TerrainZonePage( (ushort)( ( this.mPageSize - 1 )/( this.mTileSize - 1 ) ) );
			// Create a node for all tiles to be attached to
			// Note we sequentially name since page can be attached at different points
			// so page x/z is not appropriate
			int pageIndex = this.mTerrainZone.PageCount;
			name = this.mTerrainZone.Name + "_page[";
			name += pageIndex + "]_Node";
			if ( this.mTerrainZone.mPCZSM.HasSceneNode( name ) )
			{
				page.PageSceneNode = this.mTerrainZone.mPCZSM.GetSceneNode( name );
				// set the home zone of the scene node to the terrainzone
				( (PCZSceneNode)( page.PageSceneNode ) ).AnchorToHomeZone( this.mTerrainZone );
				// EXPERIMENTAL - prevent terrain zone pages from visiting other zones
				( (PCZSceneNode)( page.PageSceneNode ) ).AllowToVisit = false;
			}
			else
			{
				page.PageSceneNode = this.mTerrainZone.TerrainRootNode.CreateChildSceneNode( name );
				// set the home zone of the scene node to the terrainzone
				( (PCZSceneNode)( page.PageSceneNode ) ).AnchorToHomeZone( this.mTerrainZone );
				// EXPERIMENTAL - prevent terrain zone pages from visiting other zones
				( (PCZSceneNode)( page.PageSceneNode ) ).AllowToVisit = false;
			}

			int q = 0;
			for ( int j = 0; j < this.mPageSize - 1; j += ( this.mTileSize - 1 ) )
			{
				int p = 0;

				for ( int i = 0; i < this.mPageSize - 1; i += ( this.mTileSize - 1 ) )
				{
					// Create scene node for the tile and the TerrainZoneRenderable
					name = this.mTerrainZone.Name + "_tile[" + pageIndex + "][" + p + "," + q + "]_Node";

					SceneNode c;
					if ( this.mTerrainZone.mPCZSM.HasSceneNode( name ) )
					{
						c = this.mTerrainZone.mPCZSM.GetSceneNode( name );
						if ( c.Parent != page.PageSceneNode )
						{
							page.PageSceneNode.AddChild( c );
						}
						// set the home zone of the scene node to the terrainzone
						( (PCZSceneNode)c ).AnchorToHomeZone( this.mTerrainZone );
						// EXPERIMENTAL - prevent terrain zone pages from visiting other zones
						( (PCZSceneNode)c ).AllowToVisit = false;
					}
					else
					{
						c = page.PageSceneNode.CreateChildSceneNode( name );
						// set the home zone of the scene node to the terrainzone
						( (PCZSceneNode)c ).AnchorToHomeZone( this.mTerrainZone );
						// EXPERIMENTAL - prevent terrain zone pages from visiting other zones
						( (PCZSceneNode)c ).AllowToVisit = false;
					}

					var tile = new TerrainZoneRenderable( name, this.mTerrainZone );
					// set queue
					tile.RenderQueueGroup = this.mTerrainZone.mPCZSM.WorldGeometryRenderQueueId;
					// Initialise the tile
					tile.Material = pMaterial;
					tile.Initialize( i, j, heightData );
					// Attach it to the page
					page.tiles[ p ][ q ] = tile;
					// Attach it to the node
					c.AttachObject( tile );
					p++;
				}

				q++;
			}

			pageIndex++;

			// calculate neighbours for page
			page.LinkNeighbours();

			if ( this.mTerrainZone.Options.lit )
			{
				q = 0;
				for ( int j = 0; j < this.mPageSize - 1; j += ( this.mTileSize - 1 ) )
				{
					int p = 0;

					for ( int i = 0; i < this.mPageSize - 1; i += ( this.mTileSize - 1 ) )
					{
						page.tiles[ p ][ q ].CalculateNormals();
						p++;
					}
					q++;
				}
			}

			return page;
		}