Axiom.Demos.WaterMesh.UpdateMesh C# (CSharp) Method

UpdateMesh() public method

public UpdateMesh ( float timeSinceLastFrame ) : void
timeSinceLastFrame float
return void
		public void UpdateMesh( float timeSinceLastFrame )
		{
			lastFrameTime = timeSinceLastFrame;
			lastTimeStamp += timeSinceLastFrame;

			// do rendering to get ANIMATIONS_PER_SECOND
			while ( lastAnimationTimeStamp <= lastTimeStamp )
			{
				// switch buffer numbers
				curBufNum = ( curBufNum + 1 ) % 3;
				Vector3[ , ] vbuf0 = vBufs[ curBufNum ]; // new frame
				Vector3[ , ] vbuf1 = vBufs[ ( curBufNum + 2 ) % 3 ]; // 1-frame ago
				Vector3[ , ] vbuf2 = vBufs[ ( curBufNum + 1 ) % 3 ]; // 2-frames ago

				// Algorithm from http://collective.valve-erc.com/index.php?go=water_simulation
				double C = PARAM_C; // ripple speed
				double D = PARAM_D; // distance
				double U = PARAM_U; // viscosity
				double T = PARAM_T; // time
				float TERM1 = (float)( ( 4.0f - 8.0f * C * C * T * T / ( D * D ) ) / ( U * T + 2 ) );
				float TERM2 = (float)( ( U * T - 2.0f ) / ( U * T + 2.0f ) );
				float TERM3 = (float)( ( 2.0f * C * C * T * T / ( D * D ) ) / ( U * T + 2 ) );
				for ( int i = 1; i < cmplx; i++ )
				{
					// don't do anything with border values
					for ( int j = 1; j < cmplx; j++ )
					{
						vbuf0[ i, j ].y = TERM1 * vbuf1[ i, j ].y + TERM2 * vbuf2[ i, j ].y +
							TERM3 * ( vbuf1[ i, j - 1 ].y + vbuf1[ i, j + 1 ].y + vbuf1[ i - 1, j ].y + vbuf1[ i + 1, j ].y );
					}
				}

				lastAnimationTimeStamp += ( 1.0f / ANIMATIONS_PER_SECOND );
			}

			vBuf = vBufs[ curBufNum ];

			if ( useFakeNormals )
			{
				CalculateFakeNormals();
			}
			else
			{
				CalculateNormals();
			}

			// set vertex buffer
			posVBuf.WriteData( 0, posVBuf.Size, vBufs[ curBufNum ], true );
		}

Usage Example

Example #1
0
        }         // end ReadUserModeInputs()

        // Process Rapid Inputs (adjust Demo settings)
        //protected override bool RapidUpdateCustom() {
        protected bool RapidUpdateCustom()
        {
            // Update Animations and Water Mesh
            AnimateHead(inputTimer);          // animate the Ogre Head
            ProcessRain();                    // Process the Rain
            waterMesh.UpdateMesh(inputTimer); // Update the Water Mesh (i.e. waves)

            // Press Left-SHIFT to speed up rate of change for adjust demo parameters
            changeSpeed = (int)(inputTimer * 1000);             // round to nearest millisecond, use bit shift for speed
            if (input.IsKeyPressed(KeyCodes.LeftShift))
            {
                changeSpeed *= 10;
            }                                                                              // multiply by 8

            // Adjust Demo settings (mostly WaterMesh attributes) - Head height, and Water Properties
            if (AdjustRange(ref headDepth, KeyCodes.J, KeyCodes.U, 0, 10, 0.0005f))
            {
                UpdateInfoHeadDepth();
            }
            if (AdjustRange(ref waterMesh.PARAM_C, KeyCodes.D2, KeyCodes.D1, 0, 10, 0.0001f))
            {
                UpdateInfoParamC();
            }
            if (AdjustRange(ref waterMesh.PARAM_D, KeyCodes.D4, KeyCodes.D3, 0.1f, 10, 0.0001f))
            {
                UpdateInfoParamD();
            }
            if (AdjustRange(ref waterMesh.PARAM_U, KeyCodes.D6, KeyCodes.D5, -2f, 10, 0.0001f))
            {
                UpdateInfoParamU();
            }
            if (AdjustRange(ref waterMesh.PARAM_T, KeyCodes.D8, KeyCodes.D7, 0, 10, 0.0001f))
            {
                UpdateInfoParamT();
            }
            if (AdjustRange(ref headSpeed, KeyCodes.D0, KeyCodes.D9, 0, 3, 0.0001f))
            {
                UpdateInfoHeadSpeed();
            }
            return(true);
        }