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; } }
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 ); }
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 ); }
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 ); }
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); */ }