Thread: [Glxtreem-commits] GLXtreem/Source GLXImageList.pas,1.1,1.2 GLXTerrain.pas,1.1,1.2
Brought to you by:
andreaz
|
From: Andreas L. <an...@us...> - 2004-03-29 15:06:43
|
Update of /cvsroot/glxtreem/GLXtreem/Source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7344/Source Modified Files: GLXImageList.pas GLXTerrain.pas Log Message: Improved huge terrain renderer Index: GLXTerrain.pas =================================================================== RCS file: /cvsroot/glxtreem/GLXtreem/Source/GLXTerrain.pas,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** GLXTerrain.pas 28 Mar 2004 20:06:25 -0000 1.1 --- GLXTerrain.pas 29 Mar 2004 14:55:09 -0000 1.2 *************** *** 84,87 **** --- 84,89 ---- end; + Type THeightMapData = Array of Single; + // TGLXImageItem *************** *** 93,97 **** private { Private declarations } ! FData : Array of Single; FWidth : Integer; // The width of the data FHeight: Integer; // The height of the data --- 95,99 ---- private { Private declarations } ! FData : THeightMapData; FWidth : Integer; // The width of the data FHeight: Integer; // The height of the data *************** *** 198,209 **** LoadList : TList; CurrentNode: TGLXTerrainNode; TextureWidth : Integer; TextureHeight: Integer; TextureData : TTextureData24; ! FVertexData : TVertexData; Procedure AssignNode; procedure LoadNode; protected procedure Execute; override; --- 200,216 ---- LoadList : TList; CurrentNode: TGLXTerrainNode; + VertexData : TVertexData; TextureWidth : Integer; TextureHeight: Integer; TextureData : TTextureData24; ! ! HeightmapWidth : Integer; ! HeightmapHeight: Integer; ! HeightmapData : THeightMapData; Procedure AssignNode; procedure LoadNode; + procedure BuildVertexData(Width, Height: Integer); protected procedure Execute; override; *************** *** 453,456 **** --- 460,466 ---- Stream:= TFileStream.Create(CurrentNode.FileName, fmOpenRead); + // Read the texture + //******************** + Stream.Read(TextureWidth , SizeOf(TextureWidth )); Stream.Read(TextureHeight, SizeOf(TextureHeight)); *************** *** 460,463 **** --- 470,494 ---- Stream.Read(TextureData[0], SizeOf(TextureData[0]) * TextureWidth * TextureHeight); + // Read the heightmap + //******************** + + Stream.Read(HeightmapWidth , SizeOf(HeightmapWidth )); + Stream.Read(HeightmapHeight, SizeOf(HeightmapHeight)); + + SetLength(HeightmapData, HeightmapWidth * HeightmapHeight); + + Stream.Read(HeightmapData[0], SizeOf(HeightmapData[0]) * HeightmapWidth * HeightmapHeight); + + Stream.Free; + + // build the vertex data + BuildVertexData(HeightmapWidth, HeightmapHeight); + + // Assign the node + Synchronize(AssignNode); + + { + + Exit; Stream.Read(FVertexData.numVertices , SizeOf(FVertexData.numVertices)); Stream.Read(FVertexData.numNormals , SizeOf(FVertexData.numNormals )); *************** *** 477,488 **** Stream.Free; ! Self.Synchronize(AssignNode); end; //------------------------------------------------------------------------------ procedure TGLXNodeLoader.AssignNode; begin CurrentNode.FTexture :=CreateTexture(TextureWidth, TextureHeight, GL_RGB, Addr(TextureData[0])); ! CurrentNode.FVertexData:=FVertexData; CurrentNode.FLoading :=False; CurrentNode.FLoaded :=True; --- 508,609 ---- Stream.Free; ! Self.Synchronize(AssignNode); } end; + + + + //------------------------------------------------------------------------------ + procedure TGLXNodeLoader.BuildVertexData(Width, Height: Integer); + var SwitchSides: Boolean; + var X, Y : Integer; + + //--------------------------------------------------------------- + Procedure Vertex(X,Y,Z: Single); + begin + Inc(VertexData.numVertices); + SetLength(VertexData.theVertices , VertexData.numVertices ); + + VertexData.theVertices[VertexData.numVertices-1].X:=X; + VertexData.theVertices[VertexData.numVertices-1].Y:=Y; + VertexData.theVertices[VertexData.numVertices-1].Z:=Z; + end; + + //--------------------------------------------------------------- + Procedure TexCoordA(U,V: Single); + begin + Inc(VertexData.numTexCoordsA); + SetLength(VertexData.theTexCoordsA, VertexData.numTexCoordsA); + + VertexData.theTexCoordsA[VertexData.numTexCoordsA-1].X:=U; + VertexData.theTexCoordsA[VertexData.numTexCoordsA-1].Y:=V; + end; + + //--------------------------------------------------------------- + Procedure TexCoordB(U,V: Single); + begin + Inc(VertexData.numTexCoordsB); + SetLength(VertexData.theTexCoordsB, VertexData.numTexCoordsB); + + VertexData.theTexCoordsB[VertexData.numTexCoordsB-1].X:=U; + VertexData.theTexCoordsB[VertexData.numTexCoordsB-1].Y:=V; + end; + + //--------------------------------------------------------------- + function getHeight(X,Y: Integer): Single; + begin + Result:=HeightmapData[X + Y * Width]; + end; + + begin + // Clear all vertexdata + VertexData.numVertices :=0; + VertexData.numNormals :=0; + VertexData.numTexCoordsA:=0; + VertexData.numTexCoordsB:=0; + + SwitchSides:=True; + X:=0; + While X < Width do begin + Y:=0; + While Y < Height do begin + + IF SwitchSides then begin + TexCoordA(1, 0); + TexCoordB((X+1) / Width , Y / Height); + + Vertex(X+1, getHeight(X+1, Y), Y); + + TexCoordA(0, 0); + TexCoordB(X / Width , Y / Height); + + Vertex(X, getHeight(X, Y), Y); + end else begin + + TexCoordA(1, 1); + TexCoordB((X+1) / Width , Y / Height); + + Vertex(X+1, getHeight(X+1, Y), Y); + + + TexCoordA(0, 1); + TexCoordB(X / Width , Y / Height); + + Vertex(X, getHeight(X, Y), Y); + end; + Inc(Y); + + SwitchSides:= not SwitchSides; + end; + Inc(X); + end; + end; + + //------------------------------------------------------------------------------ procedure TGLXNodeLoader.AssignNode; begin CurrentNode.FTexture :=CreateTexture(TextureWidth, TextureHeight, GL_RGB, Addr(TextureData[0])); ! CurrentNode.FVertexData:=VertexData; CurrentNode.FLoading :=False; CurrentNode.FLoaded :=True; *************** *** 615,622 **** //------------------------------------------------------------------------------ procedure TGLXTerrainNode.Load; - var Stream : TFileStream; - var TextureWidth : Integer; - var TextureHeight: Integer; - var TextureData : TTextureData24; begin IF FLoading or FLoaded then Exit; --- 736,739 ---- Index: GLXImageList.pas =================================================================== RCS file: /cvsroot/glxtreem/GLXtreem/Source/GLXImageList.pas,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** GLXImageList.pas 28 Mar 2004 20:06:25 -0000 1.1 --- GLXImageList.pas 29 Mar 2004 14:55:09 -0000 1.2 *************** *** 142,147 **** ! { Renders the image to the screen.<br><br>To be used in orthogonal mode.} ! procedure Draw(X, Y, PatternIndex: Integer); --- 142,153 ---- ! { Draws the image to the screen.<br><br>To be used in orthogonal mode.} ! procedure Draw (X, Y, PatternIndex: Integer); ! { Stretch draw the image to the screen.<br><br>To be used in orthogonal mode.} ! Procedure StrechDraw(X, Y, Width, Height, PatternIndex: Integer); overload; ! { Stretch draw the image to the screen.<br><br>To be used in orthogonal mode.} ! Procedure StrechDraw(Rect : TRect ; PatternIndex: Integer); overload; ! { Draw the image to the screen.<br><br>To be used in orthogonal mode.} ! procedure DrawRotate(X, Y, Width, Height, PatternIndex: Integer; CenterX, CenterY, Angle: Single); overload; *************** *** 550,555 **** --- 556,603 ---- end; + //------------------------------------------------------------------------------ + procedure TGLXImageItem.StrechDraw(Rect: TRect; PatternIndex: Integer); + begin + glPushAttrib(GL_ENABLE_BIT); + glEnable (GL_TEXTURE_2D); + glEnable (GL_BLEND); + glDisable (GL_DEPTH_TEST); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + Bind; + + glBegin(GL_QUADS); + with FPatterns[PatternIndex] do begin + glTexCoord2f(Left , Bottom); glVertex2i(Rect.Left , Rect.Top); + glTexCoord2f(Right, Bottom); glVertex2i(Rect.Right, Rect.Top); + glTexCoord2f(Right, Top ); glVertex2i(Rect.Right, Rect.Bottom); + glTexCoord2f(Left , Top ); glVertex2i(Rect.Left , Rect.Bottom); + end; + glEnd(); + glPopAttrib(); + end; + + //------------------------------------------------------------------------------ + procedure TGLXImageItem.StrechDraw(X, Y, Width, Height, PatternIndex: Integer); + begin + StrechDraw(Rect(X,Y, X + Width, Y + Height), PatternIndex); + end; + //------------------------------------------------------------------------------ + procedure TGLXImageItem.DrawRotate(X, Y, Width, Height, PatternIndex: Integer; CenterX, CenterY, Angle: Single); + var Rect: TRect; + begin + glPushMatrix(); + glLoadIdentity(); + Rect.Left :=-Round( CenterX * Width ); + Rect.Top :=-Round( CenterY * Height); + Rect.Right := Round((1-CenterX) * Width ); + Rect.Bottom:= Round((1-CenterY) * Height); + glTranslatef(X,Y,0); + glRotatef (Angle, 0,0,1); + StrechDraw (Rect,PatternIndex); + glPopMatrix(); + end; + |