void Event_MouseMove(int x, int y, short dx, short dy) { if (mousedown) { basiccamera.OrbitRight(GLDegreesToRadians(dx)); basiccamera.OrbitUp(GLDegreesToRadians(dy)); } }
void FPSCamera::Event_MouseMove(short dx, short dy) { if( state & State_Rotating ) { float speedx = GLDegreesToRadians((float)dx); float speedy = GLDegreesToRadians((float)dy); targetangles[0] += speedx * ROTATIONAL_SPEED; targetangles[1] += speedy * ROTATIONAL_SPEED; } }
FPSCamera::FPSCamera(CollisionWorld* world) { Aspect = 4.0f / 3.0f; Fov = GLDegreesToRadians(80); Near = 0.1f; Far = 50.0f; state = 0; body = 0; collworld = world; isonground = false; array_state_set(anglecurve, 0, 0, 0); GLVec3Set(position, 0, 1.8f, 0); GLVec3Set(targetangles, 0, 0, 0); GLVec3Set(smoothedangles, 0, 0, 0); GLMatrixIdentity(view); if( world ) { body = world->AddDynamicSphere(CAMERA_RADIUS, 80); body->SetPosition(0, 0.1f, 0); } }
bool InitScene() { SetWindowText(hwnd, TITLE); Quadron::qGLExtensions::QueryFeatures(); isGL4_4 = (Quadron::qGLExtensions::GLVersion >= Quadron::qGLExtensions::GL_4_4); // setup opengl glClearColor(0.0f, 0.125f, 0.3f, 1.0f); glClearDepth(1.0); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); if( !GLCreateMeshFromQM("../media/meshes/teapot.qm", &mesh) ) { MYERROR("Could not load mesh"); return false; } if( !GLCreateEffectFromFile("../media/shadersGL/blinnphong.vert", 0, "../media/shadersGL/blinnphong.frag", &effect1) ) { MYERROR("Could not load 'blinnphong' effect"); return false; } if( !GLCreateEffectFromFile("../media/shadersGL/uniformbuffer.vert", 0, "../media/shadersGL/uniformbuffer.frag", &effect2) ) { MYERROR("Could not load 'uniformbuffer' effect"); return false; } if( !GLCreateEffectFromFile("../media/shadersGL/basic2D.vert", 0, "../media/shadersGL/basic2D.frag", &basic2D) ) { MYERROR("Could not load 'basic2D' shader"); return false; } // create framebuffer framebuffer = new OpenGLFramebuffer(screenwidth, screenheight); framebuffer->AttachTexture(GL_COLOR_ATTACHMENT0, GLFMT_A8B8G8R8, GL_NEAREST); framebuffer->AttachRenderbuffer(GL_DEPTH_STENCIL_ATTACHMENT, GLFMT_D24S8); if( !framebuffer->Validate() ) { MYERROR("Framebuffer validation failed"); return false; } // create uniform buffer effect2->SetUniformBlockBinding("VertexUniformData", 0); effect2->SetUniformBlockBinding("FragmentUniformData", 1); // simple uniform buffer glGenBuffers(1, &uniformbuffer1); glBindBuffer(GL_UNIFORM_BUFFER, uniformbuffer1); glBufferData(GL_UNIFORM_BUFFER, sizeof(EffectUniformBlock), NULL, GL_DYNAMIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); // uniform ringbuffer glGenBuffers(1, &uniformbuffer2); glBindBuffer(GL_UNIFORM_BUFFER, uniformbuffer2); glBufferData(GL_UNIFORM_BUFFER, UNIFORM_COPIES * sizeof(EffectUniformBlock), NULL, GL_DYNAMIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); if( isGL4_4 ) { // uniform storage buffer glGenBuffers(1, &uniformbuffer3); glBindBuffer(GL_UNIFORM_BUFFER, uniformbuffer3); glBufferStorage(GL_UNIFORM_BUFFER, UNIFORM_COPIES * sizeof(EffectUniformBlock), NULL, GL_DYNAMIC_STORAGE_BIT|GL_MAP_WRITE_BIT|GL_MAP_PERSISTENT_BIT|GL_MAP_COHERENT_BIT); glBindBuffer(GL_UNIFORM_BUFFER, 0); } memset(&uniformDTO, 0, sizeof(uniformDTO)); // render text GLCreateTexture(512, 512, 1, GLFMT_A8B8G8R8, &text1); if( isGL4_4 ) { glBindBuffer(GL_UNIFORM_BUFFER, uniformbuffer3); persistentdata = (EffectUniformBlock*)glMapBufferRange(GL_UNIFORM_BUFFER, 0, UNIFORM_COPIES * sizeof(EffectUniformBlock), GL_MAP_WRITE_BIT|GL_MAP_PERSISTENT_BIT|GL_MAP_COHERENT_BIT); glBindBuffer(GL_UNIFORM_BUFFER, 0); assert(persistentdata != 0); GLRenderText( "1 - glUniformXX\n2 - UBO with glBufferSubData\n3 - UBO with glMapBufferRange\n4 - UBO with glFenceSync\n5 - UBO with persistent mapping", text1, 512, 512); } else { GLRenderText( "1 - glUniformXX\n2 - UBO with glBufferSubData\n3 - UBO with glMapBufferRange\n4 - UBO with glFenceSync", text1, 512, 512); } screenquad = new OpenGLScreenQuad(); // setup cameras basiccamera.SetAspect((float)screenwidth / screenheight); basiccamera.SetFov(GLDegreesToRadians(80)); basiccamera.SetClipPlanes(0.1f, 30.0f); basiccamera.SetDistance(10.0f); return true; }
bool InitScene() { SetWindowText(hwnd, TITLE); Quadron::qGLExtensions::QueryFeatures(); //CalculateSphereTetrahedron(4, 0.5f); // setup opengl glClearColor(0, 0, 0, 1); glClearDepth(1.0); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); // create render targets for reference rendertargets[0] = new OpenGLFramebuffer(screenwidth, screenheight); rendertargets[1] = new OpenGLFramebuffer(screenwidth, screenheight); rendertargets[0]->AttachTexture(GL_COLOR_ATTACHMENT0, GLFMT_A32B32G32R32F, GL_NEAREST); rendertargets[1]->AttachTexture(GL_COLOR_ATTACHMENT0, GLFMT_A32B32G32R32F, GL_NEAREST); GL_ASSERT(rendertargets[0]->Validate()); GL_ASSERT(rendertargets[1]->Validate()); GLint value = 0; float white[] = { 1, 1, 1, 1 }; gbuffer = new OpenGLFramebuffer(screenwidth, screenheight); gbuffer->AttachTexture(GL_COLOR_ATTACHMENT0, GLFMT_A8B8G8R8_sRGB, GL_NEAREST); // color gbuffer->AttachTexture(GL_COLOR_ATTACHMENT1, GLFMT_A16B16G16R16F, GL_NEAREST); // normals gbuffer->AttachTexture(GL_COLOR_ATTACHMENT2, GLFMT_R32F, GL_NEAREST); // depth gbuffer->AttachTexture(GL_COLOR_ATTACHMENT3, GLFMT_G16R16F, GL_NEAREST); // velocity glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, white); gbuffer->AttachRenderbuffer(GL_DEPTH_STENCIL_ATTACHMENT, GLFMT_D24S8); GL_ASSERT(gbuffer->Validate()); glBindFramebuffer(GL_FRAMEBUFFER, gbuffer->GetFramebuffer()); { glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, &value); GL_ASSERT(value == GL_SRGB); glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, &value); GL_ASSERT(value == GL_LINEAR); glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, &value); GL_ASSERT(value == GL_LINEAR); } glBindFramebuffer(GL_FRAMEBUFFER, 0); // load shaders if( !GLCreateEffectFromFile("../media/shadersGL/AOpathtracer.vert", 0, "../media/shadersGL/AOpathtracer.frag", &pathtracer) ) { MYERROR("Could not load 'path tracer' shader"); return false; } if( !GLCreateEffectFromFile("../media/shadersGL/AOpathtracer.vert", 0, "../media/shadersGL/AOpathtracer.frag", &refgbuffereffect, "#define RENDER_GBUFFER\n") ) { MYERROR("Could not load 'gbuffer' shader"); return false; } if( !GLCreateEffectFromFile("../media/shadersGL/basic2D.vert", 0, "../media/shadersGL/gtao.frag", &refgtaoeffect, "#define NUM_DIRECTIONS 32\n#define NUM_STEPS 16\n") ) { MYERROR("Could not load 'GTAO' shader"); return false; } if( !GLCreateEffectFromFile("../media/shadersGL/basic2D.vert", 0, "../media/shadersGL/gtaocombine.frag", &combineeffect) ) { MYERROR("Could not load 'combine' shader"); return false; } if( !GLCreateEffectFromFile("../media/shadersGL/basic2D.vert", 0, "../media/shadersGL/basic2D.frag", &presenteffect) ) { MYERROR("Could not load 'basic2D' shader"); return false; } float id[16]; GLMatrixIdentity(id); presenteffect->SetMatrix("matTexture", id); refgtaoeffect->SetMatrix("matTexture", id); combineeffect->SetInt("sampler0", 0); combineeffect->SetInt("sampler1", 1); refgtaoeffect->SetInt("gbufferDepth", 0); refgtaoeffect->SetInt("gbufferNormals", 1); refgtaoeffect->SetInt("noise", 2); screenquad = new OpenGLScreenQuad(); // render text GLCreateTexture(512, 512, 1, GLFMT_A8B8G8R8, &text1); GLRenderText( "Use the mouse to rotate camera\n\nP - Toggle path tracer\nH - Toggle help text", text1, 512, 512); // setup camera orbitcamera.SetAspect((float)screenwidth / (float)screenheight); orbitcamera.SetFov(GL_PI / 4.0f); orbitcamera.SetPosition(0, 1.633f, 0); orbitcamera.SetOrientation(GLDegreesToRadians(135), GLDegreesToRadians(30), 0); orbitcamera.SetDistance(6); orbitcamera.SetClipPlanes(0.1f, 20); return true; }