fare.h
#pragma once
#include <Windows.h>
#include <GL\GL.h>
GLfloat trans[3];
GLfloat rot[2];
enum {
PAN = 1,
ROTATE= 5,
};
char mystring[256],mystring2[256];
static float zoom=-50;
static float totZoom = -50;
static float thisDelta = 0;
static float lastDelta = 0;
int faretekeri(int wdegeri)
{
thisDelta += GET_WHEEL_DELTA_WPARAM(wdegeri);
if (thisDelta != lastDelta){
if (thisDelta > lastDelta){
totZoom -= 5.0f;
zoom=totZoom;
}
else if (thisDelta < lastDelta){
totZoom += 5.0f;
zoom=totZoom;
}
lastDelta=thisDelta;
}
return 0;
}
static void update(int state, int ox, int nx, int oy, int ny)
{
int dx = ox - nx;
int dy = ny - oy;
switch(state) {
case PAN:
trans[0] -= dx / 4.0f;
trans[1] -= dy / 4.0f;
break;
case ROTATE:
rot[0] += (dy * 180.0f) / 500.0f;
rot[1] -= (dx * 180.0f) / 500.0f;
#define clamp(x) x = x > 360.0f ? x-360.0f : x < -360.0f ? x+=360.0f : x
clamp(rot[0]);
clamp(rot[1]);
break;
}
}
opengl.h
#pragma once
#include <Windows.h>
#include <gl/gl.h>
#include "fare.h"
#include <GL\glut.h>
GLfloat fLightPos[4] = { -100.0f, 100.0f, 50.0f, 1.0f };
GLfloat fNoLight[] = { 0.0f, 0.0f, 0.0f, 0.0f };
GLfloat fLowLight[] = { 0.25f, 0.25f, 0.25f, 1.0f };
GLfloat fBrightLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };
void isik(void)
{
// glCullFace(GL_BACK);
//glFrontFace(GL_CCW);
// glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, fNoLight);
glLightfv(GL_LIGHT0, GL_AMBIENT, fLowLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, fBrightLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, fBrightLight);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glMateriali(GL_FRONT, GL_SHININESS, 128);
}
void Bicim( int x, int y )
{
float xy_aspect;
glLightfv(GL_LIGHT0, GL_POSITION, fLightPos);
xy_aspect = (float)x / (float)y;
glViewport( 0, 0, x, y );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum( -xy_aspect*.08, xy_aspect*.08, -.08, .08, 0.1, 10000.0 );
glMatrixMode( GL_MODELVIEW );
}
void Cizim( int deger,float rcolor,float gcolor,float bcolor)
{
static float rotationX = 0.0, rotationY = 0.0;
glLightfv(GL_LIGHT0, GL_POSITION, fLightPos);
glClearColor(1.0,1.0, 1.0,fLowLight[3]);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef(trans[0], trans[1], zoom);
glRotatef(rot[0], 1.0f, 0.0f, 0.0f);
glRotatef(rot[1], 0.0f, 1.0f, 0.0f);
glColor3f(rcolor,gcolor,bcolor);
glutSolidCube(deger);
}
Ana.cpp
#include <windows.h>
#include <gl/gl.h>
#include "fare.h"
#include "opengl.h"
LRESULT CALLBACK WndProc (HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam);
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);
int yuk=1000,gen=800;
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow)
{
WNDCLASS wc;
HWND hWnd;
HDC hDC;
HGLRC hRC;
MSG msg;
BOOL bQuit = FALSE;
float theta = 0.0f;
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName ="OpenGLTurk";
RegisterClass (&wc);
hWnd = CreateWindow ("OpenGLTurk","Yasin Demirci",WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE | WS_OVERLAPPEDWINDOW ,30, 30, yuk,gen,NULL, NULL, hInstance, NULL);
EnableOpenGL (hWnd, &hDC, &hRC);
while (!bQuit)
{
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
/* mesaj dağıtma*/
if (msg.message == WM_QUIT)
{
bQuit = TRUE;
}
else
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
else
{
isik();
Bicim(yuk,gen);
Cizim(4,1.0,0.0,0.0);
SwapBuffers (hDC);
theta += 1.0f;
Sleep (1);
}
}
DisableOpenGL (hWnd, hDC, hRC);
DestroyWindow (hWnd);
return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam)
{
static GLuint state = 0;
static int omx, omy, mx, my;
switch (message)
{
case WM_CREATE:
return 0;
case WM_CLOSE:
PostQuitMessage (0);
return 0;
case WM_MOUSEWHEEL:
faretekeri(wParam);
break;
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_LBUTTONDOWN:
SetCapture(hWnd);
mx = LOWORD(lParam);
my = HIWORD(lParam);
if (message == WM_RBUTTONDOWN)
state |= ROTATE;
if (message == WM_LBUTTONDOWN)
state |= PAN;
return 0;
case WM_RBUTTONUP:
case WM_LBUTTONUP:
ReleaseCapture();
state = 0;
return 0;
case WM_MOUSEMOVE:
if (state) {
omx = mx;
omy = my;
mx = LOWORD(lParam);
my = HIWORD(lParam);
if(mx & 1 << 15) mx -= (1 << 16);
if(my & 1 << 15) my -= (1 << 16);
update(state, omx, mx, omy, my);
PostMessage(hWnd, WM_PAINT, 0, 0);
}
return 0;
case WM_DESTROY:
return 0;
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
return 0;
}
return 0;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
}
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
*hDC = GetDC (hWnd);
ZeroMemory (&pfd, sizeof (pfd));
pfd.nSize = sizeof (pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat (*hDC, &pfd);
SetPixelFormat (*hDC, iFormat, &pfd);
*hRC = wglCreateContext( *hDC );
wglMakeCurrent( *hDC, *hRC );
}
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
{
wglMakeCurrent (NULL, NULL);
wglDeleteContext (hRC);
ReleaseDC (hWnd, hDC);
}

Hiç yorum yok:
Yorum Gönder