Original Post
glUtilities.h file: glUtilities.cpp file: WinMain.cpp file: 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.
#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
#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;
}
#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);
}