Skip to main content
gamedev.net
🔒 Locked

Problem with basic lighting

Started by Fimbulvetr 0 replies 800+ views
Original Post
Fimbulvetr
Fimbulvetr
glUtilities.h file:

#ifndef LG_GL_UTILITIES_H
#define LG_GL_UTILITIES_H

#define OGL_WND_STYLE WS_CLIPSIBLINGS | WS_CLIPCHILDREN
#define OGL_CLS_STYLE CS_OWNDC | CS_HREDRAW | CS_VREDRAW

typedef struct _OGLParameters {
	PIXELFORMATDESCRIPTOR _pfd;
	HWND				  _hWnd;
	HDC					  _hDC;
	HGLRC				  _hRC;
	int					  _nPixelFormat;
	int				      _width;				
	int				      _height;
	bool				  _fullscreen;
} OGLParameters;

typedef float glVector3f[3];

extern void getDisplayError();
extern void getLastGLError();
extern void glEnterLoop(bool (* pDisplayFunc)(int timeDelta));
extern bool glScreenToggle(int width, int height, int bits, int freq, DWORD mFlags, DWORD dwFlags);
extern bool glInit(HWND hWnd, int width, int height, PIXELFORMATDESCRIPTOR pfd, bool fullscreen);
extern void glResize(float fovy, int width, int height, float zNear, float zFar);
extern void glCleanup();
extern bool glSetup();
extern bool glDisplay();

extern glVector3f *glOrthoNormalVector3fv(glVector3f p1, glVector3f p2, glVector3f p3);

#endif // LG_GL_UTILITIES_H




glUtilities.cpp file:

#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>

#include "glUtilities.h"

OGLParameters glParam;

void getDisplayError() {
}

bool glScreenToggle(int width, int height, int bits, int freq, DWORD mFlags, DWORD dwFlags) {
	// return to windowed mode
	if(glParam._fullscreen) {
		if(ChangeDisplaySettings(NULL, dwFlags) == DISP_CHANGE_SUCCESSFUL)
			glParam._fullscreen = !glParam._fullscreen;
		else {
			getDisplayError();
			return false;
		}
	} 

	// go to fullscreen
	else { 
		DEVMODE devMode;

		glParam._fullscreen = !glParam._fullscreen;
	}

	return true;
}

bool glInit(HWND hWnd, int width, int height, PIXELFORMATDESCRIPTOR pfd, bool fullscreen) {
	int   nPixelFormat;
	HDC   hDC;
	HGLRC hRC;

	hDC			 = GetDC(hWnd);
	nPixelFormat = ChoosePixelFormat(hDC, &pfd);

	SetPixelFormat(hDC, nPixelFormat, &pfd);

	hRC = wglCreateContext(hDC);
	wglMakeCurrent(hDC, hRC);

	glParam._hDC		  = hDC;
	glParam._hRC		  = hRC;
	glParam._hWnd		  = hWnd;
	glParam._nPixelFormat = nPixelFormat;
	glParam._pfd		  = pfd;
	glParam._fullscreen	  = fullscreen;
	glParam._width		  = width;
	glParam._height		  = height;

	return true;
}

void glResize(float fovy, int width, int height, float zNear, float zFar) {
	if(height == 0) 
		height = 1;

	glViewport(0, 0, width, height);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	gluPerspective(fovy, (GLfloat)width / (GLfloat)height, zNear, zFar);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glParam._width  = width;
	glParam._height = height;
}

void glCleanup() {
	wglMakeCurrent(glParam._hDC, NULL);
	wglDeleteContext(glParam._hRC);
	ReleaseDC(glParam._hWnd, glParam._hDC);
}

bool glSetup() {
	float sambientLight[] = {.3f, .3f, .3f, 1.0f};
	float sdiffuseLight[] = {.7f, .7f, .7f, 1.0f};
	float lightPos[]	  = {.0f, 2.0f, -10.0f, 1.0f};


	glEnable(GL_DEPTH_TEST);
	glEnable(GL_LIGHTING);
	glEnable(GL_NORMALIZE);
	glEnable(GL_CULL_FACE);
	glFrontFace(GL_CCW);

	glLightfv(GL_LIGHT0, GL_AMBIENT, sambientLight);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, sdiffuseLight);

	glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

	glEnable(GL_LIGHT0);

	glEnable(GL_COLOR_MATERIAL);
	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

	return true;
}

glVector3f *glOrthoNormalVector3fv(glVector3f p1, glVector3f p2, glVector3f p3) {
	glVector3f temp;
	glVector3f v1;
	glVector3f v2;

	for(int i=0; i<3; i++) {
		v1 = p2 - p1;
		v2 = p3 - p1;
	}

	temp[0] = (v1[1] * v2[2] - v1[2] * v2[1]) + p1[0];
	temp[1] = (v1[2] * v2[0] - v1[0] * v2[2]) + p1[1];
	temp[2] = (v1[0] * v2[1] - v1[1] * v2[0]) + p1[2];

	return &temp;
}




