[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


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;





More information about the Scummvm-git-logs mailing list