diff --git a/.gitignore b/.gitignore index 6d9812f5..e2276f2c 100644 --- a/.gitignore +++ b/.gitignore @@ -82,6 +82,7 @@ _ReSharper.* test/benchsuite test/btphystest test/meshviewer +test/nacl_phystest test/testsuite test/sandbox/sample test/math/pi diff --git a/build/vs2012/Lol.sln b/build/vs2012/Lol.sln index e659b2de..74bfb17b 100644 --- a/build/vs2012/Lol.sln +++ b/build/vs2012/Lol.sln @@ -122,7 +122,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "People", "People", "{5F1AAF EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Peeweek", "Peeweek", "{E27FDF36-50C4-4ED2-8CF5-A20FED016910}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo-peeweek", "..\..\people\peeweek\private\demo-peeweek.vcxproj", "{C2E01551-B636-4324-8461-71811DF6FBB5}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo-peeweek", "..\..\people\peeweek\demo-peeweek.vcxproj", "{C2E01551-B636-4324-8461-71811DF6FBB5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03_noise", "..\..\demos\tutorial\03_noise.vcxproj", "{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}" EndProject @@ -152,11 +152,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07_input", "..\..\demos\tut EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06_sprite", "..\..\demos\tutorial\06_sprite.vcxproj", "{E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "voxel", "..\..\people\benlitz\private\voxel\voxel.vcxproj", "{52493826-AC00-470B-A745-4F602529B3B0}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "voxel", "..\..\people\benlitz\voxel\voxel.vcxproj", "{52493826-AC00-470B-A745-4F602529B3B0}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Puzzle", "..\..\people\benlitz\private\puzzle\Puzzle.vcxproj", "{9F291982-8C81-4105-BF39-16844648E55F}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Puzzle", "..\..\people\benlitz\puzzle\Puzzle.vcxproj", "{9F291982-8C81-4105-BF39-16844648E55F}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lolui", "..\..\people\benlitz\private\lolui\lolui.vcxproj", "{950EDCC1-DF6A-4A75-B083-DFE98E7DD34F}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lolui", "..\..\people\benlitz\lolui\lolui.vcxproj", "{950EDCC1-DF6A-4A75-B083-DFE98E7DD34F}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SinglShot", "SinglShot", "{50509BA3-D27B-4FAC-9772-9EC76146F709}" EndProject @@ -176,6 +176,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Pimp", "Pimp", "{2195FB18-5 EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pimp", "..\..\tools\pimp\pimp.vcxproj", "{FFF58874-D460-41E6-AD65-DBFEC6E47A94}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "squad_shooter", "..\..\people\touky\private\squad_shooter\squad_shooter.vcxproj", "{DB344310-4938-4294-AEE2-18512454585D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ORBIS = Debug|ORBIS diff --git a/configure.ac b/configure.ac index df0da8e6..73590161 100644 --- a/configure.ac +++ b/configure.ac @@ -557,8 +557,8 @@ AC_CONFIG_FILES( people/peeweek/Makefile people/benlitz/Makefile people/benlitz/test1/Makefile - people/benlitz/private/voxel/Makefile - people/benlitz/private/lolui/Makefile + people/benlitz/voxel/Makefile + people/benlitz/lolui/Makefile people/touky/Makefile people/touky/sprite_sorter/Makefile people/touky/squad_shooter/Makefile diff --git a/demos/tutorial/05_easymesh.cpp b/demos/tutorial/05_easymesh.cpp index 7912096c..e9a587d3 100644 --- a/demos/tutorial/05_easymesh.cpp +++ b/demos/tutorial/05_easymesh.cpp @@ -118,32 +118,28 @@ public: if (!m_ready) { + g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); + + /* Upload vertex data to GPU */ + for (int i = 0; i < m_gears.Count(); i++) + m_gears[i].m1.MeshConvert(); + #if USE_CUSTOM_SHADER - //Custom Shader: Init the shader - m_custom_shader = Shader::Create(LOLFX_RESOURCE_NAME(shiny)); + /* Custom Shader: Init the shader */ + Shader *custom_shader = Shader::Create(LOLFX_RESOURCE_NAME(shiny)); // any other shader stuf here (Get uniform, mostly, and set texture) -#endif //USE_CUSTOM_SHADER - g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); for (int i = 0; i < m_gears.Count(); i++) - { -#if USE_CUSTOM_SHADER - //Custom shader, Convert by setuping a shaderData with the vertex useage. - //DefaultShaderData is only a basic class, if needed, don't hesitate to create your own - m_gears[i].m1.MeshConvert(new DefaultShaderData( - ((1 << VertexUsage::Position) | - (1 << VertexUsage::Normal) | - (1 << VertexUsage::Color)), - m_custom_shader, false)); -#else //USE_CUSTOM_SHADER - m_gears[i].m1.MeshConvert(); -#endif //USE_CUSTOM_SHADER - } + m_gears[i].m1.SetMaterial(custom_shader); +#endif + m_ready = true; } for (int i = 0; i < m_gears.Count(); i++) - m_gears[i].m1.Render(m_mat * m_gears[i].m2); + { + g_scene->AddPrimitive(m_gears[i].m1, m_mat * m_gears[i].m2); + } } private: diff --git a/src/core.h b/src/core.h index 0981b157..5b0f6d21 100644 --- a/src/core.h +++ b/src/core.h @@ -137,8 +137,10 @@ static inline int isnan(float f) /* External declaration for LolFx files. */ #define LOLFX_RESOURCE_DECLARE(name) \ - extern "C" char const *LOLFX_RESOURCE_NAME(name) -#define LOLFX_RESOURCE_NAME(name) lolfx_resource_##name + extern "C" char const *lolfx_resource_##name +#define LOLFX_RESOURCE_HELPER(name) #name ".lolfx" +#define LOLFX_RESOURCE_NAME(name) \ + LOLFX_RESOURCE_HELPER(name), lolfx_resource_##name /* If using NaCl or Android, override main() with our version */ #if defined __native_client__ diff --git a/src/easymesh/easymesh.cpp b/src/easymesh/easymesh.cpp index baf568b3..d2f5976f 100644 --- a/src/easymesh/easymesh.cpp +++ b/src/easymesh/easymesh.cpp @@ -22,6 +22,8 @@ #include "core.h" #include "easymesh/easymesh-compiler.h" +LOLFX_RESOURCE_DECLARE(shiny); + namespace lol { @@ -40,7 +42,6 @@ EasyMesh::EasyMesh(const EasyMesh& em) m_vert = em.m_vert; m_cursors = em.m_cursors; m_build_data = nullptr; - m_gpu_data = GpuEasyMeshData(); if (em.m_build_data) m_build_data = new EasyMeshBuildData(*em.m_build_data); if (m_indices.Count() && m_vert.Count() && m_cursors.Count()) @@ -64,6 +65,49 @@ bool EasyMesh::Compile(char const *command, bool Execute) return res; } +void EasyMesh::MeshConvert() +{ + /* Default material */ + Shader *shader = Shader::Create(LOLFX_RESOURCE_NAME(shiny)); + + /* Push index buffer to GPU */ + IndexBuffer *ibo = new IndexBuffer(m_indices.Count() * sizeof(uint16_t)); + uint16_t *indices = (uint16_t *)ibo->Lock(0, 0); + for (int i = 0; i < m_indices.Count(); ++i) + indices[i] = m_indices[i]; + ibo->Unlock(); + + /* Push vertex buffer to GPU */ + struct Vertex + { + vec3 pos, normal; + u8vec4 color; + vec4 texcoord; + }; + + VertexDeclaration *vdecl = new VertexDeclaration( + VertexStream(VertexUsage::Position, + VertexUsage::Normal, + VertexUsage::Color, + VertexUsage::TexCoord)); + + VertexBuffer *vbo = new VertexBuffer(m_vert.Count() * sizeof(Vertex)); + Vertex *vert = (Vertex *)vbo->Lock(0, 0); + for (int i = 0; i < m_vert.Count(); ++i) + { + vert[i].pos = m_vert[i].m_coord, + vert[i].normal = m_vert[i].m_normal, + vert[i].color = (u8vec4)(m_vert[i].m_color * 255.f); + vert[i].texcoord = m_vert[i].m_texcoord; + } + vbo->Unlock(); + + /* Reference our new data in our submesh */ + m_submeshes.Push(new SubMesh(shader, vdecl)); + m_submeshes.Last()->SetIndexBuffer(ibo); + m_submeshes.Last()->SetVertexBuffer(0, vbo); +} + //----------------------------------------------------------------------------- #define EZSET(M0) BD()->CmdStack().GetValue(M0); #define EZDEF_1(T0) T0 m0; EZSET(m0) @@ -228,51 +272,6 @@ void EasyMesh::CloseBrace() m_cursors.Pop(); } -//----------------------------------------------------------------------------- -void EasyMesh::MeshConvert(GpuShaderData* new_gpu_sdata) -{ - delete(m_build_data); - m_build_data = nullptr; - - if (new_gpu_sdata) - { - m_gpu_data.AddGpuData(new_gpu_sdata, this); - for (int i = DebugRenderMode::Default; i < DebugRenderMode::Max; i++) - if (!m_gpu_data.HasData(i)) - m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode(i)), this); - } - m_state = MeshRender::CanRender; -} - -//----------------------------------------------------------------------------- -void EasyMesh::MeshConvert(Shader* provided_shader) -{ - if (provided_shader) - { - GpuShaderData *new_gpu_sdata = new DefaultShaderData(((1 << VertexUsage::Position) | - (1 << VertexUsage::Normal) | - (1 << VertexUsage::Color)), - provided_shader, - false); - m_gpu_data.AddGpuData(new_gpu_sdata, this); - } - else - m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode::Default), this); - for (int i = DebugRenderMode::Default + 1; i < DebugRenderMode::Max; i++) - m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode(i)), this); - m_state = MeshRender::CanRender; -} - -//----------------------------------------------------------------------------- -bool EasyMesh::Render(mat4 const &model, int render_mode) -{ - if (m_state == MeshRender::CanRender) - { - m_gpu_data.RenderMeshData(model, render_mode); - return true; - } - return false; -} //----------------------------------------------------------------------------- bool EasyMesh::SetRender(bool should_render) diff --git a/src/easymesh/easymesh.h b/src/easymesh/easymesh.h index 9a5fbb32..b1b26077 100644 --- a/src/easymesh/easymesh.h +++ b/src/easymesh/easymesh.h @@ -48,7 +48,7 @@ LOL_SAFE_ENUM(MeshTransform, Shear ); -class EasyMesh +class EasyMesh : public Mesh { friend class EasyMeshParser; friend class GpuEasyMeshData; @@ -57,13 +57,11 @@ public: EasyMesh(); EasyMesh(const EasyMesh& em); - bool Compile(char const *command, bool Execute=true); - void ExecuteCmdStack(bool ExecAllStack=true); - void MeshConvert(GpuShaderData* new_gpu_sdata); - void MeshConvert(Shader* ProvidedShader = nullptr); - bool Render(mat4 const &model, int render_mode=Video::GetDebugRenderMode()); - MeshRender GetMeshState() { return m_state; } - bool SetRender(bool should_render); + bool Compile(char const *command, bool Execute = true); + void ExecuteCmdStack(bool ExecAllStack = true); + void MeshConvert(); + MeshRender GetMeshState() { return m_state; } + bool SetRender(bool should_render); private: void UpdateVertexDict(Array< int, int > &vertex_dict); @@ -73,6 +71,7 @@ private: //------------------------------------------------------------------------- private: void MeshCsg(CSGUsage csg_operation); + public: /* [cmd:csgu] Performs a Union operation as (mesh0_Outside + mesh1_Outside) */ void CsgUnion() { MeshCsg(CSGUsage::Union); } @@ -386,7 +385,6 @@ public: Array m_cursors; MeshRender m_state; - GpuEasyMeshData m_gpu_data; public: inline EasyMeshBuildData* BD() diff --git a/src/easymesh/easymeshrender.cpp b/src/easymesh/easymeshrender.cpp index ea489309..c9dbbe5f 100644 --- a/src/easymesh/easymeshrender.cpp +++ b/src/easymesh/easymeshrender.cpp @@ -120,9 +120,10 @@ DefaultShaderData::DefaultShaderData(uint16_t vert_decl_flags, Shader* shader, b SetupDefaultData(with_UV); } -static const String DefaultUniforms[7] = +static const String DefaultUniforms[8] = { String("u_lights"), + String("u_model"), String("u_modelview"), String("u_view"), String("u_inv_view"), @@ -160,12 +161,13 @@ void DefaultShaderData::SetupShaderDatas(mat4 const &model) /* FIXME: GetUniform("blabla") is costly */ for (int i = 0; i < lights.Count(); ++i) light_data << vec4(lights[i]->GetPosition(), lights[i]->GetType()) << lights[i]->GetColor(); - while (light_data.Count() < 8) + while (light_data.Count() < LOL_MAX_LIGHT_COUNT) light_data << vec4::zero << vec4::zero; int i = 0; m_shader->SetUniform(*GetUniform(DefaultUniforms[i++]), light_data); + m_shader->SetUniform(*GetUniform(DefaultUniforms[i++]), model); m_shader->SetUniform(*GetUniform(DefaultUniforms[i++]), modelview); m_shader->SetUniform(*GetUniform(DefaultUniforms[i++]), view); m_shader->SetUniform(*GetUniform(DefaultUniforms[i++]), inverse(view)); diff --git a/src/easymesh/shiny.lolfx b/src/easymesh/shiny.lolfx index 5be91d49..3b071bc1 100644 --- a/src/easymesh/shiny.lolfx +++ b/src/easymesh/shiny.lolfx @@ -8,7 +8,7 @@ attribute vec4 in_Color; uniform mat4 u_modelview; uniform mat4 u_view; -uniform mat4 u_proj; +uniform mat4 u_projection; uniform mat3 u_normalmat; varying vec4 pass_Vertex; /* View space */ @@ -24,7 +24,7 @@ void main(void) pass_TNormal = tnorm; pass_Color = in_Color; - gl_Position = u_proj * vertex; + gl_Position = u_projection * vertex; } [frag.glsl] @@ -138,7 +138,7 @@ void main(float3 in_Vertex : POSITION, float3 in_Normal : NORMAL, float4 in_Color : COLOR, uniform float4x4 u_modelview, - uniform float4x4 u_proj, + uniform float4x4 u_projection, uniform float3x3 u_normalmat, out float4 pass_Vertex : TEXCOORD0, out float3 pass_TNormal : TEXCOORD1, @@ -156,7 +156,7 @@ void main(float3 in_Vertex : POSITION, pass_Color = in_Color; #endif - out_Position = mul(u_proj, eye); + out_Position = mul(u_projection, eye); } [frag.hlsl] diff --git a/src/easymesh/shiny_SK.lolfx b/src/easymesh/shiny_SK.lolfx index c59b7413..2d663498 100644 --- a/src/easymesh/shiny_SK.lolfx +++ b/src/easymesh/shiny_SK.lolfx @@ -10,7 +10,7 @@ attribute vec2 in_Weight; uniform mat4 u_modelview; uniform mat4 u_view; -uniform mat4 u_proj; +uniform mat4 u_projection; uniform mat3 u_normalmat; //10is not a fix idea, should be more. uniform mat4 in_BoneList[10]; @@ -28,7 +28,7 @@ void main(void) pass_TNormal = tnorm; pass_Color = in_Color; - gl_Position = u_proj * vertex; + gl_Position = u_projection * vertex; } [frag.glsl] @@ -163,7 +163,7 @@ void main(float3 in_Vertex : POSITION, float3 in_Normal : NORMAL, float4 in_Color : COLOR, uniform float4x4 u_modelview, - uniform float4x4 u_proj, + uniform float4x4 u_projection, uniform float3x3 u_normalmat, out float4 pass_Vertex : TEXCOORD0, out float3 pass_TNormal : TEXCOORD1, @@ -181,7 +181,7 @@ void main(float3 in_Vertex : POSITION, pass_Color = in_Color; #endif - out_Position = mul(u_proj, eye); + out_Position = mul(u_projection, eye); } [frag.hlsl] diff --git a/src/easymesh/shinydebugUV.lolfx b/src/easymesh/shinydebugUV.lolfx index f9e9bfd9..df9cdf7c 100644 --- a/src/easymesh/shinydebugUV.lolfx +++ b/src/easymesh/shinydebugUV.lolfx @@ -9,7 +9,7 @@ attribute vec2 in_TexCoord; uniform mat4 u_modelview; uniform mat4 u_view; -uniform mat4 u_proj; +uniform mat4 u_projection; uniform mat3 u_normalmat; varying vec4 pass_Vertex; /* View space */ @@ -27,7 +27,7 @@ void main(void) pass_Color = in_Color; pass_TexCoord = in_TexCoord; - gl_Position = u_proj * vertex; + gl_Position = u_projection * vertex; } [frag.glsl] @@ -97,7 +97,7 @@ void main(float3 in_Vertex : POSITION, float3 in_Normal : NORMAL, float4 in_Color : COLOR, uniform float4x4 u_modelview, - uniform float4x4 u_proj, + uniform float4x4 u_projection, uniform float3x3 u_normalmat, out float4 pass_Vertex : TEXCOORD0, out float3 pass_TNormal : TEXCOORD1, @@ -115,7 +115,7 @@ void main(float3 in_Vertex : POSITION, pass_Color = in_Color; #endif - out_Position = mul(u_proj, eye); + out_Position = mul(u_projection, eye); } [frag.hlsl] diff --git a/src/easymesh/shinydebuglighting.lolfx b/src/easymesh/shinydebuglighting.lolfx index a0f629f8..7bedac4e 100644 --- a/src/easymesh/shinydebuglighting.lolfx +++ b/src/easymesh/shinydebuglighting.lolfx @@ -8,7 +8,7 @@ attribute vec4 in_Color; uniform mat4 u_modelview; uniform mat4 u_view; -uniform mat4 u_proj; +uniform mat4 u_projection; uniform mat3 u_normalmat; varying vec4 pass_Vertex; /* View space */ @@ -24,7 +24,7 @@ void main(void) pass_TNormal = tnorm; pass_Color = vec4(1.0, 1.0, 1.0, in_Color.w);//; - gl_Position = u_proj * vertex; + gl_Position = u_projection * vertex; } [frag.glsl] @@ -97,7 +97,7 @@ void main(float3 in_Vertex : POSITION, float3 in_Normal : NORMAL, float4 in_Color : COLOR, uniform float4x4 u_modelview, - uniform float4x4 u_proj, + uniform float4x4 u_projection, uniform float3x3 u_normalmat, out float4 pass_Vertex : TEXCOORD0, out float3 pass_TNormal : TEXCOORD1, @@ -115,7 +115,7 @@ void main(float3 in_Vertex : POSITION, pass_Color = in_Color; #endif - out_Position = mul(u_proj, eye); + out_Position = mul(u_projection, eye); } [frag.hlsl] diff --git a/src/easymesh/shinydebugnormal.lolfx b/src/easymesh/shinydebugnormal.lolfx index b9192559..eb48b944 100644 --- a/src/easymesh/shinydebugnormal.lolfx +++ b/src/easymesh/shinydebugnormal.lolfx @@ -8,7 +8,7 @@ attribute vec4 in_Color; uniform mat4 u_modelview; uniform mat4 u_view; -uniform mat4 u_proj; +uniform mat4 u_projection; uniform mat3 u_normalmat; varying vec4 pass_Vertex; /* View space */ @@ -24,7 +24,7 @@ void main(void) pass_TNormal = tnorm; pass_Color = in_Color; - gl_Position = u_proj * vertex; + gl_Position = u_projection * vertex; } [frag.glsl] @@ -59,7 +59,7 @@ void main(float3 in_Vertex : POSITION, float3 in_Normal : NORMAL, float4 in_Color : COLOR, uniform float4x4 u_modelview, - uniform float4x4 u_proj, + uniform float4x4 u_projection, uniform float3x3 u_normalmat, out float4 pass_Vertex : TEXCOORD0, out float3 pass_TNormal : TEXCOORD1, @@ -77,7 +77,7 @@ void main(float3 in_Vertex : POSITION, pass_Color = in_Color; #endif - out_Position = mul(u_proj, eye); + out_Position = mul(u_projection, eye); } [frag.hlsl] diff --git a/src/easymesh/shinydebugwireframe.lolfx b/src/easymesh/shinydebugwireframe.lolfx index 3f5399f7..723b285c 100644 --- a/src/easymesh/shinydebugwireframe.lolfx +++ b/src/easymesh/shinydebugwireframe.lolfx @@ -8,7 +8,7 @@ attribute vec4 in_Color; uniform mat4 u_modelview; uniform mat4 u_view; -uniform mat4 u_proj; +uniform mat4 u_projection; uniform mat3 u_normalmat; varying vec4 pass_Vertex; /* View space */ @@ -24,7 +24,7 @@ void main(void) pass_TNormal = tnorm; pass_Color = in_Color; - gl_Position = u_proj * vertex; + gl_Position = u_projection * vertex; } [frag.glsl] @@ -55,7 +55,7 @@ void main(float3 in_Vertex : POSITION, float3 in_Normal : NORMAL, float4 in_Color : COLOR, uniform float4x4 u_modelview, - uniform float4x4 u_proj, + uniform float4x4 u_projection, uniform float3x3 u_normalmat, out float4 pass_Vertex : TEXCOORD0, out float3 pass_TNormal : TEXCOORD1, @@ -73,7 +73,7 @@ void main(float3 in_Vertex : POSITION, pass_Color = in_Color; #endif - out_Position = mul(u_proj, eye); + out_Position = mul(u_projection, eye); } [frag.hlsl] diff --git a/src/easymesh/shinyflat.lolfx b/src/easymesh/shinyflat.lolfx index a93b269b..ee5f1a65 100644 --- a/src/easymesh/shinyflat.lolfx +++ b/src/easymesh/shinyflat.lolfx @@ -8,7 +8,7 @@ attribute vec4 in_Color; uniform mat4 u_modelview; uniform mat4 u_view; -uniform mat4 u_proj; +uniform mat4 u_projection; uniform mat3 u_normalmat; varying vec4 pass_Vertex; /* View space */ @@ -24,7 +24,7 @@ void main(void) pass_TNormal = tnorm; pass_Color = in_Color; - gl_Position = u_proj * vertex; + gl_Position = u_projection * vertex; } [frag.glsl] @@ -141,7 +141,7 @@ void main(float3 in_Vertex : POSITION, float3 in_Normal : NORMAL, float4 in_Color : COLOR, uniform float4x4 u_modelview, - uniform float4x4 u_proj, + uniform float4x4 u_projection, uniform float3x3 u_normalmat, out float4 pass_Vertex : TEXCOORD0, out float3 pass_TNormal : TEXCOORD1, @@ -159,7 +159,7 @@ void main(float3 in_Vertex : POSITION, pass_Color = in_Color; #endif - out_Position = mul(u_proj, eye); + out_Position = mul(u_projection, eye); } [frag.hlsl] diff --git a/src/gpu/indexbuffer.cpp b/src/gpu/indexbuffer.cpp index 30d842a0..fa039ffd 100644 --- a/src/gpu/indexbuffer.cpp +++ b/src/gpu/indexbuffer.cpp @@ -96,6 +96,11 @@ IndexBuffer::~IndexBuffer() delete m_data; } +size_t IndexBuffer::GetSize() +{ + return m_data->m_size; +} + void *IndexBuffer::Lock(size_t offset, size_t size) { if (!m_data->m_size) diff --git a/src/gpu/shader.cpp b/src/gpu/shader.cpp index 3b4ed174..119ecf38 100644 --- a/src/gpu/shader.cpp +++ b/src/gpu/shader.cpp @@ -84,6 +84,8 @@ class ShaderData friend class Shader; private: + String m_name; + #if defined USE_D3D9 IDirect3DDevice9 *m_dev; IDirect3DVertexShader9 *vert_shader; @@ -98,6 +100,7 @@ private: GLuint prog_id, vert_id, frag_id; // Benlitz: using a simple array could be faster since there is never more than a few attribute locations to store Map attrib_locations; + Map attrib_errors; #else CGprogram vert_id, frag_id; #endif @@ -121,16 +124,14 @@ int ShaderData::nshaders = 0; * Public Shader class */ -Shader *Shader::Create(char const *lolfx) +Shader *Shader::Create(String const &name, String const &code) { - char *src = new char[strlen(lolfx) + 2]; - memcpy(src + 1, lolfx, strlen(lolfx) + 1); - src[0] = '\n'; + String src = String("\n") + code; /* Parse the crap */ Array sections; char *key = nullptr; - for (char *parser = src; *parser; ) + for (char *parser = src.C(); *parser; ) { if (key == nullptr && (parser[0] == '\n' || parser[0] == '\r') && parser[1] == '[') @@ -173,9 +174,11 @@ Shader *Shader::Create(char const *lolfx) /* FIXME: we don’t know how to handle these yet. */ if (!vert) - Log::Error("no vertex shader found… sorry, I’m gonna crash now.\n"); + Log::Error("no vertex shader found in %s… sorry, I’m gonna crash now.\n", + name.C()); if (!frag) - Log::Error("no fragment shader found… sorry, I’m gonna crash now.\n"); + Log::Error("no fragment shader found in %s… sorry, I’m gonna crash now.\n", + name.C()); uint32_t new_vert_crc = ShaderData::hash(vert); uint32_t new_frag_crc = ShaderData::hash(frag); @@ -185,16 +188,14 @@ Shader *Shader::Create(char const *lolfx) if (ShaderData::shaders[n]->data->vert_crc == new_vert_crc && ShaderData::shaders[n]->data->frag_crc == new_frag_crc) { - delete[] src; return ShaderData::shaders[n]; } } - Shader *ret = new Shader(vert, frag); + Shader *ret = new Shader(name, vert, frag); ShaderData::shaders[ShaderData::nshaders] = ret; ShaderData::nshaders++; - delete[] src; return ret; } @@ -204,9 +205,12 @@ void Shader::Destroy(Shader *shader) UNUSED(shader); } -Shader::Shader(char const *vert, char const *frag) +Shader::Shader(String const &name, + char const *vert, char const *frag) : data(new ShaderData()) { + data->m_name = name; + #if defined USE_D3D9 || defined _XBOX ID3DXBuffer *shader_code, *error_msg; HRESULT hr; @@ -243,7 +247,7 @@ Shader::Shader(char const *vert, char const *frag) &data->vert_table); if (FAILED(hr)) { - Log::Error("failed to compile vertex shader: %s", + Log::Error("failed to compile vertex shader %s: %s\n", name.C(), error_msg ? error_msg->GetBufferPointer() : "error"); Log::Error("shader source:\n%s\n", vert); } @@ -261,12 +265,13 @@ Shader::Shader(char const *vert, char const *frag) glGetShaderiv(data->vert_id, GL_COMPILE_STATUS, &status); if (status != GL_TRUE) { - Log::Error("failed to compile vertex shader: %s", errbuf); + Log::Error("failed to compile vertex shader %s: %s\n", + name.C(), errbuf); Log::Error("shader source:\n%s\n", shader_code.C()); } else if (len > 16) { - Log::Debug("compile log for vertex shader: %s", errbuf); + Log::Debug("compile log for vertex shader %s: %s\n", name.C(), errbuf); Log::Debug("shader source:\n%s\n", shader_code.C()); } #else @@ -275,7 +280,7 @@ Shader::Shader(char const *vert, char const *frag) nullptr, nullptr); if (data->vert_id == nullptr) { - Log::Error("failed to compile vertex shader"); + Log::Error("failed to compile vertex shader %s\n", name.C()); Log::Error("shader source:\n%s\n", vert); } #endif @@ -288,7 +293,7 @@ Shader::Shader(char const *vert, char const *frag) &data->frag_table); if (FAILED(hr)) { - Log::Error("failed to compile fragment shader: %s", + Log::Error("failed to compile fragment shader %s: %s\n", name.C(), error_msg ? error_msg->GetBufferPointer() : "error"); Log::Error("shader source:\n%s\n", frag); } @@ -306,12 +311,14 @@ Shader::Shader(char const *vert, char const *frag) glGetShaderiv(data->frag_id, GL_COMPILE_STATUS, &status); if (status != GL_TRUE) { - Log::Error("failed to compile fragment shader: %s", errbuf); + Log::Error("failed to compile fragment shader %s: %s\n", + name.C(), errbuf); Log::Error("shader source:\n%s\n", shader_code.C()); } else if (len > 16) { - Log::Debug("compile log for fragment shader: %s", errbuf); + Log::Debug("compile log for fragment shader %s: %s\n", + name.C(), errbuf); Log::Debug("shader source:\n%s\n", shader_code.C()); } #else @@ -320,7 +327,7 @@ Shader::Shader(char const *vert, char const *frag) nullptr, nullptr); if (data->frag_id == nullptr) { - Log::Error("failed to compile fragment shader"); + Log::Error("failed to compile fragment shader %s\n", name.C()); Log::Error("shader source:\n%s\n", frag); } #endif @@ -355,11 +362,11 @@ Shader::Shader(char const *vert, char const *frag) glGetProgramiv(data->prog_id, GL_LINK_STATUS, &status); if (status != GL_TRUE) { - Log::Error("failed to link program: %s", errbuf); + Log::Error("failed to link program %s: %s\n", name.C(), errbuf); } else if (len > 16) { - Log::Debug("link log for program: %s", errbuf); + Log::Debug("link log for program %s: %s\n", name.C(), errbuf); } GLint validated; @@ -367,7 +374,7 @@ Shader::Shader(char const *vert, char const *frag) glGetProgramiv(data->prog_id, GL_VALIDATE_STATUS, &validated); if (validated != GL_TRUE) { - Log::Error("failed to validate program"); + Log::Error("failed to validate program %s\n", name.C()); } GLint num_attribs; @@ -413,10 +420,11 @@ Shader::Shader(char const *vert, char const *frag) uint64_t flags = (uint64_t)(uint16_t)usage.ToScalar() << 16; flags |= (uint64_t)(uint16_t)index; // TODO: this is here just in case. Remove this once everything has been correctly tested -#ifdef _DEBUG +#if _DEBUG if (data->attrib_locations.HasKey(flags)) { - Log::Error("an error occured while parsing attribute semantics"); + Log::Error("error while parsing attribute semantics in %s\n", + name.C()); } #endif data->attrib_locations[flags] = location; @@ -444,11 +452,17 @@ ShaderAttrib Shader::GetAttribLocation(VertexUsage usage, int index) const ret.m_flags |= (uint64_t)(uint16_t)index; #if defined USE_D3D9 || defined _XBOX #elif !defined __CELLOS_LV2__ - GLint l; + GLint l = -1; if (!data->attrib_locations.TryGetValue(ret.m_flags, l)) { - Log::Error("queried attribute is unavailable for this shader"); + /* Only spit an error once, we don’t need to flood the console. */ + if (!data->attrib_errors.HasKey(ret.m_flags)) + { + Log::Error("attribute %s not found in shader %s\n", + usage.ToString().C(), data->m_name.C()); + data->attrib_errors[ret.m_flags] = true; + } } ret.m_flags |= (uint64_t)(uint32_t)l << 32; #else diff --git a/src/gpu/vertexbuffer.cpp b/src/gpu/vertexbuffer.cpp index 0225a1cd..c4778445 100644 --- a/src/gpu/vertexbuffer.cpp +++ b/src/gpu/vertexbuffer.cpp @@ -367,7 +367,7 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attribs[]) uint32_t reg = attribs[n].m_flags >> 32; # if !defined __CELLOS_LV2__ - if (reg != 0xffffffff) + if (reg != 0xffffffffu) glEnableVertexAttribArray((GLint)reg); # else switch (usage.ToScalar()) diff --git a/src/image/codec/zed-image.cpp b/src/image/codec/zed-image.cpp index 3fd4bd0e..45bc7107 100644 --- a/src/image/codec/zed-image.cpp +++ b/src/image/codec/zed-image.cpp @@ -56,7 +56,7 @@ bool ZedImageData::Open(char const *path) if (!lol::String(path).EndsWith(".RSC")) return false; - //Compacter definition + // Compacter definition struct CompactSecondary { CompactSecondary(int32_t size) { m_size = size; } diff --git a/src/lol/gpu/indexbuffer.h b/src/lol/gpu/indexbuffer.h index 4a756737..dcb9c266 100644 --- a/src/lol/gpu/indexbuffer.h +++ b/src/lol/gpu/indexbuffer.h @@ -27,6 +27,8 @@ public: IndexBuffer(size_t size); ~IndexBuffer(); + size_t GetSize(); + void *Lock(size_t offset, size_t size); void Unlock(); diff --git a/src/lol/gpu/renderer.h b/src/lol/gpu/renderer.h index 585e5925..a281221e 100755 --- a/src/lol/gpu/renderer.h +++ b/src/lol/gpu/renderer.h @@ -53,6 +53,24 @@ enum class BlendEquation : uint8_t Max, }; +/* A safe enum to indicate the blend equation. */ +struct BlendEquation +{ + enum Value + { + Add, + Subtract, + ReverseSubtract, + Min, + Max, + } + m_value; + + inline BlendEquation() : m_value(Add) {} + inline BlendEquation(Value v) : m_value(v) {} + inline operator Value() { return m_value; } +}; + /* A safe enum to indicate the blending factors. */ enum class BlendFunc : uint8_t { diff --git a/src/lol/gpu/shader.h b/src/lol/gpu/shader.h index b7d179dc..118720e3 100644 --- a/src/lol/gpu/shader.h +++ b/src/lol/gpu/shader.h @@ -90,10 +90,10 @@ private: class ShaderData; -class Shader +class Shader : public Entity { public: - static Shader *Create(char const *lolfx); + static Shader *Create(String const &name, String const &code); static void Destroy(Shader *shader); int GetAttribCount() const; @@ -122,7 +122,7 @@ public: void Unbind() const; protected: - Shader(char const *vert, char const *frag); + Shader(String const &name, char const *vert, char const *frag); ~Shader(); private: diff --git a/src/lol/sys/thread.h b/src/lol/sys/thread.h index 0195e029..294fcf2b 100644 --- a/src/lol/sys/thread.h +++ b/src/lol/sys/thread.h @@ -99,6 +99,7 @@ public: protected: //Work stuff bool AddWork(ThreadJob* job); + //Fetch Results bool FetchResult(Array& results); //Base thread work function diff --git a/src/mesh/mesh.cpp b/src/mesh/mesh.cpp index 8e133e6b..0332f88a 100644 --- a/src/mesh/mesh.cpp +++ b/src/mesh/mesh.cpp @@ -32,24 +32,33 @@ Mesh::~Mesh() { } -void Mesh::Render(mat4 const &model) +void Mesh::Render() { - //for (int i = 0; i < m_submeshes.Count(); ++i) - // m_submeshes[i]->Render(model); + for (int i = 0; i < m_submeshes.Count(); ++i) + m_submeshes[i]->Render(); +} + +void Mesh::SetMaterial(Shader *shader) +{ + for (int i = 0; i < m_submeshes.Count(); ++i) + m_submeshes[i]->SetShader(shader); } /* * SubMesh class */ -SubMesh::SubMesh(lol::VertexDeclaration* vdecl) - : m_mesh_prim(MeshPrimitive::Triangles) +SubMesh::SubMesh(Shader *shader, VertexDeclaration *vdecl) + : m_mesh_prim(MeshPrimitive::Triangles), + m_shader(shader), + m_vdecl(vdecl) { - m_vdecl = vdecl; + Ticker::Ref(m_shader); } SubMesh::~SubMesh() { + Ticker::Unref(m_shader); // TODO: cleanup } @@ -58,6 +67,23 @@ void SubMesh::SetMeshPrimitive(MeshPrimitive mesh_primitive) m_mesh_prim = mesh_primitive; } +void SubMesh::SetShader(Shader *shader) +{ + Ticker::Unref(m_shader); + m_shader = shader; + Ticker::Ref(m_shader); +} + +Shader *SubMesh::GetShader() +{ + return m_shader; +} + +void SubMesh::SetVertexDeclaration(VertexDeclaration *vdecl) +{ + m_vdecl = vdecl; +} + void SubMesh::SetVertexBuffer(int index, VertexBuffer* vbo) { while (index >= m_vbos.Count()) @@ -66,12 +92,17 @@ void SubMesh::SetVertexBuffer(int index, VertexBuffer* vbo) m_vbos[index] = vbo; } +void SubMesh::SetIndexBuffer(IndexBuffer* ibo) +{ + m_ibo = ibo; +} + void SubMesh::AddTexture(const char* name, Texture* texture) { m_textures.Push(String(name), texture); } -void SubMesh::Render(Shader* shader) +void SubMesh::Render() { int vertex_count = 0; @@ -81,19 +112,17 @@ void SubMesh::Render(Shader* shader) if (m_vbos[i] == nullptr) { - Log::Error("trying to render a mesh with a null vbo"); - return; + Log::Error("trying to render a mesh with a null VBO\n"); + continue; } - int indices[VertexUsage::MAX]; - memset(indices, 0, sizeof(int) * VertexUsage::MAX); - + int usages[VertexUsage::MAX] = { 0 }; VertexStreamBase stream = m_vdecl->GetStream(i); for (int j = 0; j < stream.GetStreamCount(); ++j) { VertexUsage usage = stream.GetUsage(j); int usage_index = usage.ToScalar(); - attribs[j] = shader->GetAttribLocation(usage, indices[usage_index]++); + attribs[j] = m_shader->GetAttribLocation(usage, usages[usage_index]++); } vertex_count = m_vbos[i]->GetSize() / m_vdecl->GetStream(i).GetSize(); @@ -104,13 +133,16 @@ void SubMesh::Render(Shader* shader) for (int i = 0; i < m_textures.Count(); ++i) { // TODO: might be good to cache this - ShaderUniform u_tex = shader->GetUniformLocation(m_textures[i].m1.C()); - shader->SetUniform(u_tex, m_textures[i].m2->GetTextureUniform(), i); + ShaderUniform u_tex = m_shader->GetUniformLocation(m_textures[i].m1.C()); + m_shader->SetUniform(u_tex, m_textures[i].m2->GetTextureUniform(), i); } + m_ibo->Bind(); m_vdecl->Bind(); - m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, vertex_count); + m_vdecl->DrawIndexedElements(MeshPrimitive::Triangles, 0, 0, vertex_count, + 0, m_ibo->GetSize() / sizeof(uint16_t)); m_vdecl->Unbind(); + m_ibo->Unbind(); } } /* namespace lol */ diff --git a/src/mesh/mesh.h b/src/mesh/mesh.h index cc1a321a..b297763c 100644 --- a/src/mesh/mesh.h +++ b/src/mesh/mesh.h @@ -31,9 +31,12 @@ public: Mesh(); ~Mesh(); - void Render(mat4 const &model); + /* FIXME: this should eventually take a “material” as argument, which + * may behave differently between submeshes. */ + void SetMaterial(Shader *shader); + void Render(); -private: +public: Array m_submeshes; }; @@ -42,24 +45,31 @@ private: * - a vertex declaration * - a list of VBOs * - a list of textures + * - a shader */ class SubMesh { public: - SubMesh(VertexDeclaration* vdecl); + SubMesh(Shader *shader, VertexDeclaration* vdecl); ~SubMesh(); void SetMeshPrimitive(MeshPrimitive mesh_primitive); + void SetShader(Shader *shader); + Shader *GetShader(); + void SetVertexDeclaration(VertexDeclaration *vdecl); void SetVertexBuffer(int index, VertexBuffer* vbo); + void SetIndexBuffer(IndexBuffer* ibo); void AddTexture(const char* name, Texture* texture); - void Render(Shader* shader); + void Render(); protected: - VertexDeclaration* m_vdecl; MeshPrimitive m_mesh_prim; + Shader *m_shader; + VertexDeclaration* m_vdecl; Array m_vbos; + IndexBuffer *m_ibo; Array m_textures; }; diff --git a/src/mesh/primitive.cpp b/src/mesh/primitive.cpp index e8c79c2e..e2c662fe 100644 --- a/src/mesh/primitive.cpp +++ b/src/mesh/primitive.cpp @@ -24,9 +24,8 @@ namespace lol * Primitive class */ -Primitive::Primitive(Mesh *mesh, Shader *shader, mat4 const &matrix) - : m_mesh(mesh), - m_shader(shader), +Primitive::Primitive(SubMesh *submesh, mat4 const &matrix) + : m_submesh(submesh), m_matrix(matrix) { } diff --git a/src/mesh/primitive.h b/src/mesh/primitive.h index 9a319659..eee133ac 100644 --- a/src/mesh/primitive.h +++ b/src/mesh/primitive.h @@ -26,13 +26,11 @@ class Primitive friend class Scene; public: - Primitive(Mesh *mesh, Shader *shader, mat4 const &matrix); + Primitive(SubMesh *submesh, mat4 const &matrix); ~Primitive(); private: - Mesh *m_mesh; - Shader *m_shader; - + SubMesh *m_submesh; mat4 m_matrix; }; diff --git a/src/scene.cpp b/src/scene.cpp index 96f4e202..6d03825e 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -177,11 +177,16 @@ void Scene::Reset() data->m_tile_bufs.Empty(); data->m_lights.Empty(); + data->m_primitives.Empty(); } -void Scene::AddPrimitive(Mesh *mesh, Shader *shader, mat4 const &matrix) +void Scene::AddPrimitive(Mesh const &mesh, mat4 const &matrix) { - data->m_primitives.Push(Primitive(mesh, shader, matrix)); + for (int i = 0; i < mesh.m_submeshes.Count(); ++i) + { + data->m_primitives.Push(Primitive(mesh.m_submeshes[i], + matrix)); + } } void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale, float angle) @@ -190,7 +195,7 @@ void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale, float Tile t; /* FIXME: this sorting only works for a 45-degree camera */ - t.prio = -pos.y - 2 * 32 * pos.z + ((float)o ? 0 : 32); + t.prio = -pos.y - (int)(2 * 32 * pos.z) + (o ? 0 : 32); t.tileset = tileset; t.id = id; t.pos = pos; @@ -242,7 +247,7 @@ void Scene::RenderPrimitives() * primitives found in the scene graph. When we have one. */ Shader *shader = nullptr; - ShaderUniform u_model, uni_tex, uni_texsize; + ShaderUniform u_model, u_modelview, u_normalmat, uni_tex, uni_texsize; ShaderAttrib a_pos, a_tex; for (int i = 0; i < data->m_primitives.Count(); ++i) @@ -250,25 +255,50 @@ void Scene::RenderPrimitives() Primitive &p = data->m_primitives[i]; /* If this primitive uses a new shader, update attributes */ - if (p.m_shader != shader) + if (p.m_submesh->GetShader() != shader) { - shader = p.m_shader; + shader = p.m_submesh->GetShader(); a_pos = shader->GetAttribLocation(VertexUsage::Position, 0); a_tex = shader->GetAttribLocation(VertexUsage::TexCoord, 0); shader->Bind(); + /* Per-scene matrices */ ShaderUniform u_mat; u_mat = shader->GetUniformLocation("u_projection"); shader->SetUniform(u_mat, GetCamera()->GetProjection()); u_mat = shader->GetUniformLocation("u_view"); shader->SetUniform(u_mat, GetCamera()->GetView()); + u_mat = shader->GetUniformLocation("u_inv_view"); + shader->SetUniform(u_mat, inverse(GetCamera()->GetView())); + /* Per-object matrices, will be set later */ u_model = shader->GetUniformLocation("u_model"); + u_modelview = shader->GetUniformLocation("u_modelview"); + u_normalmat = shader->GetUniformLocation("u_normalmat"); + + /* Per-scene environment */ + Array const &lights = GetLights(); + Array light_data; + + /* FIXME: the 4th component of the position can be used for other things */ + /* FIXME: GetUniform("blabla") is costly */ + for (int i = 0; i < lights.Count(); ++i) + light_data << vec4(lights[i]->GetPosition(), lights[i]->GetType()) << lights[i]->GetColor(); + while (light_data.Count() < LOL_MAX_LIGHT_COUNT) + light_data << vec4::zero << vec4::zero; + + ShaderUniform u_lights = shader->GetUniformLocation("u_lights"); + shader->SetUniform(u_lights, light_data); } shader->SetUniform(u_model, p.m_matrix); + mat4 modelview = GetCamera()->GetView() * p.m_matrix; + shader->SetUniform(u_modelview, modelview); + shader->SetUniform(u_normalmat, transpose(inverse(mat3(modelview)))); + + p.m_submesh->Render(); } } diff --git a/src/scene.h b/src/scene.h index 4bbe51c3..10408aa7 100644 --- a/src/scene.h +++ b/src/scene.h @@ -23,6 +23,8 @@ #include "camera.h" #include "mesh/primitive.h" +#define LOL_MAX_LIGHT_COUNT 8 + namespace lol { @@ -49,7 +51,7 @@ public: void RenderLines(float seconds); /* New scenegraph */ - void AddPrimitive(Mesh *mesh, Shader *shader, mat4 const &matrix); + void AddPrimitive(Mesh const &mesh, mat4 const &matrix); /* FIXME: this should be deprecated -- it doesn't really match * the architecture we want to build */ diff --git a/src/sys/thread.cpp b/src/sys/thread.cpp index 47944a84..8bdfb575 100644 --- a/src/sys/thread.cpp +++ b/src/sys/thread.cpp @@ -23,6 +23,7 @@ BaseThreadManager::BaseThreadManager(int thread_count) { m_thread_count = thread_count; } + BaseThreadManager::~BaseThreadManager() { Stop(); @@ -68,6 +69,7 @@ bool BaseThreadManager::AddWork(ThreadJob* job) return true; return false; } + bool BaseThreadManager::FetchResult(Array& results) { ThreadJob* result; diff --git a/test/meshviewer.cpp b/test/meshviewer.cpp index 229d306d..d12a2d61 100644 --- a/test/meshviewer.cpp +++ b/test/meshviewer.cpp @@ -824,12 +824,12 @@ public: //Camera projection mat4 new_proj = mat_obj_offset * mat_count_offset * mat_align * mat_count_scale * save_proj; m_camera->SetProjection(new_proj); - m_meshes[i].m1->Render(m_mat); + g_scene->AddPrimitive(*m_meshes[i].m1, m_mat); g_renderer->Clear(ClearMask::Depth); } m_camera->SetProjection(save_proj); #else - m_meshes[i].m1->Render(m_mat); + g_scene->AddPrimitive(*m_meshes[i].m1, m_mat); #endif //ALL_FEATURES } } @@ -839,7 +839,7 @@ public: { m_camera->SetProjection(mat_gizmo); if (m_ssetup->m_show_gizmo) - m_gizmos[GZ_Editor]->Render(m_mat); + g_scene->AddPrimitive(*m_gizmos[GZ_Editor], m_mat); if (m_ssetup->m_show_lights) { @@ -851,12 +851,12 @@ public: //dir light if (ltmp->GetType() == LightType::Directional) { - m_gizmos[GZ_LightPos]->Render(m_mat * inverse(local)); - m_gizmos[GZ_LightDir]->Render(inverse(world) * inverse(mat4::lookat(vec3::zero, -ltmp->GetPosition(), vec3::axis_y))); + g_scene->AddPrimitive(*m_gizmos[GZ_LightPos], m_mat * inverse(local)); + g_scene->AddPrimitive(*m_gizmos[GZ_LightDir], inverse(world) * inverse(mat4::lookat(vec3::zero, -ltmp->GetPosition(), vec3::axis_y))); } else //point light { - m_gizmos[GZ_LightPos]->Render(m_mat * local); + g_scene->AddPrimitive(*m_gizmos[GZ_LightPos], m_mat * local); } } } diff --git a/test/physicobject.h b/test/physicobject.h index 273f86d4..2d09dc50 100644 --- a/test/physicobject.h +++ b/test/physicobject.h @@ -327,18 +327,16 @@ protected: { if (!m_ready) { - if (m_custom_shader) - m_mesh.MeshConvert(m_custom_shader); - else - m_mesh.MeshConvert(); + m_mesh.MeshConvert(); + /* FIXME: m_custom_shader is ignored */ m_ready = true; } else if (m_should_render) { if (m_is_character) - m_mesh.Render(m_character->GetTransform()); + g_scene->AddPrimitive(m_mesh, m_character->GetTransform()); else - m_mesh.Render(m_physics->GetTransform()); + g_scene->AddPrimitive(m_mesh, m_physics->GetTransform()); } } } diff --git a/test/shinyfur.lolfx b/test/shinyfur.lolfx index e2de5437..c9ad1f6d 100644 --- a/test/shinyfur.lolfx +++ b/test/shinyfur.lolfx @@ -8,7 +8,7 @@ attribute vec4 in_Color; uniform mat4 u_modelview; uniform mat4 u_view; -uniform mat4 u_proj; +uniform mat4 u_projection; uniform mat3 u_normalmat; uniform float in_Damage; @@ -29,7 +29,7 @@ void main(void) pass_TNormal = tnorm; pass_Color = in_Color; - gl_Position = u_proj * vertex; + gl_Position = u_projection * vertex; } [frag.glsl] @@ -121,7 +121,7 @@ void main(float3 in_Vertex : POSITION, float3 in_Normal : NORMAL, float4 in_Color : COLOR, uniform float4x4 u_modelview, - uniform float4x4 u_proj, + uniform float4x4 u_projection, uniform float3x3 u_normalmat, out float4 pass_Vertex : TEXCOORD0, out float3 pass_TNormal : TEXCOORD1, @@ -139,7 +139,7 @@ void main(float3 in_Vertex : POSITION, pass_Color = in_Color; #endif - out_Position = mul(u_proj, eye); + out_Position = mul(u_projection, eye); } [frag.hlsl] diff --git a/test/shinymvtexture.lolfx b/test/shinymvtexture.lolfx index 5cd87b19..e3edb632 100644 --- a/test/shinymvtexture.lolfx +++ b/test/shinymvtexture.lolfx @@ -9,7 +9,7 @@ attribute vec2 in_TexCoord; uniform mat4 u_modelview; uniform mat4 u_view; -uniform mat4 u_proj; +uniform mat4 u_projection; uniform mat3 u_normalmat; varying vec4 pass_Vertex; /* View space */ @@ -27,7 +27,7 @@ void main(void) pass_Color = in_Color; pass_TexCoord = in_TexCoord; - gl_Position = u_proj * vertex; + gl_Position = u_projection * vertex; } [frag.glsl] @@ -102,7 +102,7 @@ void main(float3 in_Vertex : POSITION, float3 in_Normal : NORMAL, float4 in_Color : COLOR, uniform float4x4 u_modelview, - uniform float4x4 u_proj, + uniform float4x4 u_projection, uniform float3x3 u_normalmat, out float4 pass_Vertex : TEXCOORD0, out float3 pass_TNormal : TEXCOORD1, @@ -120,7 +120,7 @@ void main(float3 in_Vertex : POSITION, pass_Color = in_Color; #endif - out_Position = mul(u_proj, eye); + out_Position = mul(u_projection, eye); } [frag.hlsl]