소스 검색

win32: start porting the graphical backend to DirectX 9. Apparently I

cannot used DirectX 10 because my video card only supports DX9, and there
is no compatibility layer. DX11 has feature levels for older hardware so
it would work with a DX9 card, but it's not available for WinXP.
legacy
Sam Hocevar sam 12 년 전
부모
커밋
090834b149
12개의 변경된 파일209개의 추가작업 그리고 105개의 파일을 삭제
  1. +1
    -1
      src/debug/quad.cpp
  2. +1
    -1
      src/debug/sphere.cpp
  3. +38
    -28
      src/gpu/shader.cpp
  4. +2
    -2
      src/gradient.cpp
  5. +26
    -1
      src/platform/sdl/sdlapp.cpp
  6. +11
    -11
      src/scene.cpp
  7. +6
    -6
      src/tileset.cpp
  8. +36
    -13
      src/video.cpp
  9. +25
    -12
      test/tutorial/tut01.cpp
  10. +22
    -8
      test/tutorial/tut02.cpp
  11. +3
    -3
      win32/Lol.Rules.props
  12. +38
    -19
      win32/Lol.Vars.props

+ 1
- 1
src/debug/quad.cpp 파일 보기

@@ -12,7 +12,7 @@
# include "config.h"
#endif

#if !defined _XBOX /* This file is meaningless on Xbox */
#if !defined USE_D3D9 && !defined _XBOX /* This file is meaningless on Xbox */

#if defined WIN32 && !_XBOX
# define _USE_MATH_DEFINES /* for M_PI */


+ 1
- 1
src/debug/sphere.cpp 파일 보기

@@ -12,7 +12,7 @@
# include "config.h"
#endif

#if !defined _XBOX /* This file is meaningless on Xbox */
#if !defined USE_D3D9 && !defined _XBOX /* This file is meaningless on Xbox */

#if defined WIN32
# define _USE_MATH_DEFINES /* for M_PI */


+ 38
- 28
src/gpu/shader.cpp 파일 보기

@@ -19,6 +19,10 @@
#ifdef WIN32
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# if defined USE_D3D9
# include <d3d9.h>
# include <d3dx9shader.h>
# endif
#endif

#include "core.h"
@@ -26,6 +30,12 @@

using namespace std;

#if defined USE_D3D9
extern IDirect3DDevice9 *g_d3ddevice;
#elif defined _XBOX
extern D3DDevice *g_d3ddevice;
#endif

