[Scummvm-cvs-logs] CVS: residual TODO,1.46,1.47 driver.h,1.2,1.3 driver_gl.cpp,1.28,1.29 driver_gl.h,1.15,1.16 driver_tinygl.cpp,1.2,1.3 driver_tinygl.h,1.2,1.3 scene.cpp,1.40,1.41 scene.h,1.24,1.25
Pawel Kolodziejski
aquadran at users.sourceforge.net
Tue Jan 18 09:26:16 CET 2005
- Previous message: [Scummvm-cvs-logs] CVS: scummvm/saga actor.h,1.49,1.50 interface.cpp,1.67,1.68 interface.h,1.33,1.34 objectmap.cpp,1.35,1.36 objectmap.h,1.19,1.20 saga.cpp,1.94,1.95 saga.h,1.78,1.79 scene.h,1.44,1.45 script.cpp,1.50,1.51
- Next message: [Scummvm-cvs-logs] CVS: residual driver_gl.cpp,1.29,1.30
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /cvsroot/scummvm/residual
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25969
Modified Files:
TODO driver.h driver_gl.cpp driver_gl.h driver_tinygl.cpp
driver_tinygl.h scene.cpp scene.h
Log Message:
added experimental light support,
texture mapping with light shading is not implemented in TynyGL (yet), to enable shading without texture mapping look into beginning of TinyGL driver
Index: TODO
===================================================================
RCS file: /cvsroot/scummvm/residual/TODO,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- TODO 14 Jan 2005 21:00:55 -0000 1.46
+++ TODO 18 Jan 2005 17:24:52 -0000 1.47
@@ -5,10 +5,11 @@
* Cross platform GUI for debug input dialogs and path selection (ender)
* Improved walk box code (frob)
* Implement FadeInChore and FadeOutChore (frob)
+ * Implement texture mapping with light shading in TinyGL (aquadran)
Unassigned (help wanted):
* Add configure script (Custom ala main ScummVM, NOT autoconf)
- * Add OpenGL lighting (ender, possibly)
+ * Proper light setup in drivers
* Finish Save/Load support for rest of Engine (Lua and iMuse done)
* Implement 2D primitives
* Proper vsscanf implementation in textsplit.cpp for platforms without it (MSVC, etc)
Index: driver.h
===================================================================
RCS file: /cvsroot/scummvm/residual/driver.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- driver.h 12 Jan 2005 20:56:08 -0000 1.2
+++ driver.h 18 Jan 2005 17:24:53 -0000 1.3
@@ -22,8 +22,11 @@
#include "vector3d.h"
#include "color.h"
#include "model.h"
+#include "scene.h"
#include "colormap.h"
-#include "bitmap.h"
+
+class Material;
+class Bitmap;
class Driver {
public:
@@ -44,6 +47,9 @@
virtual void drawHierachyNode(const Model::HierNode *node) = 0;
virtual void drawModelFace(const Model::Face *face, float *vertices, float *vertNormals, float *textureVerts) = 0;
+ virtual void disableLights() = 0;
+ virtual void setupLight(Scene::Light *light, int lightId) = 0;
+
virtual void createMaterial(Material *material, const char *data, const CMap *cmap) = 0;
virtual void selectMaterial(const Material *material) = 0;
virtual void destroyMaterial(Material *material) = 0;
Index: driver_gl.cpp
===================================================================
RCS file: /cvsroot/scummvm/residual/driver_gl.cpp,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- driver_gl.cpp 12 Jan 2005 23:26:04 -0000 1.28
+++ driver_gl.cpp 18 Jan 2005 17:24:55 -0000 1.29
@@ -100,8 +100,8 @@
for (int i = 0; i < face->_numVertices; i++) {
glNormal3fv(vertNormals + 3 * face->_vertices[i]);
- if (face->_texVertices != NULL)
- glTexCoord2fv(textureVerts + 2 * face->_texVertices[i]);
+// if (face->_texVertices != NULL)
+// glTexCoord2fv(textureVerts + 2 * face->_texVertices[i]);
glVertex3fv(vertices + 3 * face->_vertices[i]);
}
@@ -137,6 +137,56 @@
node->_sibling->draw();
}
+void DriverGL::disableLights() {
+ glDisable(GL_LIGHTING);
+}
+
+void DriverGL::setupLight(Scene::Light *light, int lightId) {
+ glEnable(GL_LIGHTING);
+ float ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
+ float diffuseLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
+ float specularLight[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ float lightPos[] = { 0.0f, 0.0f, 0.0f, 0.0f };
+ float lightDir[] = { 0.0f, 0.0f, 0.0f, 0.0f };
+ lightPos[0] = light->_pos.x();
+ lightPos[1] = light->_pos.y();
+ lightPos[2] = light->_pos.z();
+ ambientLight[0] = (float)light->_color.red() / 256.0f;
+ ambientLight[1] = (float)light->_color.blue() / 256.0f;
+ ambientLight[2] = (float)light->_color.green() / 256.0f;
+// diffuseLight[0] = (float)light->_intensity;
+// diffuseLight[1] = (float)light->_intensity;
+// diffuseLight[2] = (float)light->_intensity;
+
+ if (strcmp(light->_type.c_str(), "omni") == 0) {
+// glLightfv(GL_LIGHT0 + lightId, GL_AMBIENT, ambientLight);
+ glLightfv(GL_LIGHT0 + lightId, GL_DIFFUSE, diffuseLight);
+ glLightfv(GL_LIGHT0 + lightId, GL_SPECULAR, specularLight);
+ glLightfv(GL_LIGHT0 + lightId, GL_POSITION, lightPos);
+// glLightf(GL_LIGHT0 + lightId, GL_SPOT_CUTOFF, 1.8f);
+// glLightf(GL_LIGHT0 + lightId, GL_LINEAR_ATTENUATION, light->_intensity);
+ glEnable(GL_LIGHT0 + lightId);
+ } else if (strcmp(light->_type.c_str(), "direct") == 0) {
+ lightDir[0] = light->_dir.x();
+ lightDir[1] = light->_dir.y();
+ lightDir[2] = light->_dir.z();
+ lightDir[3] = 0.0f;
+// glLightfv(GL_LIGHT0 + lightId, GL_AMBIENT, ambientLight);
+ glLightfv(GL_LIGHT0 + lightId, GL_DIFFUSE, diffuseLight);
+ glLightfv(GL_LIGHT0 + lightId, GL_SPECULAR, specularLight);
+ glLightfv(GL_LIGHT0 + lightId, GL_POSITION, lightPos);
+ glLightfv(GL_LIGHT0 + lightId, GL_SPOT_DIRECTION, lightDir);
+// glLightf(GL_LIGHT0 + lightId, GL_SPOT_CUTOFF, 1.8f);
+// glLightf(GL_LIGHT0 + lightId, GL_SPOT_EXPONENT, 2.0f);
+// glLightf(GL_LIGHT0 + lightId, GL_LINEAR_ATTENUATION, light->_intensity);
+ glEnable(GL_LIGHT0 + lightId);
+ } else {
+ error("Scene::setupLights() Unknown type of light: %s", light->_type);
+ }
+}
+
+#define BITMAP_TEXTURE_SIZE 256
+
void DriverGL::createBitmap(Bitmap *bitmap) {
GLuint *textures;
if (bitmap->_format == 1) {
@@ -313,7 +363,6 @@
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, material->_width, material->_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texdata);
data += 24;
}
@@ -321,6 +370,7 @@
}
void DriverGL::selectMaterial(const Material *material) {
+return;
GLuint *textures;
textures = (GLuint *)material->_textures;
glBindTexture(GL_TEXTURE_2D, textures[material->_currImage]);
Index: driver_gl.h
===================================================================
RCS file: /cvsroot/scummvm/residual/driver_gl.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- driver_gl.h 12 Jan 2005 18:06:43 -0000 1.15
+++ driver_gl.h 18 Jan 2005 17:25:04 -0000 1.16
@@ -29,8 +29,6 @@
#include <SDL.h>
#include <SDL_opengl.h>
-#define BITMAP_TEXTURE_SIZE 256
-
class DriverGL : public Driver {
public:
DriverGL(int screenW, int screenH, int screenBPP);
@@ -49,6 +47,9 @@
void drawHierachyNode(const Model::HierNode *node);
void drawModelFace(const Model::Face *face, float *vertices, float *vertNormals, float *textureVerts);
+ void disableLights();
+ void setupLight(Scene::Light *light, int lightId);
+
void createMaterial(Material *material, const char *data, const CMap *cmap);
void selectMaterial(const Material *material);
void destroyMaterial(Material *material);
Index: driver_tinygl.cpp
===================================================================
RCS file: /cvsroot/scummvm/residual/driver_tinygl.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- driver_tinygl.cpp 12 Jan 2005 23:26:04 -0000 1.2
+++ driver_tinygl.cpp 18 Jan 2005 17:25:04 -0000 1.3
@@ -23,6 +23,9 @@
#include "tinygl/gl.h"
#include "tinygl/zgl.h"
+// enable define below to turn on lights without texture mapping,
+// TinyGL doesn't support texture mapping with lights currently
+//#define TURN_ON_LIGTHS_WITHOUT_TEXTURES
// func below is from Mesa glu sources
static void lookAt(TGLfloat eyex, TGLfloat eyey, TGLfloat eyez, TGLfloat centerx,
@@ -145,7 +148,9 @@
}
void DriverTinyGL::startActorDraw(Vector3d pos, float yaw, float pitch, float roll) {
+#ifndef TURN_ON_LIGTHS_WITHOUT_TEXTURES
tglEnable(TGL_TEXTURE_2D);
+#endif
tglMatrixMode(TGL_MODELVIEW);
tglPushMatrix();
tglTranslatef(pos.x(), pos.y(), pos.z());
@@ -207,6 +212,54 @@
node->_sibling->draw();
}
+void DriverTinyGL::disableLights() {
+ tglDisable(TGL_LIGHTING);
+}
+
+void DriverTinyGL::setupLight(Scene::Light *light, int lightId) {
+ tglEnable(TGL_LIGHTING);
+ float ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
+ float diffuseLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
+ float specularLight[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ float lightPos[] = { 0.0f, 0.0f, 0.0f, 0.0f };
+ float lightDir[] = { 0.0f, 0.0f, 0.0f, 0.0f };
+ lightPos[0] = light->_pos.x();
+ lightPos[1] = light->_pos.y();
+ lightPos[2] = light->_pos.z();
+ ambientLight[0] = (float)light->_color.red() / 256.0f;
+ ambientLight[1] = (float)light->_color.blue() / 256.0f;
+ ambientLight[2] = (float)light->_color.green() / 256.0f;
+// diffuseLight[0] = (float)light->_intensity;
+// diffuseLight[1] = (float)light->_intensity;
+// diffuseLight[2] = (float)light->_intensity;
+
+ if (strcmp(light->_type.c_str(), "omni") == 0) {
+// tglLightfv(TGL_LIGHT0 + lightId, TGL_AMBIENT, ambientLight);
+ tglLightfv(TGL_LIGHT0 + lightId, TGL_DIFFUSE, diffuseLight);
+ tglLightfv(TGL_LIGHT0 + lightId, TGL_SPECULAR, specularLight);
+ tglLightfv(TGL_LIGHT0 + lightId, TGL_POSITION, lightPos);
+// tglLightf(TGL_LIGHT0 + lightId, TGL_SPOT_CUTOFF, 1.8f);
+// tglLightf(TGL_LIGHT0 + lightId, TGL_LINEAR_ATTENUATION, light->_intensity);
+ tglEnable(TGL_LIGHT0 + lightId);
+ } else if (strcmp(light->_type.c_str(), "direct") == 0) {
+ lightDir[0] = light->_dir.x();
+ lightDir[1] = light->_dir.y();
+ lightDir[2] = light->_dir.z();
+ lightDir[3] = 0.0f;
+// tglLightfv(TGL_LIGHT0 + lightId, TGL_AMBIENT, ambientLight);
+ tglLightfv(TGL_LIGHT0 + lightId, TGL_DIFFUSE, diffuseLight);
+ tglLightfv(TGL_LIGHT0 + lightId, TGL_SPECULAR, specularLight);
+ tglLightfv(TGL_LIGHT0 + lightId, TGL_POSITION, lightPos);
+ tglLightfv(TGL_LIGHT0 + lightId, TGL_SPOT_DIRECTION, lightDir);
+// tglLightf(TGL_LIGHT0 + lightId, TGL_SPOT_CUTOFF, 1.8f);
+// tglLightf(TGL_LIGHT0 + lightId, TGL_SPOT_EXPONENT, 2.0f);
+// tglLightf(TGL_LIGHT0 + lightId, TGL_LINEAR_ATTENUATION, light->_intensity);
+ tglEnable(TGL_LIGHT0 + lightId);
+ } else {
+ error("Scene::setupLights() Unknown type of light: %s", light->_type);
+ }
+}
+
void DriverTinyGL::createBitmap(Bitmap *bitmap) {
if (bitmap->_format == 1) {
} else {
@@ -277,7 +330,6 @@
tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_WRAP_T, TGL_REPEAT);
tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MAG_FILTER, TGL_LINEAR);
tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MIN_FILTER, TGL_LINEAR);
- tglTexEnvi(TGL_TEXTURE_ENV, TGL_TEXTURE_ENV_MODE, /*TGL_REPLACE*/ TGL_DECAL);
tglTexImage2D(TGL_TEXTURE_2D, 0, 3, material->_width, material->_height, 0, TGL_RGB, TGL_UNSIGNED_BYTE, texdata);
data += 24;
}
@@ -285,6 +337,9 @@
}
void DriverTinyGL::selectMaterial(const Material *material) {
+#ifdef TURN_ON_LIGTHS_WITHOUT_TEXTURES
+return;
+#endif
TGLuint *textures = (TGLuint *)material->_textures;
tglBindTexture(TGL_TEXTURE_2D, textures[material->_currImage]);
tglPushMatrix();
Index: driver_tinygl.h
===================================================================
RCS file: /cvsroot/scummvm/residual/driver_tinygl.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- driver_tinygl.h 12 Jan 2005 23:26:04 -0000 1.2
+++ driver_tinygl.h 18 Jan 2005 17:25:04 -0000 1.3
@@ -31,8 +31,6 @@
#include <SDL.h>
-#define BITMAP_TEXTURE_SIZE 256
-
class DriverTinyGL : public Driver {
public:
DriverTinyGL(int screenW, int screenH, int screenBPP);
@@ -52,6 +50,9 @@
void drawHierachyNode(const Model::HierNode *node);
void drawModelFace(const Model::Face *face, float *vertices, float *vertNormals, float *textureVerts);
+ void disableLights();
+ void setupLight(Scene::Light *light, int lightId);
+
void createMaterial(Material *material, const char *data, const CMap *cmap);
void selectMaterial(const Material *material);
void destroyMaterial(Material *material);
Index: scene.cpp
===================================================================
RCS file: /cvsroot/scummvm/residual/scene.cpp,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- scene.cpp 15 Jan 2005 17:10:32 -0000 1.40
+++ scene.cpp 18 Jan 2005 17:25:04 -0000 1.41
@@ -28,7 +28,6 @@
#include "imuse/imuse.h"
#include <SDL.h>
-#include "tinygl/gl.h"
#include <cmath>
Scene::Scene(const char *name, const char *buf, int len) :
@@ -171,57 +170,15 @@
}
void Scene::setupLights() {
-/* glMatrixMode(GL_MODELVIEW);
if (!_enableLights) {
- glDisable(GL_LIGHTING);
+ g_driver->disableLights();
return;
}
- glEnable(GL_LIGHTING);
-
for (int i = 0; i < _numLights; i++) {
- assert(i < GL_MAX_LIGHTS);
- Light *light = &_lights[i];
- GLfloat ambientLight[] = { 0.0f, 0.0f, 0.0f, 1.0f };
- GLfloat diffuseLight[] = { 0.0f, 0.0f, 0.0f, 0.0f };
- GLfloat specularLight[] = { 0.0f, 0.0f, 0.0f, 1.0f };
- GLfloat lightPos[4];
- GLfloat lightDir[4];
- lightPos[0] = light->_pos._coords[0];
- lightPos[1] = light->_pos._coords[1];
- lightPos[2] = light->_pos._coords[2];
- lightPos[3] = 1.0f;
- diffuseLight[0] = light->_color.red / 256.0f;
- diffuseLight[1] = light->_color.blue / 256.0f;
- diffuseLight[2] = light->_color.green / 256.0f;
- diffuseLight[3] = 1.0f;
-
- if (strcmp(light->_type.c_str(), "omni") == 0) {
-// glLightfv(GL_LIGHT0 + i, GL_AMBIENT, ambientLight);
- glLightfv(GL_LIGHT0 + i, GL_DIFFUSE, diffuseLight);
- glLightfv(GL_LIGHT0 + i, GL_SPECULAR, specularLight);
- glLightfv(GL_LIGHT0 + i, GL_POSITION, lightPos);
- glEnable(GL_LIGHT0 + i);
- } else if (strcmp(light->_type.c_str(), "direct") == 0) {
- lightDir[0] = light->_dir._coords[0];
- lightDir[1] = light->_dir._coords[1];
- lightDir[2] = light->_dir._coords[2];
- lightDir[3] = 1.0f;
-// glLightfv(GL_LIGHT0 + i, GL_AMBIENT, ambientLight);
- glLightfv(GL_LIGHT0 + i, GL_DIFFUSE, diffuseLight);
- glLightfv(GL_LIGHT0 + i, GL_SPECULAR, specularLight);
- glLightfv(GL_LIGHT0 + i, GL_POSITION, lightPos);
- glLightfv(GL_LIGHT0 + i, GL_SPOT_DIRECTION, lightDir);
- glEnable(GL_LIGHT0 + i);
- } else {
- error("Scene::setupLights() Unknown type of light: %s", light->_type);
- }
+ assert(i < TGL_MAX_LIGHTS);
+ g_driver->setupLight(&_lights[i], i);
}
- glEnable(GL_COLOR_MATERIAL);
-
- GLfloat materialLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, materialLight);
-*/
}
void Scene::setSetup(int num) {
Index: scene.h
===================================================================
RCS file: /cvsroot/scummvm/residual/scene.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- scene.h 12 Jan 2005 18:06:43 -0000 1.24
+++ scene.h 18 Jan 2005 17:25:04 -0000 1.25
@@ -88,7 +88,6 @@
}
ObjectState *findState(const char *filename);
-private:
struct Setup { // Camera setup data
void load(TextSplitter &ts);
void setupCamera() const;
@@ -107,6 +106,8 @@
float _intensity, _umbraangle, _penumbraangle;
};
+private:
+
std::string _name;
int _numCmaps;
ResPtr<CMap> *_cmaps;
- Previous message: [Scummvm-cvs-logs] CVS: scummvm/saga actor.h,1.49,1.50 interface.cpp,1.67,1.68 interface.h,1.33,1.34 objectmap.cpp,1.35,1.36 objectmap.h,1.19,1.20 saga.cpp,1.94,1.95 saga.h,1.78,1.79 scene.h,1.44,1.45 script.cpp,1.50,1.51
- Next message: [Scummvm-cvs-logs] CVS: residual driver_gl.cpp,1.29,1.30
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Scummvm-git-logs
mailing list