Files
2025-03-05 08:37:43 +01:00

220 lines
6.7 KiB
C

/*
* PVVMUD a 3D MUD
* Copyright (C) 1998-1999 Programvareverkstedet (pvv@pvv.org)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include "pvvmud.H"
#include "glgeometry.H"
/*******************************************************************************
*
* Constructor for ObjectGeometry
*
******************************************************************************/
CGLGeometry::CGLGeometry( int objectGeometryId )
:CGeometry( objectGeometryId )
{
}
CGLGeometry::CGLGeometry( int objectGeometryId, int numVertices,
int numNormals, int numTexCoords, int numPolygons )
:CGeometry( objectGeometryId, numVertices, numNormals,
numTexCoords, numPolygons)
{
}
/*******************************************************************************
*
* Destructor for ObjectGeometry
*
******************************************************************************/
CGLGeometry::~CGLGeometry(){
}
/*******************************************************************************
*
* Draw ObjectGeometry
*
******************************************************************************/
int CGLGeometry::draw( CMaterialCache * matCache,
CTextureCache * texCache ){
int pp,ii;
CPolygon * polygon;
CIntArray *normalIndex,*vertexIndex,*texCoordIndex;
int numVertex, numNormal, numTexCoord;
// CNormal * normal;
// CVertex * vertex;
// CTexCoord * texCoord;
CMaterial * mat;
for (pp = 0; pp < this->polygonList->getNumElements(); pp ++){
polygon = this->polygonList->get( pp );
numVertex = polygon->getVertexIList()->getNumElements();
numNormal = polygon->getNormalIList()->getNumElements();
numTexCoord = polygon->getTexCoordIList()->getNumElements();
mat = matCache->get( polygon->getMaterial() );
if (mat == NULL){
mat = matCache->get( 0 );
// cdebug(stderr,"Using default material %i for object %i\n",polygon->getMaterial(),id);
}
if (mat != NULL) mat->exec( texCache );
// else cdebug(stderr,"Failed to find material!\n");
vertexIndex = polygon->getVertexIList();//->getIndex();
normalIndex = polygon->getNormalIList();//->getIndex();
texCoordIndex = polygon->getTexCoordIList();//->getIndex();
//vertex = this->vertexList->getVertex();
//normal = this->normalList->getNormal();
//texCoord = this->texCoordList->getTexCoord();
glBegin( (GLenum)polygon->getType() );
switch ( polygon->getType() ){
case POLYGON_POLYGON:
case POLYGON_QUAD_STRIP:
case POLYGON_TRIANGLE_STRIP:
case POLYGON_TRIANGLE_FAN:
if (numVertex == numNormal) {
// One normal for each vertex
if (numVertex == numTexCoord){
// Texture Coordinates
for (ii = 0; ii < numVertex; ii++){
glNormal3dv(normalList->get(normalIndex->get(ii)));
glTexCoord2dv(texCoordList->get(texCoordIndex->get(ii)));
glVertex3dv(vertexList->get(texCoordIndex->get(ii)));
}
} else {
// No texture coordinates
for (ii = 0; ii < numVertex; ii++){
glNormal3dv(normalList->get(normalIndex->get(ii)));
glVertex3dv(vertexList->get(texCoordIndex->get(ii)));
}
}
} else {
// One normal for object
if (numVertex == numTexCoord){
// Texture Coordinates
glNormal3dv(normalList->get(0));
for (ii = 0; ii < numVertex; ii++){
glTexCoord2dv(texCoordList->get(texCoordIndex->get(ii)));
glVertex3dv(vertexList->get(texCoordIndex->get(ii)));
}
} else {
// No texture coordinates
glNormal3dv(normalList->get(0));
for (ii = 0; ii < numVertex; ii++){
glVertex3dv(vertexList->get(texCoordIndex->get(ii)));
}
}
}
break;
case POLYGON_QUADS:
if (numVertex == numNormal) {
// One normal for each vertex
if (numNormal == numTexCoord){
// Texture Coordinates
for (ii = 0; ii < numVertex; ii++){
glNormal3dv(normalList->get(normalIndex->get(ii)));
glTexCoord2dv(texCoordList->get(normalIndex->get(ii)));
glVertex3dv(vertexList->get(vertexIndex->get(ii)));
}
} else {
for (ii = 0; ii < numVertex; ii++){
glNormal3dv(normalList->get(normalIndex->get(ii)));
glVertex3dv(vertexList->get(vertexIndex->get(ii)));
}
}
} else {
// One normal for each quad
if (numVertex == numTexCoord){
// Texture Coordinates
for (ii = 0; ii < numVertex; ii++){
if (ii%4 == 0) glNormal3dv(normalList->get(normalIndex->get(ii/4)));
glTexCoord2dv(texCoordList->get(texCoordIndex->get(ii)));
glVertex3dv(vertexList->get(vertexIndex->get(ii)));
}
} else {
for (ii = 0; ii < numVertex; ii++){
if (ii%4 == 0) glNormal3dv(normalList->get(normalIndex->get(ii/4)));
glVertex3dv(vertexList->get(vertexIndex->get(ii)));
}
}
}
break;
case POLYGON_TRIANGLES:
if (numVertex == numNormal) {
// One normal for each vertex
if (numVertex == numTexCoord){
// Texture Coordinates
for (ii = 0; ii < numVertex; ii++){
glNormal3dv(normalList->get(normalIndex->get(ii)));
glTexCoord2dv(texCoordList->get(texCoordIndex->get(ii)));
glVertex3dv(vertexList->get(vertexIndex->get(ii)));
}
} else {
for (ii = 0; ii < numVertex; ii++){
glNormal3dv(normalList->get(normalIndex->get(ii)));
glVertex3dv(vertexList->get(vertexIndex->get(ii)));
}
}
} else {
// One normal for each triangle
if (numVertex == numNormal){
// Texture Coordinates
for (ii = 0; ii < numVertex; ii++){
if (ii%3 == 0) glNormal3dv(normalList->get(normalIndex->get(ii/3)));
glTexCoord2dv(texCoordList->get(texCoordIndex->get(ii)));
glVertex3dv(vertexList->get(vertexIndex->get(ii)));
}
} else {
for (ii = 0; ii < numVertex; ii++){
if (ii%3 == 0) glNormal3dv(normalList->get(normalIndex->get(ii/3)));
glVertex3dv(vertexList->get(vertexIndex->get(ii)));
}
}
}
break;
}
glEnd( );
}
if (next != NULL) {
next->draw( matCache, texCache );
}
return TRUE;
}