WinMain.cpp file:

#include <windows.h>
#include <stdio.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <cstdlib>

#include "glUtilities.h"

#define CLASS_NAME TEXT("TestingGL")
#define WIN_TITLE  TEXT("TestingGL App")

#define ROTATE 1

extern OGLParameters glParam;

float glTriBot[4][3] = {
	{-1, -1, 1},
	{-1, -1, -1},
	{1, -1, -1},
	{1, -1, 1}
};

float glTri[4][3][3] = {
	{{-1, -1, 1}, {1, -1, 1}, {0, 1, 0}},	// front
	{{1, -1, -1}, {-1, -1, -1}, {0, 1, 0}},	// back
	{{-1, -1, -1}, {-1, -1, 1}, {0, 1, 0}},	// left
	{{1, -1, 1}, {1, -1, -1}, {0, 1, 0}}	// right
};

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nShowCmd) {
	HWND	 hWnd = NULL;
	MSG		 msg;
	WNDCLASS wc;

	wc.cbClsExtra	 = 0;
	wc.cbWndExtra	 = 0;
	wc.hbrBackground = NULL;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	wc.hIcon		 = LoadIcon(hInstance, IDI_APPLICATION);
	wc.hInstance	 = hInstance;
	wc.lpfnWndProc	 = (WNDPROC)WndProc;
	wc.lpszClassName = CLASS_NAME;
	wc.lpszMenuName  = NULL;
	wc.style		 = OGL_CLS_STYLE;

	if(FAILED(RegisterClass(&wc)))
		return EXIT_FAILURE;

	if((hWnd = CreateWindow(CLASS_NAME, WIN_TITLE, WS_OVERLAPPEDWINDOW | OGL_WND_STYLE, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL)) == NULL)
		return EXIT_FAILURE;

	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);

	while(GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return EXIT_SUCCESS;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
	static float xRot = 0;
	static float yRot = 0;
	static float zRot = 0;

	static glVector3f *norm;

	switch(msg) {
		case WM_CREATE:
			{
				PIXELFORMATDESCRIPTOR pfd = { 
					sizeof(PIXELFORMATDESCRIPTOR), 1,
					PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
					PFD_TYPE_RGBA,
					32,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0
				};

				glInit(hWnd, 640, 480, pfd, false);
				glSetup();

				SetTimer(hWnd, ROTATE, 10, NULL);

				InvalidateRect(hWnd, NULL, FALSE);
			}
			break;
		case WM_TIMER:
			switch(wParam) {
				case ROTATE:
					xRot = yRot = (zRot += 0.5);
					InvalidateRect(hWnd, NULL, TRUE);
					break;
			}
			break;
		case WM_SIZE:
			glResize(45.0f, LOWORD(lParam), HIWORD(lParam), 1.0f, 400.0f);
			break;
		case WM_KEYDOWN:
			switch(wParam) {
				case VK_LEFT:
					yRot--;
					break;
				case VK_RIGHT:
					yRot++;
					break;
				case VK_DOWN:
					xRot++;
					break;
				case VK_UP:
					xRot--;
					break;
			}
			break;
		case WM_PAINT:
			glLoadIdentity();
			glClearColor(.0f, .0f, .5f, 1.0f);
			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

			glPushMatrix();
			glLoadIdentity();
			glTranslatef(.0f, .0f, -10.0f);
			//glRotatef(45.0f + xRot, 1.0f,  .0f,  .0f);
			glRotatef(45.0f + yRot,  .0f, 1.0f,  .0f);
			//glRotatef(45.0f + zRot,  .0f, .0f,  1.0f);
			glScalef(2.0f, 2.0f, 2.0f);

			glBegin(GL_TRIANGLES);
				for(int i=0; i<4; i++) {
					norm = glOrthoNormalVector3fv(glTri[0], glTri[1], glTri[2]);
					glNormal3fv(*norm);
					for(int j=0; j<3; j++)
						glVertex3fv(glTri[j]);
				}
			glEnd();

			glBegin(GL_QUADS);
				glNormal3f(.0f, -1.f, .0f);
				for(int j=0; j<4; j++)
					glVertex3fv(glTriBot[j]);
			glEnd();
			glPopMatrix();

			SwapBuffers(glParam._hDC);
			break;
		case WM_DESTROY:
			glCleanup();
			PostQuitMessage(EXIT_SUCCESS);
			break;
	}

	return DefWindowProc(hWnd, msg, wParam, lParam);
}




the ss of this program: http://tianak.homelinux.com/oglss.jpg Now, my question is, why does only half of the piramide is lighted and the other half is not? Thanks.
Fimbulvetr
Fimbulvetr
Ok, I guess you don't answer me because of the long code... All you have to see there is the WM_PAINT, I gave you the rest of the code so you would be able to see the other functions in time of need

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.