- //Auszüge aus uVector ..
- const
- toRad: Single = 0.0174532925199433; // = PI / 180
- vecX = 0;
- vecY = 1;
- vecZ = 2;
- type
- PVector3F = ^TVector3F;
- TVector3F = Array[0..2] of Single;
- TTorus = Array of Array of TVector3F;
- function Vec3F( const X, Y, Z: Single ): TVector3F;
- begin
- Result[vecX] := X;
- Result[vecY] := Y;
- Result[vecZ] := Z;
- end;
- function NormalizeVec3F( const A: PVector3F ): TVector3F;
- var
- d: Single;
- begin
- d := SQRT( A^[vecX] * A^[vecX] + A^[vecY] * A^[vecY] + A^[vecZ] * A^[vecZ] );
- if d > 0 then
- Result := Vec3F( A^[vecX]/d, A^[vecY]/d, A^[vecZ]/d );
- end;
- function SubVec3F( const A, B: PVector3F ): TVector3F;
- begin
- Result := Vec3F( A^[vecX] - B^[vecX], A^[vecY] - B^[vecY], A^[vecZ] - B^[vecZ] );
- end;
- function CrossProduct3F( const A, B: PVector3F ): TVector3F;
- begin
- Result := Vec3F(
- A^[vecY]*B^[vecZ] - A^[vecZ]*B^[vecY],
- A^[vecZ]*B^[vecX] - A^[vecX]*B^[vecZ],
- A^[vecX]*B^[vecY] - A^[vecY]*B^[vecX]
- );
- end;
- // HERE IT IS :D
- function CreateTorus( const MainCircleEdges, SecCircleEdges: Word;
- const MainCircleRadius, SecCircleRadius: Single): TTorus;
- var
- Main, Sec: TVector3F;
- mTheta, sTheta: Single;
- i, j: Integer;
- begin
- SetLength( Result, MainCircleEdges, SecCircleEdges );
- mTheta := 360/(MainCircleEdges);
- sTheta := 360/(SecCircleEdges);
- for i := 0 to MainCircleEdges-1 do
- for j := 0 to SecCircleEdges-1 do
- Result[i,j] := vec3F(
- (MainCircleRadius+SecCircleRadius*Cos((sTheta*j)*toRad))*cos((mTheta*i)*toRad),
- (MainCircleRadius+SecCircleRadius*Cos((sTheta*j)*toRad))*sin((mTheta*i)*toRad),
- SecCircleRadius*sin((sTheta*j)*toRad) );
- end;
- procedure RenderTorus( const Torus: TTorus );
- var
- iH, jH: Integer;
- i, j: Integer;
- vec1, vec2,
- vec3, norm,
- tmp1, tmp2: TVector3F;
- procedure Draw();
- begin
- tmp1 := SubVec3F( @Vec2, @Vec1 );
- tmp2 := SubVec3F( @Vec3, @Vec1 );
- norm := CrossProduct3F( @tmp1, @tmp2 );
- norm := NormalizeVec3F( @norm );
- glNormal3FV( @norm );
- glVertex3FV( @vec1 );
- glVertex3FV( @vec2 );
- glVertex3FV( @vec3 );
- end;
- begin
- iH := High(Torus)+1;
- jH := High(Torus[0])+1;
- glBegin( gl_Triangles );
- for i := 0 to iH-1 do
- for j := 0 to jH-1 do
- begin
- vec1 := vec3F( Torus[i,j,vecX], Torus[i,j,vecY], Torus[i,j,vecZ] );
- vec2 := vec3F( Torus[(i+1) mod iH,j,vecX], Torus[(i+1) mod iH,j,vecY], Torus[(i+1) mod iH,j,vecZ] );
- vec3 := vec3F( Torus[(i+1) mod iH,(j+1) mod jH,vecX], Torus[(i+1) mod iH,(j+1) mod jH,vecY], Torus[(i+1) mod iH,(j+1) mod jH,vecZ] );
- Draw();
- vec2 := vec3;
- vec3 := vec3F( Torus[i,(j+1) mod jH,vecX], Torus[i,(j+1) mod jH,vecY], Torus[i,(j+1) mod jH,vecZ] );
- Draw();
- end;
- glEnd();
- end;