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

189 lines
4.8 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 <iostream.h>
#include "pvvmud.H"
#include "glrenderer.H"
#include "cliviewpoint.H"
#include "pvvmudclient.H"
COGLRenderer::COGLRenderer(CPvvmudClient * cli) : CRenderer(cli) {
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
{
GLfloat gray[4] = {0.2, 0.2, 0.2, 1.0};
GLfloat white[4] = {1.0, 1.0, 1.0, 1.0};
GLfloat ambient[4] = {0.4, 0.4, 0.4, 1.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, gray);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white);
glEnable(GL_LIGHT0);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient);
}
glEnable( GL_TEXTURE_2D );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
// glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
glDisable(GL_TEXTURE_2D);
}
COGLRenderer::~COGLRenderer(){
}
void COGLRenderer::prepareDraw(CWorldObject * object) {
if (m_mode == GL_SELECT) {
glLoadName(object->getObjectId());
}
}
void COGLRenderer::draw() {
GLfloat light_position[4] = { 0.0, 0.5, 1.0, 0.0 };
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
// glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
glClearColor(0.5,0.5,0.9,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(-90, 1.0, 0.0, 0.0);
CCliViewpoint * viewpoint = getClient()->getManager()->getViewpoint();
viewpoint->transform();
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
getClient()->getManager()->animate();
getClient()->getManager()->draw(this);
glPopMatrix();
if (getConsole()->isVisible()) {
getConsole()->drawText();
}
glFlush();
// Moved to pvvmudclient->pollConsole()
// const char * s = getConsole()->getLine();
// if (s != NULL) {
// getClient()->getManager()->sendMsg(s);
// }
getClient()->getGUI()->reshape(getClient()->getGUI()->getWidth(), getClient()->getGUI()->getHeight());
}
void COGLRenderer::transform(CPosition &pos, CDirection &dir) {
const double * position = pos.getVector();
const double * direction = dir.getVector();
glPushMatrix();
glTranslated(position[0],position[1],position[2]);
glRotated(direction[2],1,0,0);
glRotated(direction[1],0,1,0);
glRotated(direction[0],0,0,1);
}
void COGLRenderer::reshape(int width, int height) {
getClient()->getGUI()->setWidth(width);
getClient()->getGUI()->setHeight(height);
GLfloat aspectViewport = (GLfloat) height / (GLfloat) width;
setAspectViewport(aspectViewport);
glViewport(0, 0, (GLint) width, (GLint) height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-0.1, 0.1, -0.1*aspectViewport, 0.1*aspectViewport, 0.2, 1000.0);
glMatrixMode(GL_MODELVIEW);
}
void COGLRenderer::postDraw() {
glPopMatrix();
}
#define SELECTBUFSIZE 1024
void COGLRenderer::mousePick(int x, int y) {
cdebug << "Mouse pick " << x << " " << y << "\n";
GLuint selectBuf[SELECTBUFSIZE];
GLint hits;
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(SELECTBUFSIZE, selectBuf);
glRenderMode(GL_SELECT);
glInitNames();
glPushName((GLuint)(-1));
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix(x,viewport[3]-y,1.0,1.0,viewport);
glFrustum(-0.1, 0.1, -0.1*m_aspectViewport, 0.1*m_aspectViewport, 0.2, 1000.0);
setMode(GL_SELECT);
draw();
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glFlush();
hits = glRenderMode(GL_RENDER);
getClient()->getInputFunction()->processHits(hits, selectBuf);
}
GLfloat COGLRenderer::getAspectViewport() {
return m_aspectViewport;
}
void COGLRenderer::setAspectViewport(GLfloat av) {
m_aspectViewport = av;
}
void COGLRenderer::setMode(GLenum mode) {
m_mode = mode;
}
void COGLRenderer::dumpScreen(char * texFileName){
GLint viewport[4];
int width,height;
BYTE *data;
CTexture * texture = new CTexture();
glGetIntegerv(GL_VIEWPORT,viewport);
width = viewport[2];
height = viewport[3];
data = (BYTE*)malloc(width*height*4*sizeof(BYTE));
glReadPixels(0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)data);
texture->setTextureMap(new CTextureMap(width,height,data));
texture->save(texFileName);
delete texture;
}