コード例 #1
0
		public void DrawBranch( ref ZVector3f Position, ref ZPolar3f BranchVector, float TotalBranchLen )
		{
			ZVector3f NewPosition;
			ZPolar3f NewBranchVector;
			ZRect3L Rect;
			ZRect1f Thickness;
			uint nSubDivisions;
			float Angle1, Angle2, NewTotalBranchLen;


			NewTotalBranchLen = TotalBranchLen + BranchVector.Len;
			if( NewTotalBranchLen > MaxBranchLenght ) return;

			NewPosition = Position + BranchVector;
			Rect.Start = Position + 0.5f;
			Rect.End = NewPosition + 0.5f;
			Thickness.Start = ThicknessInterpolator.Interpolate( TotalBranchLen ); Thickness.End = ThicknessInterpolator.Interpolate( NewTotalBranchLen );
			// Thickness.Start = 0.5; Thickness.End = 0.5;
			// printf("S:%lu (%ld,%ld,%ld = %ld,%ld,%ld)\n", nStep, Rect.Start.x, Rect.Start.y, Rect.Start.z, Rect.End.x, Rect.End.y, Rect.End.z );
			if( TotalBranchLen > 0 ) Sector.Draw_safe_VoxelLine( ref Rect, ref Thickness, 72 );
			if( HasFolliage && NewTotalBranchLen > FolliageLenght ) Sector.Draw_safe_Sphere( Rect.End.x, Rect.End.y, Rect.End.z, 10, 70, false );


			if( RandomSubdivs ) nSubDivisions = MinSubDivisionsPerNode + (uint)Random.GetNumber() % MaxSubDivisionsPerNode;
			else nSubDivisions = MinSubDivisionsPerNode;
			if( TotalBranchLen > ( MaxBranchLenght / 10 ) && nSubDivisions > 2 ) nSubDivisions = 2;
			//if (nSubDivisions>2) nSubDivisions = 2;

			nSubDivisions = 1;


			switch( nSubDivisions )
			{

				case 1:
					NewBranchVector = BranchVector;
					NewBranchVector.Len = BrancheLen;
					Angle1 = (float)( Random.GetNumber() ) / 23860929 / 6;
					Angle2 = (float)( Random.GetNumber() ) / 23860929 / 6;
					//NewBranchVector.pitch += Angle1; NewBranchVector.yaw   += Angle2;
					DrawBranch( ref NewPosition, ref NewBranchVector, NewTotalBranchLen );
					break;

				case 2:
				case 3:
				case 4:
				default:
					NewBranchVector = BranchVector;
					NewBranchVector.Len = BrancheLen;
					do
					{
						Angle1 = (float)( Random.GetNumber() ) / 23860929 / 3;
						Angle2 = (float)( Random.GetNumber() ) / 23860929 / 3;
					} while( Math.Abs( Angle1 ) < 15 && Math.Abs( Angle2 ) < 15 );


					NewBranchVector.pitch += Angle1; NewBranchVector.yaw += Angle2;
					DrawBranch( ref NewPosition, ref NewBranchVector, NewTotalBranchLen );
					NewBranchVector = BranchVector;
					NewBranchVector.pitch -= Angle1; NewBranchVector.yaw -= Angle2;
					DrawBranch( ref NewPosition, ref NewBranchVector, NewTotalBranchLen );
					break;
			}


		}
コード例 #2
0
		public void DrawTree( VoxelSector Sector, ref ZVector3f BasePosition )
		{
			ZVector3f Position;
			float[] ThicknessTable = { 2, 1 };

			//printf("-----------------------Draw Tree---------------------------\n");
			//printf("Seed : %lu",Seed);
			Random.Init( Seed );

			ThicknessInterpolator.SetValuesTable( ThicknessTable, 2 );
			ThicknessInterpolator.SetBounds( 0, MaxBranchLenght );

			this.Sector = Sector;
			Position = BasePosition;
			DrawTrunc( ref Position, ref StartingDirection );
			DrawSecundaryTrunc( ref Position, ref StartingDirection, 0 );
		}
