#include <windows.h>
#include <mmsystem.h>
#include <winnt.h>
#include <Ovgl.h>
HWND hWnd;
Ovgl::Instance* Inst;
Ovgl::RenderTarget* RenderTarget;
Ovgl::Window* Window;
Ovgl::MediaLibrary* MediaLibrary;
Ovgl::Scene* Scene;
Ovgl::Actor* Actor;
Ovgl::Camera* Camera;
Ovgl::Emitter* Emitter;
Ovgl::Texture* Texture1;
Ovgl::Texture* Texture2;
Ovgl::Mesh* Mesh;
Ovgl::Object* Object;
Ovgl::Light* Light;
bool g_Quit = false;
void MouseMove(long x, long y)
{
Camera->setPose( &((Ovgl::MatrixRotationY(x / 1000.0f ) * Ovgl::MatrixRotationX( -y / 1000.0f)) * Camera->getPose() ) );
}
void KeyDown(char key)
{
if(key == (char)27)
{
g_Quit = true;
}
if( key == 'W')
Camera->setPose( &(Ovgl::MatrixTranslation( 0.0f, 0.0f, 0.1f ) * Camera->getPose() ) );
if( key == 'S')
Camera->setPose( &(Ovgl::MatrixTranslation( 0.0f, 0.0f, -0.1f ) * Camera->getPose() ) );
if( key == 'A')
Camera->setPose( &(Ovgl::MatrixTranslation( 0.1f, 0.0f, 0.0f ) * Camera->getPose() ) );
if( key == 'D')
Camera->setPose( &(Ovgl::MatrixTranslation( -0.1f, 0.0f, 0.0f ) * Camera->getPose() ) );
}
int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// Create Main Instance
Inst = new Ovgl::Instance( 0 );
// Create Window
Window = new Ovgl::Window( Inst, "Test");
Window->LockMouse(true);
Window->SetFullscreen( true );
Window->SetVSync( true );
Window->On_MouseMove = MouseMove;
Window->On_KeyDown = KeyDown;
// Create Render Target
RenderTarget = new Ovgl::RenderTarget(Inst, Window, &Ovgl::Vector4(0.0f, 0.0f, 0.999f, 0.999f), NULL);
RenderTarget->bloom = 4;
RenderTarget->motionBlur = true;
RenderTarget->multiSample = true;
RenderTarget->debugMode = false;
// Create Media Library
MediaLibrary = new Ovgl::MediaLibrary(Inst, "");
// Create empty scene
Scene = MediaLibrary->CreateScene();
// Add light to scene.
Light = Scene->CreateLight(&Ovgl::MatrixTranslation( -1.8f, 4.0f, -3.35f ), &Ovgl::Vector4( 1.0f, 1.0f, 1.0f, 1.0f ));
// Add camera to scene
Camera = Scene->CreateCamera(&Ovgl::MatrixTranslation( 0.0f, 0.0f, 0.0f ));
// Set camera as view for render target
RenderTarget->view = Camera;
// Create cubemap texture
Texture1 = MediaLibrary->ImportCubeMap( "..\\media\\textures\\skybox\\front.png", "..\\media\\textures\\skybox\\back.png", "..\\media\\textures\\skybox\\top.png",
"..\\media\\textures\\skybox\\bottom.png", "..\\media\\textures\\skybox\\left.png", "..\\media\\textures\\skybox\\right.png");
// Create 2D texture
Texture2 = MediaLibrary->ImportTexture("..\\media\\textures\\test.jpg");
// Import mesh
Mesh = MediaLibrary->ImportFBX( "..\\media\\meshes\\test.fbx", false, true );
// Add object to scene
Object = Scene->CreateObject(Mesh, &Ovgl::MatrixTranslation( 0.0f, -5.0f, 0.0f ));
Object->materials[0]->setFSTexture("txDiffuse", Texture2);
// Set scene sky box
Scene->skybox = Texture1;
DWORD previousTime = timeGetTime();
// Main message loop
while( !g_Quit )
{
DWORD currentTime = timeGetTime();
DWORD elapsedTime = currentTime - previousTime;
Scene->Update(elapsedTime);
RenderTarget->Render();
Window->DoEvents();
previousTime = currentTime;
}
// Release all
delete Inst;
return 0;
}
One design idea I really want some opinions on is where rects which use values below one use relative instead of absolute positions. Example: { 0, 0, 0.5, 0.5} = top left quarter of screen. Another example of absolute positioning: { 0, 0, 1024, 768} = full screen if screen is 1024x768
An example of this in action would be where I define my render target: RenderTarget = new Ovgl::RenderTarget(Inst, Window, &Ovgl::Vector4(0.0f, 0.0f, 0.999f, 0.999f), NULL);