namespace lol
{

@@ -38,7 +48,11 @@ class ShaderData
friend class Shader;

private:
#if defined _XBOX
#if defined USE_D3D9
IDirect3DVertexShader9 *vert_shader;
IDirect3DPixelShader9 *frag_shader;
ID3DXConstantTable *vert_table, *frag_table;
#elif defined _XBOX
D3DVertexShader *vert_shader;
D3DPixelShader *frag_shader;
ID3DXConstantTable *vert_table, *frag_table;
@@ -92,8 +106,7 @@ void Shader::Destroy(Shader *shader)
Shader::Shader(char const *vert, char const *frag)
: data(new ShaderData())
{
#if defined _XBOX
extern D3DDevice *g_d3ddevice;
#if defined USE_D3D9 || defined _XBOX
ID3DXBuffer *shader_code, *error_msg;
HRESULT hr;
#elif !defined __CELLOS_LV2__
@@ -109,7 +122,7 @@ Shader::Shader(char const *vert, char const *frag)

/* Compile vertex shader */
data->vert_crc = Hash::Crc32(vert);
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
hr = D3DXCompileShader(vert, (UINT)strlen(vert), NULL, NULL, "main",
"vs_2_0", 0, &shader_code, &error_msg,
&data->vert_table);
@@ -148,7 +161,7 @@ Shader::Shader(char const *vert, char const *frag)

/* Compile fragment shader */
data->frag_crc = Hash::Crc32(frag);
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
hr = D3DXCompileShader(frag, (UINT)strlen(frag), NULL, NULL, "main",
"ps_2_0", 0, &shader_code, &error_msg,
&data->frag_table);
@@ -185,7 +198,7 @@ Shader::Shader(char const *vert, char const *frag)
}
#endif

#if !defined _XBOX && !defined __CELLOS_LV2__
#if !defined USE_D3D9 && !defined _XBOX && !defined __CELLOS_LV2__
/* Create program */
data->prog_id = glCreateProgram();
glAttachShader(data->prog_id, data->vert_id);
@@ -198,7 +211,7 @@ Shader::Shader(char const *vert, char const *frag)

int Shader::GetAttribLocation(char const *attr) const
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
/* FIXME: do we have attribs? */
return 0;
#elif !defined __CELLOS_LV2__
@@ -211,9 +224,9 @@ int Shader::GetAttribLocation(char const *attr) const

int Shader::GetUniformLocation(char const *uni) const
{
#if defined _XBOX
D3DXHANDLE hr1 = data->frag_table->GetConstantByName(NULL, uni);
D3DXHANDLE hr2 = data->vert_table->GetConstantByName(NULL, uni);
#if defined USE_D3D9 || defined _XBOX
UINT hr1 = (uintptr_t)data->frag_table->GetConstantByName(NULL, uni);
UINT hr2 = (uintptr_t)data->vert_table->GetConstantByName(NULL, uni);
return (int)(((uint32_t)hr1 << 16) | (uint32_t)hr2);
#elif !defined __CELLOS_LV2__
return glGetUniformLocation(data->prog_id, uni);
@@ -229,7 +242,7 @@ int Shader::GetUniformLocation(char const *uni) const

void Shader::SetUniform(int uni, float f)
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
SetUniform(uni, vec4(f, 0, 0, 0));
#elif !defined __CELLOS_LV2__
glUniform1f(uni, f);
@@ -240,7 +253,7 @@ void Shader::SetUniform(int uni, float f)

void Shader::SetUniform(int uni, vec2 const &v)
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
SetUniform(uni, vec4(v, 0, 0));
#elif !defined __CELLOS_LV2__
glUniform2f(uni, v.x, v.y);
@@ -251,7 +264,7 @@ void Shader::SetUniform(int uni, vec2 const &v)

void Shader::SetUniform(int uni, vec3 const &v)
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
SetUniform(uni, vec4(v, 0));
#elif !defined __CELLOS_LV2__
glUniform3f(uni, v.x, v.y, v.z);
@@ -263,10 +276,9 @@ void Shader::SetUniform(int uni, vec3 const &v)
void Shader::SetUniform(int uni, vec4 const &v)
{
/* FIXME: use the array versions of these functions */
#if defined _XBOX
extern D3DDevice *g_d3ddevice;
D3DXHANDLE hr1 = (uint32_t)uni >> 16;
D3DXHANDLE hr2 = (uint32_t)(uint16_t)uni;
#if defined USE_D3D9 || defined _XBOX
UINT hr1 = (uint32_t)uni >> 16;
UINT hr2 = (uint32_t)(uint16_t)uni;
g_d3ddevice->SetPixelShaderConstantF(hr1, &v[0], 1);
g_d3ddevice->SetVertexShaderConstantF(hr2, &v[0], 1);
#elif !defined __CELLOS_LV2__
@@ -278,10 +290,9 @@ void Shader::SetUniform(int uni, vec4 const &v)

void Shader::SetUniform(int uni, mat4 const &m)
{
#if defined _XBOX
extern D3DDevice *g_d3ddevice;
D3DXHANDLE hr1 = (uint32_t)uni >> 16;
D3DXHANDLE hr2 = (uint32_t)(uint16_t)uni;
#if defined USE_D3D9 || defined _XBOX
UINT hr1 = (uint32_t)uni >> 16;
UINT hr2 = (uint32_t)(uint16_t)uni;
g_d3ddevice->SetPixelShaderConstantF(hr1, &m[0][0], 4);
g_d3ddevice->SetVertexShaderConstantF(hr2, &m[0][0], 4);
#elif !defined __CELLOS_LV2__
@@ -293,10 +304,10 @@ void Shader::SetUniform(int uni, mat4 const &m)

void Shader::Bind() const
{
#if defined _XBOX
extern D3DDevice *g_d3ddevice;
g_d3ddevice->SetVertexShader(data->vert_shader);
g_d3ddevice->SetPixelShader(data->frag_shader);
#if defined USE_D3D9 || defined _XBOX
HRESULT hr;
hr = g_d3ddevice->SetVertexShader(data->vert_shader);
hr = g_d3ddevice->SetPixelShader(data->frag_shader);
#elif !defined __CELLOS_LV2__
glUseProgram(data->prog_id);
#else
@@ -309,8 +320,7 @@ void Shader::Bind() const

Shader::~Shader()
{
#if defined _XBOX
extern D3DDevice *g_d3ddevice;
#if defined USE_D3D9 || defined _XBOX
data->vert_shader->Release();
data->vert_table->Release();
data->frag_shader->Release();
@@ -333,7 +343,7 @@ int ShaderData::GetVersion()
{
static int version = 0;

#if !defined _XBOX && !defined __CELLOS_LV2__
#if !defined USE_D3D9 && !defined _XBOX && !defined __CELLOS_LV2__
if (!version)
{
char buf[4096];


+ 2
- 2
src/gradient.cpp 파일 보기

@@ -32,7 +32,7 @@ class GradientData

private:
Shader *shader;
#if !defined _XBOX /* This file is meaningless on Xbox */
#if !defined USE_D3D9 && !defined _XBOX /* This file is meaningless on Xbox */

GLuint bufs[2];
#if defined HAVE_GL_2X && !defined __APPLE__
@@ -65,7 +65,7 @@ void Gradient::TickDraw(float deltams)
{
Entity::TickDraw(deltams);

#if !defined _XBOX /* This file is meaningless on Xbox */
#if !defined USE_D3D9 && !defined _XBOX /* This file is meaningless on Xbox */
if (!data->shader)
{
#if !defined __CELLOS_LV2__


+ 26
- 1
src/platform/sdl/sdlapp.cpp 파일 보기

@@ -14,6 +14,10 @@

#if defined USE_SDL
# include <SDL.h>
# if defined USE_D3D9
# include <d3d9.h>
# include <SDL_syswm.h>
# endif
#endif

#include "core.h"
@@ -21,6 +25,10 @@
#include "platform/sdl/sdlapp.h"
#include "platform/sdl/sdlinput.h"

#if defined USE_D3D9
HWND g_hwnd = NULL;
#endif

namespace lol
{

@@ -51,12 +59,20 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) :
exit(EXIT_FAILURE);
}

# if defined USE_D3D9
SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 16, 0);
SDL_SysWMinfo wminfo;
SDL_VERSION(&wminfo.version);
SDL_GetWMInfo(&wminfo);
g_hwnd = wminfo.window;
# else
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 0, SDL_OPENGL);
# endif
if (!video)
{
Log::Error("cannot create OpenGL screen: %s\n", SDL_GetError());
Log::Error("cannot create rendering window: %s\n", SDL_GetError());
SDL_Quit();
exit(EXIT_FAILURE);
}
@@ -84,10 +100,19 @@ void SdlApp::Run()
{
while (!Ticker::Finished())
{
#if defined USE_SDL && defined USE_D3D9
extern IDirect3DDevice9 *g_d3ddevice;
g_d3ddevice->BeginScene();
#endif
/* Tick the renderer, show the frame and clamp to desired framerate. */
Ticker::TickDraw();
#if defined USE_SDL
# if defined USE_D3D9
g_d3ddevice->EndScene();
g_d3ddevice->Present(NULL, NULL, NULL, NULL);
# else
SDL_GL_SwapBuffers();
# endif
#endif
}
}


+ 11
- 11
src/scene.cpp 파일 보기

@@ -60,7 +60,7 @@ private:
int ntiles;
float angle;

#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: Scene not implemented")
@@ -90,7 +90,7 @@ Scene::Scene(float angle)
data->ntiles = 0;
data->angle = angle;

#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: Scene::Scene() not implemented")
@@ -108,7 +108,7 @@ Scene::Scene(float angle)

Scene::~Scene()
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: Scene::~Scene() not implemented")
@@ -144,7 +144,7 @@ void Scene::Reset()

void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale)
{
#if !defined _XBOX /* No WPOS on Xbox */
#if !defined USE_D3D9 && !defined _XBOX
if ((data->ntiles % 1024) == 0)
data->tiles = (Tile *)realloc(data->tiles,
(data->ntiles + 1024) * sizeof(Tile));
@@ -161,7 +161,7 @@ void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale)

void Scene::Render() // XXX: rename to Blit()
{
#if !defined _XBOX /* No WPOS on Xbox */
#if !defined USE_D3D9 && !defined _XBOX /* No WPOS on Xbox, what about Win32? */
if (!stdshader)
{
#if !defined _XBOX && !defined __CELLOS_LV2__
@@ -343,7 +343,7 @@ void Scene::Render() // XXX: rename to Blit()
uni_mat = stdshader->GetUniformLocation("model_matrix");
stdshader->SetUniform(uni_mat, data->model_matrix);

#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: Scene::Render() not implemented")
@@ -358,7 +358,7 @@ void Scene::Render() // XXX: rename to Blit()
//cgGLSetParameter1i((CGparameter)(intptr_t)uni_tex, 0);
#endif

#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: Scene::Render() not implemented")
@@ -380,7 +380,7 @@ void Scene::Render() // XXX: rename to Blit()

for (int buf = 0, i = 0, n; i < data->ntiles; i = n, buf += 2)
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: Scene::Render() not implemented")
@@ -422,7 +422,7 @@ void Scene::Render() // XXX: rename to Blit()
#if defined HAVE_GL_2X && !defined __APPLE__
glBindVertexArray(data->vao);
#endif
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: Scene::Render() not implemented")
@@ -473,7 +473,7 @@ void Scene::Render() // XXX: rename to Blit()
data->tiles = 0;
data->ntiles = 0;

#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: Scene::Render() not implemented")
@@ -489,7 +489,7 @@ void Scene::Render() // XXX: rename to Blit()
#endif
glDisable(GL_BLEND);
#endif
#endif /* _XBOX */
#endif /* _XBOX || USE_D3D9 */
}

} /* namespace lol */


+ 6
- 6
src/tileset.cpp 파일 보기

@@ -46,7 +46,7 @@ private:
float tx, ty;

Image *img;
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet not implemented")
@@ -69,7 +69,7 @@ TileSet::TileSet(char const *path, ivec2 size, ivec2 count)
sprintf(data->name, "<tileset> %s", path);

data->tiles = NULL;
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet::TileSet() not implemented")
@@ -118,7 +118,7 @@ void TileSet::TickDraw(float deltams)
{
if (data->img)
delete data->img;
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet::TickDraw() not implemented")
@@ -131,7 +131,7 @@ void TileSet::TickDraw(float deltams)
}
else if (data->img)
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet::TickDraw() not implemented")
@@ -203,7 +203,7 @@ ivec2 TileSet::GetSize(int tileid) const

void TileSet::Bind()
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet::Bind() not implemented")
@@ -228,7 +228,7 @@ void TileSet::BlitTile(uint32_t id, vec3 pos, int o, vec2 scale,
int dy = o ? 0 : data->size.y * scale.y;
int dz = o ? data->size.y * scale.y : 0;

#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: TileSet::TileSet() not implemented")


+ 36
- 13
src/video.cpp 파일 보기

@@ -14,7 +14,9 @@

#include <cmath>

#if _XBOX
#if defined USE_D3D9
# include <d3d9.h>
#elif defined _XBOX
# include <xtl.h>
# undef near /* Fuck Microsoft */
# undef far /* Fuck Microsoft again */
@@ -30,8 +32,13 @@

using namespace std;

#if defined _XBOX
/* FIXME: g_d3ddevice should never be exported */
#if defined USE_D3D9
IDirect3DDevice9 *g_d3ddevice;
# if defined USE_SDL
extern HWND g_hwnd;
# endif
#elif defined _XBOX
D3DDevice *g_d3ddevice;
#endif

@@ -45,7 +52,11 @@ class VideoData
private:
static mat4 proj_matrix, view_matrix;
static ivec2 saved_viewport;
#if defined _XBOX
#if defined USE_D3D9
static IDirect3D9 *d3d_ctx;
static IDirect3DDevice9 *d3d_dev;
static D3DCOLOR clear_color;
#elif defined _XBOX
static Direct3D *d3d_ctx;
static D3DDevice *d3d_dev;
static D3DCOLOR clear_color;
@@ -56,7 +67,11 @@ mat4 VideoData::proj_matrix;
mat4 VideoData::view_matrix;
ivec2 VideoData::saved_viewport(0, 0);

#if defined _XBOX
#if defined USE_D3D9
IDirect3D9 *VideoData::d3d_ctx;
IDirect3DDevice9 *VideoData::d3d_dev;
D3DCOLOR VideoData::clear_color;
#elif defined _XBOX
Direct3D *VideoData::d3d_ctx;
D3DDevice *VideoData::d3d_dev;
D3DCOLOR VideoData::clear_color;
@@ -68,7 +83,7 @@ D3DCOLOR VideoData::clear_color;

void Video::Setup(ivec2 size)
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
VideoData::d3d_ctx = Direct3DCreate9(D3D_SDK_VERSION);
if (!VideoData::d3d_ctx)
{
@@ -76,15 +91,22 @@ void Video::Setup(ivec2 size)
exit(EXIT_FAILURE);
}

HWND window = 0;
D3DPRESENT_PARAMETERS d3dpp;
memset(&d3dpp, 0, sizeof(d3dpp));

# if defined USE_SDL
window = g_hwnd;
d3dpp.hDeviceWindow = g_hwnd;
d3dpp.Windowed = TRUE;
# elif defined _XBOX
XVIDEO_MODE VideoMode;
XGetVideoMode( &VideoMode );
if (size.x > VideoMode.dwDisplayWidth)
size.x = VideoMode.dwDisplayWidth;
if (size.y > VideoMode.dwDisplayHeight)
size.y = VideoMode.dwDisplayHeight;
# endif
VideoData::saved_viewport = size;

VideoData::clear_color = D3DCOLOR_XRGB(26, 51, 77);
@@ -98,9 +120,10 @@ void Video::Setup(ivec2 size)
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;

if (FAILED(VideoData::d3d_ctx->CreateDevice(0, D3DDEVTYPE_HAL, NULL,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &VideoData::d3d_dev)))
HRESULT hr = VideoData::d3d_ctx->CreateDevice(0, D3DDEVTYPE_HAL, window,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &VideoData::d3d_dev);
if (FAILED(hr))
{
Log::Error("cannot create D3D device\n");
exit(EXIT_FAILURE);
@@ -177,7 +200,7 @@ void Video::SetFov(float theta)

void Video::SetDepth(bool set)
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x
# define STR(x) STR0(x)
# pragma message(__FILE__ "(" STR(__LINE__) "): warning: Video::SetDepth() not implemented")
@@ -191,7 +214,7 @@ void Video::SetDepth(bool set)

void Video::SetClearColor(vec4 color)
{
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
VideoData::clear_color = D3DCOLOR_XRGB((int)(color.r * 255.999f),
(int)(color.g * 255.999f),
(int)(color.b * 255.999f));
@@ -203,7 +226,7 @@ void Video::SetClearColor(vec4 color)
void Video::Clear()
{
ivec2 size = GetSize();
#if defined _XBOX
#if defined USE_D3D9 || defined _XBOX
VideoData::d3d_dev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER
| D3DCLEAR_STENCIL,
VideoData::clear_color, 1.0f, 0);
@@ -222,7 +245,7 @@ void Video::Destroy()

void Video::Capture(uint32_t *buffer)
{
#if _XBOX
#if defined USE_D3D9 || defined _XBOX
/* TODO */
#else
GLint v[4];
@@ -258,7 +281,7 @@ void Video::Capture(uint32_t *buffer)

ivec2 Video::GetSize()
{
#if _XBOX
#if defined USE_D3D9 || defined _XBOX
return VideoData::saved_viewport;
#elif 1
/* GetSize() is called too often on the game thread; we cannot rely on


+ 25
- 12
test/tutorial/tut01.cpp 파일 보기

@@ -19,6 +19,12 @@
using namespace std;
using namespace lol;

#if defined _WIN32 && defined USE_D3D9
# define FAR
# define NEAR
# include <d3d9.h>
#endif

#if USE_SDL && defined __APPLE__
# include <SDL_main.h>
#endif
@@ -32,6 +38,12 @@ using namespace lol;
# include <direct.h>
#endif

#if defined USE_D3D9
extern IDirect3DDevice9 *g_d3ddevice;
#elif defined _XBOX
extern D3DDevice *g_d3ddevice;
#endif

class Triangle : public WorldEntity
{
public:
@@ -50,7 +62,7 @@ public:
if (!m_ready)
{
m_shader = Shader::Create(
#if !defined __CELLOS_LV2__ && !defined _XBOX
#if !defined __CELLOS_LV2__ && !defined _XBOX && !defined USE_D3D9
"#version 120\n"
"attribute vec2 in_Position;"
"void main(void) {"
@@ -72,21 +84,20 @@ public:
"}"
#endif
);
#if !defined _XBOX
#if !defined _XBOX && !defined USE_D3D9
m_attrib = m_shader->GetAttribLocation("in_Position");
#endif
m_ready = true;

#if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX
#if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX && !defined USE_D3D9
/* Method 1: store vertex buffer on the GPU memory */
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertices), m_vertices,
GL_STATIC_DRAW);
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX && !defined USE_D3D9
/* Method 2: upload vertex information at each frame */
#elif defined _XBOX
extern D3DDevice *g_d3ddevice;
#elif defined _XBOX || defined USE_D3D9
D3DVERTEXELEMENT9 const elements[2] =
{
{ 0, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
@@ -108,8 +119,7 @@ public:
}

m_shader->Bind();
#if defined _XBOX
extern D3DDevice *g_d3ddevice;
#if defined _XBOX || defined USE_D3D9
g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
g_d3ddevice->SetVertexDeclaration(m_vdecl);
g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*m_vertices));
@@ -126,13 +136,13 @@ public:
glVertexPointer(3, GL_FLOAT, 0, m_vertices);
#endif

#if defined _XBOX
g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
#if defined _XBOX || defined USE_D3D9
g_d3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 3);
#else
glDrawArrays(GL_TRIANGLES, 0, 3);
#endif

#if defined _XBOX
#if defined _XBOX || defined USE_D3D9
/* FIXME: do we need to unset anything here? */
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__
glDisableVertexAttribArray(m_attrib);
@@ -148,7 +158,10 @@ public:
private:
vec2 m_vertices[3];
Shader *m_shader;
#if defined _XBOX
#if defined USE_D3D9
IDirect3DVertexDeclaration9 *m_vdecl;
IDirect3DVertexBuffer9 *m_vbo;
#elif defined _XBOX
D3DVertexDeclaration *m_vdecl;
D3DVertexBuffer *m_vbo;
#else


+ 22
- 8
test/tutorial/tut02.cpp 파일 보기

@@ -19,6 +19,12 @@
using namespace std;
using namespace lol;

#if defined _WIN32 && defined USE_D3D9
# define FAR
# define NEAR
# include <d3d9.h>
#endif

#if USE_SDL && defined __APPLE__
# include <SDL_main.h>
#endif
@@ -28,6 +34,12 @@ using namespace lol;
# include <direct.h>
#endif

#if defined USE_D3D9
extern IDirect3DDevice9 *g_d3ddevice;
#elif defined _XBOX
extern D3DDevice *g_d3ddevice;
#endif

class Cube : public WorldEntity
{
public:
@@ -92,7 +104,7 @@ public:
if (!m_ready)
{
m_shader = Shader::Create(
#if !defined __CELLOS_LV2__ && !defined _XBOX
#if !defined __CELLOS_LV2__ && !defined _XBOX && !defined USE_D3D9
"#version 120\n"
"attribute vec3 in_Vertex;"
"attribute vec3 in_Color;"
@@ -126,14 +138,14 @@ public:
"}"
#endif
);
#if !defined _XBOX
#if !defined _XBOX && !defined USE_D3D9
m_coord = m_shader->GetAttribLocation("in_Vertex");
m_color = m_shader->GetAttribLocation("in_Color");
#endif
m_mvp = m_shader->GetUniformLocation("in_Matrix");
m_ready = true;

#if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX
#if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ && !defined _XBOX && !defined USE_D3D9
/* Method 1: store vertex buffer on the GPU memory */
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
@@ -147,8 +159,7 @@ public:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(m_indices), m_indices,
GL_STATIC_DRAW);
#elif defined _XBOX
extern D3DDevice *g_d3ddevice;
#elif defined _XBOX || defined USE_D3D9
D3DVERTEXELEMENT9 const elements[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
@@ -191,8 +202,7 @@ public:

m_shader->Bind();
m_shader->SetUniform(m_mvp, m_matrix);
#if defined _XBOX
extern D3DDevice *g_d3ddevice;
#if defined _XBOX || defined USE_D3D9
g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
g_d3ddevice->SetVertexDeclaration(m_vdecl);
g_d3ddevice->SetStreamSource(0, m_vbo, 0, sizeof(*m_vertices));
@@ -232,7 +242,11 @@ private:
vec3 m_colors[8];
i16vec3 m_indices[12];
Shader *m_shader;
#if defined _XBOX
#if defined USE_D3D9
IDirect3DVertexDeclaration9 *m_vdecl;
IDirect3DVertexBuffer9 *m_vbo, *m_cbo;
IDirect3DIndexBuffer9 *m_ibo;
#elif defined _XBOX
D3DVertexDeclaration *m_vdecl;
D3DVertexBuffer *m_vbo, *m_cbo;
D3DIndexBuffer *m_ibo;


+ 3
- 3
win32/Lol.Rules.props 파일 보기

@@ -10,7 +10,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<FloatingPointModel>Fast</FloatingPointModel>
<AdditionalIncludeDirectories>$(SolutionDir)\..\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Platform)'=='Win32'">$(GlIncludes);$(SdlIncludes);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Platform)'=='Win32'">$(GlIncludes);$(SdlIncludes);$(D3d9Includes);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Platform)'=='Win32'">WIN32;$(Win32Defines);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Platform)'=='Xbox 360'">_XBOX;$(XboxDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BufferSecurityCheck Condition="'$(Platform)'=='Xbox 360'">false</BufferSecurityCheck>
@@ -32,8 +32,8 @@
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<!-- FIXME: not for the static library! -->
<AdditionalDependencies Condition="'$(Platform)'=='Win32'">kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;$(SdlDeps);$(GdiDeps);$(GlDeps);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories Condition="'$(Platform)'=='Win32'">$(SdlLibs);$(GlLibs);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies Condition="'$(Platform)'=='Win32'">kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;$(SdlDeps);$(GdiDeps);$(GlDeps);$(D3d9Deps);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories Condition="'$(Platform)'=='Win32'">$(SdlLibs);$(GlLibs);$(D3d9Libs);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Debug|Xbox 360'">xapilibd.lib;d3d9d.lib;d3dx9d.lib;xgraphicsd.lib;xboxkrnl.lib;xnetd.lib;xaudiod2.lib;xactd3.lib;x3daudiod.lib;xmcored.lib;xbdm.lib;vcompd.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Release|Xbox 360'">xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>


+ 38
- 19
win32/Lol.Vars.props 파일 보기

@@ -3,45 +3,64 @@
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros">
<ContribDir>$(SolutionDir)\..\contrib</ContribDir>
<GlewDir>$(ContribDir)\glew-1.7.0</GlewDir>
<GtkDir>$(ContribDir)\gtk-2.22.1</GtkDir>
<GtkGlDir>$(ContribDir)\gtkglarea-2.0.1</GtkGlDir>
<!-- SDL -->
<SdlDir>$(ContribDir)\sdl-1.2.14</SdlDir>
<SdlImageDir>$(ContribDir)\sdl-image-1.2.10</SdlImageDir>
<SdlMixerDir>$(ContribDir)\sdl-mixer-1.2.11</SdlMixerDir>
<GlIncludes>$(GlewDir)\include\GL</GlIncludes>
<GtkIncludes>$(GtkDir)\lib\glib-2.0\include;$(GtkDir)\lib\gtk-2.0\include;$(GtkDir)\include\glib-2.0;$(GtkDir)\include\gtk-2.0;$(GtkDir)\include\cairo;$(GtkDir)\include\pango-1.0;$(GtkDir)\include\gdk-pixbuf-2.0;$(GtkDir)\include\atk-1.0;$(GtkGlDir)\include</GtkIncludes>
<SdlIncludes>$(SdlDir)\include;$(SdlImageDir)\include;$(SdlMixerDir)\include</SdlIncludes>
<GlLibs>$(GlewDir)\lib\i686-w64-mingw32</GlLibs>
<GtkLibs>$(GtkDir)\lib;$(GtkDir)\bin;$(GtkGlDir)\lib</GtkLibs>
<SdlLibs>$(SdlDir)\lib\i686-w64-mingw32;$(SdlImageDir)\lib\i686-w64-mingw32;$(SdlMixerDir)\lib\i686-w64-mingw32</SdlLibs>
<SdlDeps>SDL.lib;SDLmain.lib;SDL_image.lib;SDL_mixer.lib</SdlDeps>
<!-- GTK+ & GtkGl -->
<GtkDir>$(ContribDir)\gtk-2.22.1</GtkDir>
<GtkGlDir>$(ContribDir)\gtkglarea-2.0.1</GtkGlDir>
<GtkIncludes>$(GtkDir)\lib\glib-2.0\include;$(GtkDir)\lib\gtk-2.0\include;$(GtkDir)\include\glib-2.0;$(GtkDir)\include\gtk-2.0;$(GtkDir)\include\cairo;$(GtkDir)\include\pango-1.0;$(GtkDir)\include\gdk-pixbuf-2.0;$(GtkDir)\include\atk-1.0;$(GtkGlDir)\include</GtkIncludes>
<GtkLibs>$(GtkDir)\lib;$(GtkDir)\bin;$(GtkGlDir)\lib</GtkLibs>
<GtkDeps>gobject-2.0.lib;gthread-2.0.lib;glib-2.0.lib;gdk-win32-2.0.lib;gtk-win32-2.0.lib;gtkgl-2.0.lib</GtkDeps>
<!-- GDI+ -->
<GdiDeps>Gdiplus.lib</GdiDeps>
<!-- OpenGL & GLEW -->
<GlewDir>$(ContribDir)\glew-1.7.0</GlewDir>
<GlIncludes>$(GlewDir)\include\GL</GlIncludes>
<GlLibs>$(GlewDir)\lib\i686-w64-mingw32</GlLibs>
<GlDeps>opengl32.lib;glew32.lib</GlDeps>
<GtkDeps>gobject-2.0.lib;gthread-2.0.lib;glib-2.0.lib;gdk-win32-2.0.lib;gtk-win32-2.0.lib;gtkgl-2.0.lib</GtkDeps>
<SdlDeps>SDL.lib;SDLmain.lib;SDL_image.lib;SDL_mixer.lib</SdlDeps>
<Win32Defines>USE_GLEW;GLEW_STATIC;HAVE_SDL_H;USE_SDL;USE_GDIPLUS</Win32Defines>
<!-- Direct3D 9 -->
<D3d9Includes>$(DXSDK_DIR)\Include</D3d9Includes>
<D3d9Libs Condition="'$(Platform)'=='Win32'">$(DXSDK_DIR)\Lib\x86</D3d9Libs>
<D3d9Libs Condition="'$(Platform)'=='Win64'">$(DXSDK_DIR)\Lib\x64</D3d9Libs>
<D3d9Deps Condition="'$(Configuration)'=='Release'">d3d9.lib;d3dx9.lib</D3d9Deps>
<D3d9Deps Condition="'$(Configuration)'=='Debug'">d3d9.lib;d3dx9d.lib</D3d9Deps>
<Win32Defines>HAVE_SDL_H;USE_SDL;USE_GDIPLUS;USE_D3D9</Win32Defines>
<XboxDefines></XboxDefines>
</PropertyGroup>
<PropertyGroup />
<ItemDefinitionGroup />
<ItemGroup>
<BuildMacro Include="ContribDir"><Value>$(ContribDir)</Value></BuildMacro>
<BuildMacro Include="GlewDir"><Value>$(GlewDir)</Value></BuildMacro>
<BuildMacro Include="GtkDir"><Value>$(GtkDir)</Value></BuildMacro>
<BuildMacro Include="GtkGlDir"><Value>$(GtkGlDir)</Value></BuildMacro>
<BuildMacro Include="SdlDir"><Value>$(SdlDir)</Value></BuildMacro>
<BuildMacro Include="SdlImageDir"><Value>$(SdlImageDir)</Value></BuildMacro>
<BuildMacro Include="SdlMixerDir"><Value>$(SdlMixerDir)</Value></BuildMacro>
<BuildMacro Include="GlIncludes"><Value>$(GlIncludes)</Value></BuildMacro>
<BuildMacro Include="GtkIncludes"><Value>$(GtkIncludes)</Value></BuildMacro>
<BuildMacro Include="SdlIncludes"><Value>$(SdlIncludes)</Value></BuildMacro>
<BuildMacro Include="GlLibs"><Value>$(GlLibs)</Value></BuildMacro>
<BuildMacro Include="GtkLibs"><Value>$(GtkLibs)</Value></BuildMacro>
<BuildMacro Include="SdlLibs"><Value>$(SdlLibs)</Value></BuildMacro>
<BuildMacro Include="SdlDeps"><Value>$(SdlDeps)</Value></BuildMacro>
<BuildMacro Include="GtkDir"><Value>$(GtkDir)</Value></BuildMacro>
<BuildMacro Include="GtkGlDir"><Value>$(GtkGlDir)</Value></BuildMacro>
<BuildMacro Include="GtkIncludes"><Value>$(GtkIncludes)</Value></BuildMacro>
<BuildMacro Include="GtkLibs"><Value>$(GtkLibs)</Value></BuildMacro>
<BuildMacro Include="GtkDeps"><Value>$(GtkDeps)</Value></BuildMacro>
<BuildMacro Include="GdiDeps"><Value>$(GdiDeps)</Value></BuildMacro>
<BuildMacro Include="GlewDir"><Value>$(GlewDir)</Value></BuildMacro>
<BuildMacro Include="GlIncludes"><Value>$(GlIncludes)</Value></BuildMacro>
<BuildMacro Include="GlLibs"><Value>$(GlLibs)</Value></BuildMacro>
<BuildMacro Include="GlDeps"><Value>$(GlDeps)</Value></BuildMacro>
<BuildMacro Include="GtkDeps"><Value>$(GtkDeps)</Value></BuildMacro>
<BuildMacro Include="SdlDeps"><Value>$(SdlDeps)</Value></BuildMacro>
<BuildMacro Include="D3d9Includes"><Value>$(D3d9Includes)</Value></BuildMacro>
<BuildMacro Include="D3d9Libs"><Value>$(D3d9Libs)</Value></BuildMacro>
<BuildMacro Include="D3d9Deps"><Value>$(D3d9Deps)</Value></BuildMacro>
<BuildMacro Include="Win32Defines"><Value>$(Win32Defines)</Value></BuildMacro>
<BuildMacro Include="XboxDefines"><Value>$(XboxDefines)</Value></BuildMacro>
</ItemGroup>


불러오는 중...
취소
저장