コード例 #3
0
		void DrawSecundaryTrunc( ref ZVector3f Position, ref ZPolar3f BranchVector, float TotalBranchLen )
		{
			ZVector3f NewPosition;
			ZPolar3f NewBranchVector;
			ZRect3L Rect;
			ZRect1f Thickness;
			//uint nSubDivisions;
			float Angle1, Angle2, NewTotalBranchLen;


			NewTotalBranchLen = TotalBranchLen + BranchVector.Len;
			if( NewTotalBranchLen > MaxBranchLenght ) return;

			NewPosition = Position + BranchVector;
			Rect.Start = Position + 0.5f;
			Rect.End = NewPosition + 0.5f;
			Thickness.Start = ThicknessInterpolator.Interpolate( TotalBranchLen ); Thickness.End = ThicknessInterpolator.Interpolate( NewTotalBranchLen );
			if( TotalBranchLen > 0 ) Sector.Draw_safe_VoxelLine( ref Rect, ref Thickness, 72 );

			// la branche

			NewBranchVector = BranchVector;
			NewBranchVector.Len = BrancheLen;
			Angle1 = (float)( Random.GetNumber() ) / 23860929 / 3;
			Angle2 = (float)( Random.GetNumber() ) / 23860929 / 3;
			if( Angle1 > 0 ) Angle1 += 15.0f;
			if( Angle1 < 0 ) Angle1 -= 15.0f;
			if( Angle2 > 0 ) Angle2 += 15.0f;
			if( Angle2 < 0 ) Angle2 -= 15.0f;
			NewBranchVector.pitch += Angle1;
			NewBranchVector.yaw += Angle2;

			DrawBranch( ref NewPosition, ref NewBranchVector, NewTotalBranchLen / 2 + 50 );

			// Le tronc central


			NewBranchVector = BranchVector;
			NewBranchVector.Len = SecundaryTruncSegmentLenght;
			DrawSecundaryTrunc( ref NewPosition, ref NewBranchVector, NewTotalBranchLen );


		}
コード例 #4
0
		void DrawTrunc( ref ZVector3f Position, ref ZPolar3f Direction )
		{
			ZRect3L Rect;
			//ZRect1f Thickness;
			uint Number;

			float[] ThickTable = { 5, 4, 3, 3, 2, 2, 2 };

			//Thickness.Start = 5;
			//Thickness.End   = 5;

			Number = (uint)Random.GetNumber();
			TruncHeight = 10 + ( Number / 71582788 );

			Rect.Start = Position + 0.5f;
			float savelen = Direction.Len;
            Direction.Len *= TruncHeight;
			Position = Position + Direction;
			Direction.Len = savelen;
			Rect.End = Position + 0.5f;

			//Sector.Draw_safe_VoxelLine(&Rect,&Thickness,67);
			Sector.Draw_safe_VoxelLine_TickCtl( ref Rect, ThickTable, 7, 72 );

		}
