yoogi Temat założony przez niniejszego użytkownika |
» 2012-09-09 20:59:20 Dalej to samo OpenGlRender.h: #ifndef OpenGlRender_h #define OpenGlRender_h
#include <stdio.h> #include <string>
#include <SFML/OpenGL.hpp>
#include <GL/glu.h> #include <GLa/GLAux.h>
#include <SFML/Window.hpp> #include <SFML/Graphics.hpp>
#pragma comment(lib,"OpenGL32.lib") #pragma comment(lib,"glaux.lib") #pragma comment(lib,"glu32.lib")
class OpenGlRender { public: OpenGlRender( int w, int h ); void Init(); void Redraw( sf::RenderWindow * rw ); void DrawCube(); AUX_RGBImageRec * LoadBMP( char * Filename ); int LoadGLTextures( char * filename ); void SetLighting( bool enambled ); bool GetLighting(); void AddLightAmbient( GLfloat la, int index ); void AddLightDiffuse( GLfloat ld, int index ); void AddLightPosition( GLfloat lp, int index ); std::string GetInfo(); void DrawText( sf::RenderWindow * window ); private: int angle; GLuint filter; GLuint texture[ 3 ]; int _w; int _h; bool bLighting; GLfloat LightAmbient[ 4 ]; GLfloat LightDiffuse[ 4 ]; GLfloat LightPosition[ 4 ]; };
#endif
OpenGlRender.cpp #include "OpenGlRender.h"
OpenGlRender::OpenGlRender( int w, int h ) { LoadGLTextures( "a.bmp" ); Init(); angle = 0; _w = w; _h = h; bLighting = false; filter = 1; LightAmbient[ 0 ] = 0.5f; LightAmbient[ 1 ] = 0.5f; LightAmbient[ 2 ] = 0.5f; LightAmbient[ 3 ] = 1.0f; LightDiffuse[ 0 ] = 1.0f; LightDiffuse[ 1 ] = 1.0f; LightDiffuse[ 2 ] = 1.0f; LightDiffuse[ 3 ] = 1.0f; LightPosition[ 0 ] = 0.0f; LightPosition[ 1 ] = 0.0f; LightPosition[ 2 ] = 2.0f; LightPosition[ 3 ] = 1.0f; }
void OpenGlRender::Init() { glEnable( GL_TEXTURE_2D ); glShadeModel( GL_SMOOTH ); glClearColor( 0.0f, 0.0f, 0.0f, 0.5f ); glClearDepth( 1.0f ); glEnable( GL_DEPTH_TEST ); glDepthFunc( GL_LEQUAL ); glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); }
void OpenGlRender::Redraw( sf::RenderWindow * rw ) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); DrawText( rw ); glLoadIdentity(); gluPerspective( 45.0f,( GLfloat ) _w /( GLfloat ) _h, 0.1f, 100.0f ); glScalef( 4.0, 4.0, 4.0 ); glTranslatef( 0.0f, 0.0f, - 7.0f ); glLightfv( GL_LIGHT1, GL_AMBIENT, LightAmbient ); glLightfv( GL_LIGHT1, GL_DIFFUSE, LightDiffuse ); glLightfv( GL_LIGHT1, GL_POSITION, LightPosition ); glEnable( GL_LIGHT1 ); if( bLighting ) glEnable( GL_LIGHTING ); else glDisable( GL_LIGHTING ); DrawCube(); }
void OpenGlRender::DrawCube() { glBindTexture( GL_TEXTURE_2D, texture[ filter ] ); glRotatef( 30, 1, 0, 0 ); glRotatef(( GLfloat ) angle, 0, 1, 0 ); angle++; glBegin( GL_QUADS ); glNormal3f( 0.0f, 0.0f, 1.0f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f ); glNormal3f( 0.0f, 0.0f, - 1.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); glNormal3f( 0.0f, 1.0f, 0.0f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f ); glNormal3f( 0.0f, - 1.0f, 0.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); glNormal3f( 1.0f, 0.0f, 0.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); glNormal3f( - 1.0f, 0.0f, 0.0f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f ); glEnd(); }
AUX_RGBImageRec * OpenGlRender::LoadBMP( char * Filename ) { FILE * File = NULL; if( !Filename ) return NULL; File = fopen( Filename, "r" ); if( File ) { fclose( File ); return auxDIBImageLoadA( Filename ); } return NULL; }
int OpenGlRender::LoadGLTextures( char * filename ) { int Status = FALSE; AUX_RGBImageRec * TextureImage[ 1 ]; memset( TextureImage, 0, sizeof( void * ) * 1 ); if( TextureImage[ 0 ] = LoadBMP( filename ) ) { Status = TRUE; glGenTextures( 3, & texture[ 0 ] ); glBindTexture( GL_TEXTURE_2D, texture[ 0 ] ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); glTexImage2D( GL_TEXTURE_2D, 0, 3, TextureImage[ 0 ]->sizeX, TextureImage[ 0 ]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[ 0 ]->data ); glBindTexture( GL_TEXTURE_2D, texture[ 1 ] ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexImage2D( GL_TEXTURE_2D, 0, 3, TextureImage[ 0 ]->sizeX, TextureImage[ 0 ]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[ 0 ]->data ); glBindTexture( GL_TEXTURE_2D, texture[ 2 ] ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST ); gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage[ 0 ]->sizeX, TextureImage[ 0 ]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[ 0 ]->data ); } if( TextureImage[ 0 ] ) { if( TextureImage[ 0 ]->data ) free( TextureImage[ 0 ]->data ); free( TextureImage[ 0 ] ); } return Status; }
void OpenGlRender::SetLighting( bool enambled ) { bLighting = enambled; }
bool OpenGlRender::GetLighting() { return bLighting; }
void OpenGlRender::AddLightAmbient( GLfloat la, int index ) { LightAmbient[ index ] += la; }
void OpenGlRender::AddLightDiffuse( GLfloat ld, int index ) { LightDiffuse[ index ] += ld; }
void OpenGlRender::AddLightPosition( GLfloat lp, int index ) { LightPosition[ index ] += lp; }
std::string OpenGlRender::GetInfo() { char tmp[ 1024 ]; sprintf( tmp, "%.2f %.2f %.2f %.2f \t %.2f %.2f %.2f %.2f \t %.2f %.2f %.2f %.2f\n", LightAmbient[ 0 ], LightAmbient[ 1 ], LightAmbient[ 2 ], LightAmbient[ 3 ], LightDiffuse[ 0 ], LightDiffuse[ 1 ], LightDiffuse[ 2 ], LightDiffuse[ 3 ], LightPosition[ 0 ], LightPosition[ 1 ], LightPosition[ 2 ], LightPosition[ 3 ] ); return tmp; }
void OpenGlRender::DrawText( sf::RenderWindow * window ) { sf::Text text; text.setString( GetInfo() ); window->draw( text ); }
main.cpp: #pragma comment(lib,"sfml-window.lib") #pragma comment(lib,"sfml-system.lib") #pragma comment(lib,"sfml-graphics.lib")
#include "OpenGlRender.h" #include <SFML/Window.hpp> #include <SFML/Graphics.hpp>
int main() { sf::RenderWindow window( sf::VideoMode( 800, 600 ), "OpenGL", sf::Style::Default, sf::ContextSettings( 32 ) ); window.setVerticalSyncEnabled( true ); OpenGlRender render( 800, 600 ); render.SetLighting( false ); bool running = true; while( running ) { sf::Event ev; while( window.pollEvent( ev ) ) if( ev.type == sf::Event::Closed ) running = false; else if( ev.type == sf::Event::Resized ) glViewport( 0, 0, ev.size.width, ev.size.height ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) render.SetLighting( true ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) render.SetLighting( false ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Q ) ) render.AddLightAmbient( 0.01, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) ) render.AddLightAmbient( - 0.01, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) render.AddLightAmbient( 0.01, 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) ) render.AddLightAmbient( - 0.01, 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::E ) ) render.AddLightAmbient( 0.01, 2 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) ) render.AddLightAmbient( - 0.01, 2 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::R ) ) render.AddLightAmbient( 0.01, 3 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::F ) ) render.AddLightAmbient( - 0.01, 3 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::T ) ) render.AddLightDiffuse( 0.01, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::G ) ) render.AddLightDiffuse( - 0.01, 0 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Y ) ) render.AddLightDiffuse( 0.01, 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::H ) ) render.AddLightDiffuse( - 0.01, 1 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::U ) ) render.AddLightDiffuse( 0.01, 2 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::J ) ) render.AddLightDiffuse( - 0.01, 2 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::I ) ) render.AddLightDiffuse( 0.01, 3 ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::K ) ) render.AddLightDiffuse( - 0.01, 3 ); render.Redraw( & window ); window.display(); } return 0; }
|