コード例 #5
0
ファイル: VoxelGfx_Tree.cs プロジェクト: d3x0r/Voxelarium
		public void DrawBranch( ref ZVector3f Position, ref ZPolar3f BranchVector, float TotalBranchLen )
		{
			ZVector3f NewPosition;
			ZPolar3f NewBranchVector;
			ZRect3L Rect;
			ZRect1f Thickness;
			uint nSubDivisions;
			float Angle1, Angle2, NewTotalBranchLen;


			NewTotalBranchLen = TotalBranchLen + BranchVector.Len;
			if( NewTotalBranchLen > MaxBranchLenght ) return;

			NewPosition = Position + BranchVector;
			Rect.Start = Position + 0.5f;
			Rect.End = NewPosition + 0.5f;
			Thickness.Start = ThicknessInterpolator.Interpolate( TotalBranchLen ); Thickness.End = ThicknessInterpolator.Interpolate( NewTotalBranchLen );
			// Thickness.Start = 0.5; Thickness.End = 0.5;
			// printf("S:%lu (%ld,%ld,%ld = %ld,%ld,%ld)\n", nStep, Rect.Start.x, Rect.Start.y, Rect.Start.z, Rect.End.x, Rect.End.y, Rect.End.z );
			if( TotalBranchLen > 0 ) Sector.Draw_safe_VoxelLine( ref Rect, ref Thickness, 72 );
			if( HasFolliage && NewTotalBranchLen > FolliageLenght ) Sector.Draw_safe_Sphere( Rect.End.x, Rect.End.y, Rect.End.z, 10.0, 70, false );


			if( RandomSubdivs ) nSubDivisions = (uint)(MinSubDivisionsPerNode + Random.GetNumber() % MaxSubDivisionsPerNode);
			else nSubDivisions = MinSubDivisionsPerNode;
			if( TotalBranchLen > ( MaxBranchLenght / 10.0 ) && nSubDivisions > 2 ) nSubDivisions = 2;
			//if (nSubDivisions>2) nSubDivisions = 2;


			switch( nSubDivisions )
			{

				case 1:
					NewBranchVector = BranchVector;
					NewBranchVector.Len = BrancheLen;
					Angle1 = (float)( Random.GetNumber() ) / 23860929 / 3; Angle2 = (float)( Random.GetNumber() ) / 23860929 / 3;
					NewBranchVector.pitch += Angle1; NewBranchVector.yaw += Angle2;
					DrawBranch( ref NewPosition, ref NewBranchVector, NewTotalBranchLen );
					break;

				case 2:
				case 3:
				case 4:
				default:
					NewBranchVector = BranchVector;
					NewBranchVector.Len = BrancheLen;
					do
					{
						Angle1 = (float)( Random.GetNumber() ) / 23860929 / 3; Angle2 = (float)( Random.GetNumber() ) / 23860929 / 3;
					} while( Math.Abs( Angle1 ) < 15.0 && Math.Abs( Angle2 ) < 15.0 );


					NewBranchVector.pitch += Angle1; NewBranchVector.yaw += Angle2;
					DrawBranch( ref NewPosition, ref NewBranchVector, NewTotalBranchLen );
					NewBranchVector = BranchVector;
					NewBranchVector.pitch -= Angle1; NewBranchVector.yaw -= Angle2;
					DrawBranch( ref NewPosition, ref NewBranchVector, NewTotalBranchLen );
					break;
				case 2536:
					/*
						 for (i=0;i<nSubDivisions;i++)
						 {
						   NewBranchVector = *BranchVector;
						   NewBranchVector.Len = BrancheLen;

						   Angle1 = (double) ((Long)Random.GetNumber()) / 23860929 / 3;
						   Angle2 = (double) ((Long)Random.GetNumber()) / 23860929 / 3;
						   if (Angle1>0 && Angle1<30) Angle1 = 30;
						   if (Angle1<0 && Angle1>-30)Angle1 = -30;
						   if (Angle2>0 && Angle2<30) Angle2 = 30;
						   if (Angle2<0 && Angle2>-30)Angle2 = -30;




						   NewBranchVector.pitch += Angle1;
						   NewBranchVector.yaw   += Angle2;
						   // NewBranchVector.pitch -= Angle1;
						   // NewBranchVector.yaw   -= Angle2;

						   DrawBranch(&NewPosition, &NewBranchVector, NewTotalBranchLen);
						 }
						 */
					break;
			}


			// Tronc central qui continue.
			/*
				  NewBranchVector = *BranchVector;
				  NewBranchVector.Len = BrancheLen * 2.0;
				  DrawBranch(&NewPosition, &NewBranchVector, NewTotalBranchLen);
			*/
		}