| @@ -82,6 +82,7 @@ _ReSharper.* | |||||
| test/benchsuite | test/benchsuite | ||||
| test/btphystest | test/btphystest | ||||
| test/meshviewer | test/meshviewer | ||||
| test/nacl_phystest | |||||
| test/testsuite | test/testsuite | ||||
| test/sandbox/sample | test/sandbox/sample | ||||
| test/math/pi | test/math/pi | ||||
| @@ -122,7 +122,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "People", "People", "{5F1AAF | |||||
| EndProject | EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Peeweek", "Peeweek", "{E27FDF36-50C4-4ED2-8CF5-A20FED016910}" | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Peeweek", "Peeweek", "{E27FDF36-50C4-4ED2-8CF5-A20FED016910}" | ||||
| EndProject | 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 | EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03_noise", "..\..\demos\tutorial\03_noise.vcxproj", "{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}" | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03_noise", "..\..\demos\tutorial\03_noise.vcxproj", "{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E}" | ||||
| EndProject | EndProject | ||||
| @@ -152,11 +152,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07_input", "..\..\demos\tut | |||||
| EndProject | EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06_sprite", "..\..\demos\tutorial\06_sprite.vcxproj", "{E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}" | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06_sprite", "..\..\demos\tutorial\06_sprite.vcxproj", "{E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF}" | ||||
| EndProject | 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 | 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 | 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 | EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SinglShot", "SinglShot", "{50509BA3-D27B-4FAC-9772-9EC76146F709}" | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SinglShot", "SinglShot", "{50509BA3-D27B-4FAC-9772-9EC76146F709}" | ||||
| EndProject | EndProject | ||||
| @@ -176,6 +176,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Pimp", "Pimp", "{2195FB18-5 | |||||
| EndProject | EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pimp", "..\..\tools\pimp\pimp.vcxproj", "{FFF58874-D460-41E6-AD65-DBFEC6E47A94}" | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pimp", "..\..\tools\pimp\pimp.vcxproj", "{FFF58874-D460-41E6-AD65-DBFEC6E47A94}" | ||||
| EndProject | EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "squad_shooter", "..\..\people\touky\private\squad_shooter\squad_shooter.vcxproj", "{DB344310-4938-4294-AEE2-18512454585D}" | |||||
| EndProject | |||||
| Global | Global | ||||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| Debug|ORBIS = Debug|ORBIS | Debug|ORBIS = Debug|ORBIS | ||||
| @@ -557,8 +557,8 @@ AC_CONFIG_FILES( | |||||
| people/peeweek/Makefile | people/peeweek/Makefile | ||||
| people/benlitz/Makefile | people/benlitz/Makefile | ||||
| people/benlitz/test1/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/Makefile | ||||
| people/touky/sprite_sorter/Makefile | people/touky/sprite_sorter/Makefile | ||||
| people/touky/squad_shooter/Makefile | people/touky/squad_shooter/Makefile | ||||
| @@ -118,32 +118,28 @@ public: | |||||
| if (!m_ready) | 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 | #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) | // 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++) | 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; | m_ready = true; | ||||
| } | } | ||||
| for (int i = 0; i < m_gears.Count(); i++) | 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: | private: | ||||
| @@ -137,8 +137,10 @@ static inline int isnan(float f) | |||||
| /* External declaration for LolFx files. */ | /* External declaration for LolFx files. */ | ||||
| #define LOLFX_RESOURCE_DECLARE(name) \ | #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 using NaCl or Android, override main() with our version */ | ||||
| #if defined __native_client__ | #if defined __native_client__ | ||||
| @@ -22,6 +22,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "easymesh/easymesh-compiler.h" | #include "easymesh/easymesh-compiler.h" | ||||
| LOLFX_RESOURCE_DECLARE(shiny); | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -40,7 +42,6 @@ EasyMesh::EasyMesh(const EasyMesh& em) | |||||
| m_vert = em.m_vert; | m_vert = em.m_vert; | ||||
| m_cursors = em.m_cursors; | m_cursors = em.m_cursors; | ||||
| m_build_data = nullptr; | m_build_data = nullptr; | ||||
| m_gpu_data = GpuEasyMeshData(); | |||||
| if (em.m_build_data) | if (em.m_build_data) | ||||
| m_build_data = new EasyMeshBuildData(*em.m_build_data); | m_build_data = new EasyMeshBuildData(*em.m_build_data); | ||||
| if (m_indices.Count() && m_vert.Count() && m_cursors.Count()) | if (m_indices.Count() && m_vert.Count() && m_cursors.Count()) | ||||
| @@ -64,6 +65,49 @@ bool EasyMesh::Compile(char const *command, bool Execute) | |||||
| return res; | 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<vec3, vec3, u8vec4, vec4>(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 EZSET(M0) BD()->CmdStack().GetValue(M0); | ||||
| #define EZDEF_1(T0) T0 m0; EZSET(m0) | #define EZDEF_1(T0) T0 m0; EZSET(m0) | ||||
| @@ -228,51 +272,6 @@ void EasyMesh::CloseBrace() | |||||
| m_cursors.Pop(); | 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) | bool EasyMesh::SetRender(bool should_render) | ||||
| @@ -48,7 +48,7 @@ LOL_SAFE_ENUM(MeshTransform, | |||||
| Shear | Shear | ||||
| ); | ); | ||||
| class EasyMesh | |||||
| class EasyMesh : public Mesh | |||||
| { | { | ||||
| friend class EasyMeshParser; | friend class EasyMeshParser; | ||||
| friend class GpuEasyMeshData; | friend class GpuEasyMeshData; | ||||
| @@ -57,13 +57,11 @@ public: | |||||
| EasyMesh(); | EasyMesh(); | ||||
| EasyMesh(const EasyMesh& em); | 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: | private: | ||||
| void UpdateVertexDict(Array< int, int > &vertex_dict); | void UpdateVertexDict(Array< int, int > &vertex_dict); | ||||
| @@ -73,6 +71,7 @@ private: | |||||
| //------------------------------------------------------------------------- | //------------------------------------------------------------------------- | ||||
| private: | private: | ||||
| void MeshCsg(CSGUsage csg_operation); | void MeshCsg(CSGUsage csg_operation); | ||||
| public: | public: | ||||
| /* [cmd:csgu] Performs a Union operation as (mesh0_Outside + mesh1_Outside) */ | /* [cmd:csgu] Performs a Union operation as (mesh0_Outside + mesh1_Outside) */ | ||||
| void CsgUnion() { MeshCsg(CSGUsage::Union); } | void CsgUnion() { MeshCsg(CSGUsage::Union); } | ||||
| @@ -386,7 +385,6 @@ public: | |||||
| Array<int, int> m_cursors; | Array<int, int> m_cursors; | ||||
| MeshRender m_state; | MeshRender m_state; | ||||
| GpuEasyMeshData m_gpu_data; | |||||
| public: | public: | ||||
| inline EasyMeshBuildData* BD() | inline EasyMeshBuildData* BD() | ||||
| @@ -120,9 +120,10 @@ DefaultShaderData::DefaultShaderData(uint16_t vert_decl_flags, Shader* shader, b | |||||
| SetupDefaultData(with_UV); | SetupDefaultData(with_UV); | ||||
| } | } | ||||
| static const String DefaultUniforms[7] = | |||||
| static const String DefaultUniforms[8] = | |||||
| { | { | ||||
| String("u_lights"), | String("u_lights"), | ||||
| String("u_model"), | |||||
| String("u_modelview"), | String("u_modelview"), | ||||
| String("u_view"), | String("u_view"), | ||||
| String("u_inv_view"), | String("u_inv_view"), | ||||
| @@ -160,12 +161,13 @@ void DefaultShaderData::SetupShaderDatas(mat4 const &model) | |||||
| /* FIXME: GetUniform("blabla") is costly */ | /* FIXME: GetUniform("blabla") is costly */ | ||||
| for (int i = 0; i < lights.Count(); ++i) | for (int i = 0; i < lights.Count(); ++i) | ||||
| light_data << vec4(lights[i]->GetPosition(), lights[i]->GetType()) << lights[i]->GetColor(); | 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; | light_data << vec4::zero << vec4::zero; | ||||
| int i = 0; | int i = 0; | ||||
| m_shader->SetUniform(*GetUniform(DefaultUniforms[i++]), light_data); | 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++]), modelview); | ||||
| m_shader->SetUniform(*GetUniform(DefaultUniforms[i++]), view); | m_shader->SetUniform(*GetUniform(DefaultUniforms[i++]), view); | ||||
| m_shader->SetUniform(*GetUniform(DefaultUniforms[i++]), inverse(view)); | m_shader->SetUniform(*GetUniform(DefaultUniforms[i++]), inverse(view)); | ||||
| @@ -8,7 +8,7 @@ attribute vec4 in_Color; | |||||
| uniform mat4 u_modelview; | uniform mat4 u_modelview; | ||||
| uniform mat4 u_view; | uniform mat4 u_view; | ||||
| uniform mat4 u_proj; | |||||
| uniform mat4 u_projection; | |||||
| uniform mat3 u_normalmat; | uniform mat3 u_normalmat; | ||||
| varying vec4 pass_Vertex; /* View space */ | varying vec4 pass_Vertex; /* View space */ | ||||
| @@ -24,7 +24,7 @@ void main(void) | |||||
| pass_TNormal = tnorm; | pass_TNormal = tnorm; | ||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| gl_Position = u_proj * vertex; | |||||
| gl_Position = u_projection * vertex; | |||||
| } | } | ||||
| [frag.glsl] | [frag.glsl] | ||||
| @@ -138,7 +138,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Normal : NORMAL, | float3 in_Normal : NORMAL, | ||||
| float4 in_Color : COLOR, | float4 in_Color : COLOR, | ||||
| uniform float4x4 u_modelview, | uniform float4x4 u_modelview, | ||||
| uniform float4x4 u_proj, | |||||
| uniform float4x4 u_projection, | |||||
| uniform float3x3 u_normalmat, | uniform float3x3 u_normalmat, | ||||
| out float4 pass_Vertex : TEXCOORD0, | out float4 pass_Vertex : TEXCOORD0, | ||||
| out float3 pass_TNormal : TEXCOORD1, | out float3 pass_TNormal : TEXCOORD1, | ||||
| @@ -156,7 +156,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| #endif | #endif | ||||
| out_Position = mul(u_proj, eye); | |||||
| out_Position = mul(u_projection, eye); | |||||
| } | } | ||||
| [frag.hlsl] | [frag.hlsl] | ||||
| @@ -10,7 +10,7 @@ attribute vec2 in_Weight; | |||||
| uniform mat4 u_modelview; | uniform mat4 u_modelview; | ||||
| uniform mat4 u_view; | uniform mat4 u_view; | ||||
| uniform mat4 u_proj; | |||||
| uniform mat4 u_projection; | |||||
| uniform mat3 u_normalmat; | uniform mat3 u_normalmat; | ||||
| //10is not a fix idea, should be more. | //10is not a fix idea, should be more. | ||||
| uniform mat4 in_BoneList[10]; | uniform mat4 in_BoneList[10]; | ||||
| @@ -28,7 +28,7 @@ void main(void) | |||||
| pass_TNormal = tnorm; | pass_TNormal = tnorm; | ||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| gl_Position = u_proj * vertex; | |||||
| gl_Position = u_projection * vertex; | |||||
| } | } | ||||
| [frag.glsl] | [frag.glsl] | ||||
| @@ -163,7 +163,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Normal : NORMAL, | float3 in_Normal : NORMAL, | ||||
| float4 in_Color : COLOR, | float4 in_Color : COLOR, | ||||
| uniform float4x4 u_modelview, | uniform float4x4 u_modelview, | ||||
| uniform float4x4 u_proj, | |||||
| uniform float4x4 u_projection, | |||||
| uniform float3x3 u_normalmat, | uniform float3x3 u_normalmat, | ||||
| out float4 pass_Vertex : TEXCOORD0, | out float4 pass_Vertex : TEXCOORD0, | ||||
| out float3 pass_TNormal : TEXCOORD1, | out float3 pass_TNormal : TEXCOORD1, | ||||
| @@ -181,7 +181,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| #endif | #endif | ||||
| out_Position = mul(u_proj, eye); | |||||
| out_Position = mul(u_projection, eye); | |||||
| } | } | ||||
| [frag.hlsl] | [frag.hlsl] | ||||
| @@ -9,7 +9,7 @@ attribute vec2 in_TexCoord; | |||||
| uniform mat4 u_modelview; | uniform mat4 u_modelview; | ||||
| uniform mat4 u_view; | uniform mat4 u_view; | ||||
| uniform mat4 u_proj; | |||||
| uniform mat4 u_projection; | |||||
| uniform mat3 u_normalmat; | uniform mat3 u_normalmat; | ||||
| varying vec4 pass_Vertex; /* View space */ | varying vec4 pass_Vertex; /* View space */ | ||||
| @@ -27,7 +27,7 @@ void main(void) | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| pass_TexCoord = in_TexCoord; | pass_TexCoord = in_TexCoord; | ||||
| gl_Position = u_proj * vertex; | |||||
| gl_Position = u_projection * vertex; | |||||
| } | } | ||||
| [frag.glsl] | [frag.glsl] | ||||
| @@ -97,7 +97,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Normal : NORMAL, | float3 in_Normal : NORMAL, | ||||
| float4 in_Color : COLOR, | float4 in_Color : COLOR, | ||||
| uniform float4x4 u_modelview, | uniform float4x4 u_modelview, | ||||
| uniform float4x4 u_proj, | |||||
| uniform float4x4 u_projection, | |||||
| uniform float3x3 u_normalmat, | uniform float3x3 u_normalmat, | ||||
| out float4 pass_Vertex : TEXCOORD0, | out float4 pass_Vertex : TEXCOORD0, | ||||
| out float3 pass_TNormal : TEXCOORD1, | out float3 pass_TNormal : TEXCOORD1, | ||||
| @@ -115,7 +115,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| #endif | #endif | ||||
| out_Position = mul(u_proj, eye); | |||||
| out_Position = mul(u_projection, eye); | |||||
| } | } | ||||
| [frag.hlsl] | [frag.hlsl] | ||||
| @@ -8,7 +8,7 @@ attribute vec4 in_Color; | |||||
| uniform mat4 u_modelview; | uniform mat4 u_modelview; | ||||
| uniform mat4 u_view; | uniform mat4 u_view; | ||||
| uniform mat4 u_proj; | |||||
| uniform mat4 u_projection; | |||||
| uniform mat3 u_normalmat; | uniform mat3 u_normalmat; | ||||
| varying vec4 pass_Vertex; /* View space */ | varying vec4 pass_Vertex; /* View space */ | ||||
| @@ -24,7 +24,7 @@ void main(void) | |||||
| pass_TNormal = tnorm; | pass_TNormal = tnorm; | ||||
| pass_Color = vec4(1.0, 1.0, 1.0, in_Color.w);//; | pass_Color = vec4(1.0, 1.0, 1.0, in_Color.w);//; | ||||
| gl_Position = u_proj * vertex; | |||||
| gl_Position = u_projection * vertex; | |||||
| } | } | ||||
| [frag.glsl] | [frag.glsl] | ||||
| @@ -97,7 +97,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Normal : NORMAL, | float3 in_Normal : NORMAL, | ||||
| float4 in_Color : COLOR, | float4 in_Color : COLOR, | ||||
| uniform float4x4 u_modelview, | uniform float4x4 u_modelview, | ||||
| uniform float4x4 u_proj, | |||||
| uniform float4x4 u_projection, | |||||
| uniform float3x3 u_normalmat, | uniform float3x3 u_normalmat, | ||||
| out float4 pass_Vertex : TEXCOORD0, | out float4 pass_Vertex : TEXCOORD0, | ||||
| out float3 pass_TNormal : TEXCOORD1, | out float3 pass_TNormal : TEXCOORD1, | ||||
| @@ -115,7 +115,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| #endif | #endif | ||||
| out_Position = mul(u_proj, eye); | |||||
| out_Position = mul(u_projection, eye); | |||||
| } | } | ||||
| [frag.hlsl] | [frag.hlsl] | ||||
| @@ -8,7 +8,7 @@ attribute vec4 in_Color; | |||||
| uniform mat4 u_modelview; | uniform mat4 u_modelview; | ||||
| uniform mat4 u_view; | uniform mat4 u_view; | ||||
| uniform mat4 u_proj; | |||||
| uniform mat4 u_projection; | |||||
| uniform mat3 u_normalmat; | uniform mat3 u_normalmat; | ||||
| varying vec4 pass_Vertex; /* View space */ | varying vec4 pass_Vertex; /* View space */ | ||||
| @@ -24,7 +24,7 @@ void main(void) | |||||
| pass_TNormal = tnorm; | pass_TNormal = tnorm; | ||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| gl_Position = u_proj * vertex; | |||||
| gl_Position = u_projection * vertex; | |||||
| } | } | ||||
| [frag.glsl] | [frag.glsl] | ||||
| @@ -59,7 +59,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Normal : NORMAL, | float3 in_Normal : NORMAL, | ||||
| float4 in_Color : COLOR, | float4 in_Color : COLOR, | ||||
| uniform float4x4 u_modelview, | uniform float4x4 u_modelview, | ||||
| uniform float4x4 u_proj, | |||||
| uniform float4x4 u_projection, | |||||
| uniform float3x3 u_normalmat, | uniform float3x3 u_normalmat, | ||||
| out float4 pass_Vertex : TEXCOORD0, | out float4 pass_Vertex : TEXCOORD0, | ||||
| out float3 pass_TNormal : TEXCOORD1, | out float3 pass_TNormal : TEXCOORD1, | ||||
| @@ -77,7 +77,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| #endif | #endif | ||||
| out_Position = mul(u_proj, eye); | |||||
| out_Position = mul(u_projection, eye); | |||||
| } | } | ||||
| [frag.hlsl] | [frag.hlsl] | ||||
| @@ -8,7 +8,7 @@ attribute vec4 in_Color; | |||||
| uniform mat4 u_modelview; | uniform mat4 u_modelview; | ||||
| uniform mat4 u_view; | uniform mat4 u_view; | ||||
| uniform mat4 u_proj; | |||||
| uniform mat4 u_projection; | |||||
| uniform mat3 u_normalmat; | uniform mat3 u_normalmat; | ||||
| varying vec4 pass_Vertex; /* View space */ | varying vec4 pass_Vertex; /* View space */ | ||||
| @@ -24,7 +24,7 @@ void main(void) | |||||
| pass_TNormal = tnorm; | pass_TNormal = tnorm; | ||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| gl_Position = u_proj * vertex; | |||||
| gl_Position = u_projection * vertex; | |||||
| } | } | ||||
| [frag.glsl] | [frag.glsl] | ||||
| @@ -55,7 +55,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Normal : NORMAL, | float3 in_Normal : NORMAL, | ||||
| float4 in_Color : COLOR, | float4 in_Color : COLOR, | ||||
| uniform float4x4 u_modelview, | uniform float4x4 u_modelview, | ||||
| uniform float4x4 u_proj, | |||||
| uniform float4x4 u_projection, | |||||
| uniform float3x3 u_normalmat, | uniform float3x3 u_normalmat, | ||||
| out float4 pass_Vertex : TEXCOORD0, | out float4 pass_Vertex : TEXCOORD0, | ||||
| out float3 pass_TNormal : TEXCOORD1, | out float3 pass_TNormal : TEXCOORD1, | ||||
| @@ -73,7 +73,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| #endif | #endif | ||||
| out_Position = mul(u_proj, eye); | |||||
| out_Position = mul(u_projection, eye); | |||||
| } | } | ||||
| [frag.hlsl] | [frag.hlsl] | ||||
| @@ -8,7 +8,7 @@ attribute vec4 in_Color; | |||||
| uniform mat4 u_modelview; | uniform mat4 u_modelview; | ||||
| uniform mat4 u_view; | uniform mat4 u_view; | ||||
| uniform mat4 u_proj; | |||||
| uniform mat4 u_projection; | |||||
| uniform mat3 u_normalmat; | uniform mat3 u_normalmat; | ||||
| varying vec4 pass_Vertex; /* View space */ | varying vec4 pass_Vertex; /* View space */ | ||||
| @@ -24,7 +24,7 @@ void main(void) | |||||
| pass_TNormal = tnorm; | pass_TNormal = tnorm; | ||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| gl_Position = u_proj * vertex; | |||||
| gl_Position = u_projection * vertex; | |||||
| } | } | ||||
| [frag.glsl] | [frag.glsl] | ||||
| @@ -141,7 +141,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Normal : NORMAL, | float3 in_Normal : NORMAL, | ||||
| float4 in_Color : COLOR, | float4 in_Color : COLOR, | ||||
| uniform float4x4 u_modelview, | uniform float4x4 u_modelview, | ||||
| uniform float4x4 u_proj, | |||||
| uniform float4x4 u_projection, | |||||
| uniform float3x3 u_normalmat, | uniform float3x3 u_normalmat, | ||||
| out float4 pass_Vertex : TEXCOORD0, | out float4 pass_Vertex : TEXCOORD0, | ||||
| out float3 pass_TNormal : TEXCOORD1, | out float3 pass_TNormal : TEXCOORD1, | ||||
| @@ -159,7 +159,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| #endif | #endif | ||||
| out_Position = mul(u_proj, eye); | |||||
| out_Position = mul(u_projection, eye); | |||||
| } | } | ||||
| [frag.hlsl] | [frag.hlsl] | ||||
| @@ -96,6 +96,11 @@ IndexBuffer::~IndexBuffer() | |||||
| delete m_data; | delete m_data; | ||||
| } | } | ||||
| size_t IndexBuffer::GetSize() | |||||
| { | |||||
| return m_data->m_size; | |||||
| } | |||||
| void *IndexBuffer::Lock(size_t offset, size_t size) | void *IndexBuffer::Lock(size_t offset, size_t size) | ||||
| { | { | ||||
| if (!m_data->m_size) | if (!m_data->m_size) | ||||
| @@ -84,6 +84,8 @@ class ShaderData | |||||
| friend class Shader; | friend class Shader; | ||||
| private: | private: | ||||
| String m_name; | |||||
| #if defined USE_D3D9 | #if defined USE_D3D9 | ||||
| IDirect3DDevice9 *m_dev; | IDirect3DDevice9 *m_dev; | ||||
| IDirect3DVertexShader9 *vert_shader; | IDirect3DVertexShader9 *vert_shader; | ||||
| @@ -98,6 +100,7 @@ private: | |||||
| GLuint prog_id, vert_id, frag_id; | 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 | // Benlitz: using a simple array could be faster since there is never more than a few attribute locations to store | ||||
| Map<uint64_t, GLint> attrib_locations; | Map<uint64_t, GLint> attrib_locations; | ||||
| Map<uint64_t, bool> attrib_errors; | |||||
| #else | #else | ||||
| CGprogram vert_id, frag_id; | CGprogram vert_id, frag_id; | ||||
| #endif | #endif | ||||
| @@ -121,16 +124,14 @@ int ShaderData::nshaders = 0; | |||||
| * Public Shader class | * 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 */ | /* Parse the crap */ | ||||
| Array<char const *, char const *> sections; | Array<char const *, char const *> sections; | ||||
| char *key = nullptr; | char *key = nullptr; | ||||
| for (char *parser = src; *parser; ) | |||||
| for (char *parser = src.C(); *parser; ) | |||||
| { | { | ||||
| if (key == nullptr && (parser[0] == '\n' || parser[0] == '\r') | if (key == nullptr && (parser[0] == '\n' || parser[0] == '\r') | ||||
| && parser[1] == '[') | && parser[1] == '[') | ||||
| @@ -173,9 +174,11 @@ Shader *Shader::Create(char const *lolfx) | |||||
| /* FIXME: we don’t know how to handle these yet. */ | /* FIXME: we don’t know how to handle these yet. */ | ||||
| if (!vert) | 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) | 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_vert_crc = ShaderData::hash(vert); | ||||
| uint32_t new_frag_crc = ShaderData::hash(frag); | 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 | if (ShaderData::shaders[n]->data->vert_crc == new_vert_crc | ||||
| && ShaderData::shaders[n]->data->frag_crc == new_frag_crc) | && ShaderData::shaders[n]->data->frag_crc == new_frag_crc) | ||||
| { | { | ||||
| delete[] src; | |||||
| return ShaderData::shaders[n]; | return ShaderData::shaders[n]; | ||||
| } | } | ||||
| } | } | ||||
| Shader *ret = new Shader(vert, frag); | |||||
| Shader *ret = new Shader(name, vert, frag); | |||||
| ShaderData::shaders[ShaderData::nshaders] = ret; | ShaderData::shaders[ShaderData::nshaders] = ret; | ||||
| ShaderData::nshaders++; | ShaderData::nshaders++; | ||||
| delete[] src; | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| @@ -204,9 +205,12 @@ void Shader::Destroy(Shader *shader) | |||||
| UNUSED(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(new ShaderData()) | ||||
| { | { | ||||
| data->m_name = name; | |||||
| #if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
| ID3DXBuffer *shader_code, *error_msg; | ID3DXBuffer *shader_code, *error_msg; | ||||
| HRESULT hr; | HRESULT hr; | ||||
| @@ -243,7 +247,7 @@ Shader::Shader(char const *vert, char const *frag) | |||||
| &data->vert_table); | &data->vert_table); | ||||
| if (FAILED(hr)) | 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"); | error_msg ? error_msg->GetBufferPointer() : "error"); | ||||
| Log::Error("shader source:\n%s\n", vert); | 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); | glGetShaderiv(data->vert_id, GL_COMPILE_STATUS, &status); | ||||
| if (status != GL_TRUE) | 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()); | Log::Error("shader source:\n%s\n", shader_code.C()); | ||||
| } | } | ||||
| else if (len > 16) | 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()); | Log::Debug("shader source:\n%s\n", shader_code.C()); | ||||
| } | } | ||||
| #else | #else | ||||
| @@ -275,7 +280,7 @@ Shader::Shader(char const *vert, char const *frag) | |||||
| nullptr, nullptr); | nullptr, nullptr); | ||||
| if (data->vert_id == 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); | Log::Error("shader source:\n%s\n", vert); | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -288,7 +293,7 @@ Shader::Shader(char const *vert, char const *frag) | |||||
| &data->frag_table); | &data->frag_table); | ||||
| if (FAILED(hr)) | 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"); | error_msg ? error_msg->GetBufferPointer() : "error"); | ||||
| Log::Error("shader source:\n%s\n", frag); | 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); | glGetShaderiv(data->frag_id, GL_COMPILE_STATUS, &status); | ||||
| if (status != GL_TRUE) | 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()); | Log::Error("shader source:\n%s\n", shader_code.C()); | ||||
| } | } | ||||
| else if (len > 16) | 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()); | Log::Debug("shader source:\n%s\n", shader_code.C()); | ||||
| } | } | ||||
| #else | #else | ||||
| @@ -320,7 +327,7 @@ Shader::Shader(char const *vert, char const *frag) | |||||
| nullptr, nullptr); | nullptr, nullptr); | ||||
| if (data->frag_id == 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); | Log::Error("shader source:\n%s\n", frag); | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -355,11 +362,11 @@ Shader::Shader(char const *vert, char const *frag) | |||||
| glGetProgramiv(data->prog_id, GL_LINK_STATUS, &status); | glGetProgramiv(data->prog_id, GL_LINK_STATUS, &status); | ||||
| if (status != GL_TRUE) | 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) | 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; | GLint validated; | ||||
| @@ -367,7 +374,7 @@ Shader::Shader(char const *vert, char const *frag) | |||||
| glGetProgramiv(data->prog_id, GL_VALIDATE_STATUS, &validated); | glGetProgramiv(data->prog_id, GL_VALIDATE_STATUS, &validated); | ||||
| if (validated != GL_TRUE) | if (validated != GL_TRUE) | ||||
| { | { | ||||
| Log::Error("failed to validate program"); | |||||
| Log::Error("failed to validate program %s\n", name.C()); | |||||
| } | } | ||||
| GLint num_attribs; | 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; | uint64_t flags = (uint64_t)(uint16_t)usage.ToScalar() << 16; | ||||
| flags |= (uint64_t)(uint16_t)index; | flags |= (uint64_t)(uint16_t)index; | ||||
| // TODO: this is here just in case. Remove this once everything has been correctly tested | // 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)) | 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 | #endif | ||||
| data->attrib_locations[flags] = location; | 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; | ret.m_flags |= (uint64_t)(uint16_t)index; | ||||
| #if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
| #elif !defined __CELLOS_LV2__ | #elif !defined __CELLOS_LV2__ | ||||
| GLint l; | |||||
| GLint l = -1; | |||||
| if (!data->attrib_locations.TryGetValue(ret.m_flags, l)) | 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; | ret.m_flags |= (uint64_t)(uint32_t)l << 32; | ||||
| #else | #else | ||||
| @@ -367,7 +367,7 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attribs[]) | |||||
| uint32_t reg = attribs[n].m_flags >> 32; | uint32_t reg = attribs[n].m_flags >> 32; | ||||
| # if !defined __CELLOS_LV2__ | # if !defined __CELLOS_LV2__ | ||||
| if (reg != 0xffffffff) | |||||
| if (reg != 0xffffffffu) | |||||
| glEnableVertexAttribArray((GLint)reg); | glEnableVertexAttribArray((GLint)reg); | ||||
| # else | # else | ||||
| switch (usage.ToScalar()) | switch (usage.ToScalar()) | ||||
| @@ -56,7 +56,7 @@ bool ZedImageData::Open(char const *path) | |||||
| if (!lol::String(path).EndsWith(".RSC")) | if (!lol::String(path).EndsWith(".RSC")) | ||||
| return false; | return false; | ||||
| //Compacter definition | |||||
| // Compacter definition | |||||
| struct CompactSecondary | struct CompactSecondary | ||||
| { | { | ||||
| CompactSecondary(int32_t size) { m_size = size; } | CompactSecondary(int32_t size) { m_size = size; } | ||||
| @@ -27,6 +27,8 @@ public: | |||||
| IndexBuffer(size_t size); | IndexBuffer(size_t size); | ||||
| ~IndexBuffer(); | ~IndexBuffer(); | ||||
| size_t GetSize(); | |||||
| void *Lock(size_t offset, size_t size); | void *Lock(size_t offset, size_t size); | ||||
| void Unlock(); | void Unlock(); | ||||
| @@ -53,6 +53,24 @@ enum class BlendEquation : uint8_t | |||||
| Max, | 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. */ | /* A safe enum to indicate the blending factors. */ | ||||
| enum class BlendFunc : uint8_t | enum class BlendFunc : uint8_t | ||||
| { | { | ||||
| @@ -90,10 +90,10 @@ private: | |||||
| class ShaderData; | class ShaderData; | ||||
| class Shader | |||||
| class Shader : public Entity | |||||
| { | { | ||||
| public: | public: | ||||
| static Shader *Create(char const *lolfx); | |||||
| static Shader *Create(String const &name, String const &code); | |||||
| static void Destroy(Shader *shader); | static void Destroy(Shader *shader); | ||||
| int GetAttribCount() const; | int GetAttribCount() const; | ||||
| @@ -122,7 +122,7 @@ public: | |||||
| void Unbind() const; | void Unbind() const; | ||||
| protected: | protected: | ||||
| Shader(char const *vert, char const *frag); | |||||
| Shader(String const &name, char const *vert, char const *frag); | |||||
| ~Shader(); | ~Shader(); | ||||
| private: | private: | ||||
| @@ -99,6 +99,7 @@ public: | |||||
| protected: | protected: | ||||
| //Work stuff | //Work stuff | ||||
| bool AddWork(ThreadJob* job); | bool AddWork(ThreadJob* job); | ||||
| //Fetch Results | //Fetch Results | ||||
| bool FetchResult(Array<ThreadJob*>& results); | bool FetchResult(Array<ThreadJob*>& results); | ||||
| //Base thread work function | //Base thread work function | ||||
| @@ -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 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() | SubMesh::~SubMesh() | ||||
| { | { | ||||
| Ticker::Unref(m_shader); | |||||
| // TODO: cleanup | // TODO: cleanup | ||||
| } | } | ||||
| @@ -58,6 +67,23 @@ void SubMesh::SetMeshPrimitive(MeshPrimitive mesh_primitive) | |||||
| m_mesh_prim = 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) | void SubMesh::SetVertexBuffer(int index, VertexBuffer* vbo) | ||||
| { | { | ||||
| while (index >= m_vbos.Count()) | while (index >= m_vbos.Count()) | ||||
| @@ -66,12 +92,17 @@ void SubMesh::SetVertexBuffer(int index, VertexBuffer* vbo) | |||||
| m_vbos[index] = vbo; | m_vbos[index] = vbo; | ||||
| } | } | ||||
| void SubMesh::SetIndexBuffer(IndexBuffer* ibo) | |||||
| { | |||||
| m_ibo = ibo; | |||||
| } | |||||
| void SubMesh::AddTexture(const char* name, Texture* texture) | void SubMesh::AddTexture(const char* name, Texture* texture) | ||||
| { | { | ||||
| m_textures.Push(String(name), texture); | m_textures.Push(String(name), texture); | ||||
| } | } | ||||
| void SubMesh::Render(Shader* shader) | |||||
| void SubMesh::Render() | |||||
| { | { | ||||
| int vertex_count = 0; | int vertex_count = 0; | ||||
| @@ -81,19 +112,17 @@ void SubMesh::Render(Shader* shader) | |||||
| if (m_vbos[i] == nullptr) | 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); | VertexStreamBase stream = m_vdecl->GetStream(i); | ||||
| for (int j = 0; j < stream.GetStreamCount(); ++j) | for (int j = 0; j < stream.GetStreamCount(); ++j) | ||||
| { | { | ||||
| VertexUsage usage = stream.GetUsage(j); | VertexUsage usage = stream.GetUsage(j); | ||||
| int usage_index = usage.ToScalar(); | 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(); | 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) | for (int i = 0; i < m_textures.Count(); ++i) | ||||
| { | { | ||||
| // TODO: might be good to cache this | // 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->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_vdecl->Unbind(); | ||||
| m_ibo->Unbind(); | |||||
| } | } | ||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| @@ -31,9 +31,12 @@ public: | |||||
| Mesh(); | Mesh(); | ||||
| ~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<class SubMesh *> m_submeshes; | Array<class SubMesh *> m_submeshes; | ||||
| }; | }; | ||||
| @@ -42,24 +45,31 @@ private: | |||||
| * - a vertex declaration | * - a vertex declaration | ||||
| * - a list of VBOs | * - a list of VBOs | ||||
| * - a list of textures | * - a list of textures | ||||
| * - a shader | |||||
| */ | */ | ||||
| class SubMesh | class SubMesh | ||||
| { | { | ||||
| public: | public: | ||||
| SubMesh(VertexDeclaration* vdecl); | |||||
| SubMesh(Shader *shader, VertexDeclaration* vdecl); | |||||
| ~SubMesh(); | ~SubMesh(); | ||||
| void SetMeshPrimitive(MeshPrimitive mesh_primitive); | void SetMeshPrimitive(MeshPrimitive mesh_primitive); | ||||
| void SetShader(Shader *shader); | |||||
| Shader *GetShader(); | |||||
| void SetVertexDeclaration(VertexDeclaration *vdecl); | |||||
| void SetVertexBuffer(int index, VertexBuffer* vbo); | void SetVertexBuffer(int index, VertexBuffer* vbo); | ||||
| void SetIndexBuffer(IndexBuffer* ibo); | |||||
| void AddTexture(const char* name, Texture* texture); | void AddTexture(const char* name, Texture* texture); | ||||
| void Render(Shader* shader); | |||||
| void Render(); | |||||
| protected: | protected: | ||||
| VertexDeclaration* m_vdecl; | |||||
| MeshPrimitive m_mesh_prim; | MeshPrimitive m_mesh_prim; | ||||
| Shader *m_shader; | |||||
| VertexDeclaration* m_vdecl; | |||||
| Array<VertexBuffer *> m_vbos; | Array<VertexBuffer *> m_vbos; | ||||
| IndexBuffer *m_ibo; | |||||
| Array<String, Texture*> m_textures; | Array<String, Texture*> m_textures; | ||||
| }; | }; | ||||
| @@ -24,9 +24,8 @@ namespace lol | |||||
| * Primitive class | * 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) | m_matrix(matrix) | ||||
| { | { | ||||
| } | } | ||||
| @@ -26,13 +26,11 @@ class Primitive | |||||
| friend class Scene; | friend class Scene; | ||||
| public: | public: | ||||
| Primitive(Mesh *mesh, Shader *shader, mat4 const &matrix); | |||||
| Primitive(SubMesh *submesh, mat4 const &matrix); | |||||
| ~Primitive(); | ~Primitive(); | ||||
| private: | private: | ||||
| Mesh *m_mesh; | |||||
| Shader *m_shader; | |||||
| SubMesh *m_submesh; | |||||
| mat4 m_matrix; | mat4 m_matrix; | ||||
| }; | }; | ||||
| @@ -177,11 +177,16 @@ void Scene::Reset() | |||||
| data->m_tile_bufs.Empty(); | data->m_tile_bufs.Empty(); | ||||
| data->m_lights.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) | 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; | Tile t; | ||||
| /* FIXME: this sorting only works for a 45-degree camera */ | /* 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.tileset = tileset; | ||||
| t.id = id; | t.id = id; | ||||
| t.pos = pos; | t.pos = pos; | ||||
| @@ -242,7 +247,7 @@ void Scene::RenderPrimitives() | |||||
| * primitives found in the scene graph. When we have one. */ | * primitives found in the scene graph. When we have one. */ | ||||
| Shader *shader = nullptr; | 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; | ShaderAttrib a_pos, a_tex; | ||||
| for (int i = 0; i < data->m_primitives.Count(); ++i) | for (int i = 0; i < data->m_primitives.Count(); ++i) | ||||
| @@ -250,25 +255,50 @@ void Scene::RenderPrimitives() | |||||
| Primitive &p = data->m_primitives[i]; | Primitive &p = data->m_primitives[i]; | ||||
| /* If this primitive uses a new shader, update attributes */ | /* 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_pos = shader->GetAttribLocation(VertexUsage::Position, 0); | ||||
| a_tex = shader->GetAttribLocation(VertexUsage::TexCoord, 0); | a_tex = shader->GetAttribLocation(VertexUsage::TexCoord, 0); | ||||
| shader->Bind(); | shader->Bind(); | ||||
| /* Per-scene matrices */ | |||||
| ShaderUniform u_mat; | ShaderUniform u_mat; | ||||
| u_mat = shader->GetUniformLocation("u_projection"); | u_mat = shader->GetUniformLocation("u_projection"); | ||||
| shader->SetUniform(u_mat, GetCamera()->GetProjection()); | shader->SetUniform(u_mat, GetCamera()->GetProjection()); | ||||
| u_mat = shader->GetUniformLocation("u_view"); | u_mat = shader->GetUniformLocation("u_view"); | ||||
| shader->SetUniform(u_mat, GetCamera()->GetView()); | 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_model = shader->GetUniformLocation("u_model"); | ||||
| u_modelview = shader->GetUniformLocation("u_modelview"); | |||||
| u_normalmat = shader->GetUniformLocation("u_normalmat"); | |||||
| /* Per-scene environment */ | |||||
| Array<Light *> const &lights = GetLights(); | |||||
| Array<vec4> 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); | 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(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -23,6 +23,8 @@ | |||||
| #include "camera.h" | #include "camera.h" | ||||
| #include "mesh/primitive.h" | #include "mesh/primitive.h" | ||||
| #define LOL_MAX_LIGHT_COUNT 8 | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -49,7 +51,7 @@ public: | |||||
| void RenderLines(float seconds); | void RenderLines(float seconds); | ||||
| /* New scenegraph */ | /* 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 | /* FIXME: this should be deprecated -- it doesn't really match | ||||
| * the architecture we want to build */ | * the architecture we want to build */ | ||||
| @@ -23,6 +23,7 @@ BaseThreadManager::BaseThreadManager(int thread_count) | |||||
| { | { | ||||
| m_thread_count = thread_count; | m_thread_count = thread_count; | ||||
| } | } | ||||
| BaseThreadManager::~BaseThreadManager() | BaseThreadManager::~BaseThreadManager() | ||||
| { | { | ||||
| Stop(); | Stop(); | ||||
| @@ -68,6 +69,7 @@ bool BaseThreadManager::AddWork(ThreadJob* job) | |||||
| return true; | return true; | ||||
| return false; | return false; | ||||
| } | } | ||||
| bool BaseThreadManager::FetchResult(Array<ThreadJob*>& results) | bool BaseThreadManager::FetchResult(Array<ThreadJob*>& results) | ||||
| { | { | ||||
| ThreadJob* result; | ThreadJob* result; | ||||
| @@ -824,12 +824,12 @@ public: | |||||
| //Camera projection | //Camera projection | ||||
| mat4 new_proj = mat_obj_offset * mat_count_offset * mat_align * mat_count_scale * save_proj; | mat4 new_proj = mat_obj_offset * mat_count_offset * mat_align * mat_count_scale * save_proj; | ||||
| m_camera->SetProjection(new_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); | g_renderer->Clear(ClearMask::Depth); | ||||
| } | } | ||||
| m_camera->SetProjection(save_proj); | m_camera->SetProjection(save_proj); | ||||
| #else | #else | ||||
| m_meshes[i].m1->Render(m_mat); | |||||
| g_scene->AddPrimitive(*m_meshes[i].m1, m_mat); | |||||
| #endif //ALL_FEATURES | #endif //ALL_FEATURES | ||||
| } | } | ||||
| } | } | ||||
| @@ -839,7 +839,7 @@ public: | |||||
| { | { | ||||
| m_camera->SetProjection(mat_gizmo); | m_camera->SetProjection(mat_gizmo); | ||||
| if (m_ssetup->m_show_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) | if (m_ssetup->m_show_lights) | ||||
| { | { | ||||
| @@ -851,12 +851,12 @@ public: | |||||
| //dir light | //dir light | ||||
| if (ltmp->GetType() == LightType::Directional) | 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 | else //point light | ||||
| { | { | ||||
| m_gizmos[GZ_LightPos]->Render(m_mat * local); | |||||
| g_scene->AddPrimitive(*m_gizmos[GZ_LightPos], m_mat * local); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -327,18 +327,16 @@ protected: | |||||
| { | { | ||||
| if (!m_ready) | 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; | m_ready = true; | ||||
| } | } | ||||
| else if (m_should_render) | else if (m_should_render) | ||||
| { | { | ||||
| if (m_is_character) | if (m_is_character) | ||||
| m_mesh.Render(m_character->GetTransform()); | |||||
| g_scene->AddPrimitive(m_mesh, m_character->GetTransform()); | |||||
| else | else | ||||
| m_mesh.Render(m_physics->GetTransform()); | |||||
| g_scene->AddPrimitive(m_mesh, m_physics->GetTransform()); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -8,7 +8,7 @@ attribute vec4 in_Color; | |||||
| uniform mat4 u_modelview; | uniform mat4 u_modelview; | ||||
| uniform mat4 u_view; | uniform mat4 u_view; | ||||
| uniform mat4 u_proj; | |||||
| uniform mat4 u_projection; | |||||
| uniform mat3 u_normalmat; | uniform mat3 u_normalmat; | ||||
| uniform float in_Damage; | uniform float in_Damage; | ||||
| @@ -29,7 +29,7 @@ void main(void) | |||||
| pass_TNormal = tnorm; | pass_TNormal = tnorm; | ||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| gl_Position = u_proj * vertex; | |||||
| gl_Position = u_projection * vertex; | |||||
| } | } | ||||
| [frag.glsl] | [frag.glsl] | ||||
| @@ -121,7 +121,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Normal : NORMAL, | float3 in_Normal : NORMAL, | ||||
| float4 in_Color : COLOR, | float4 in_Color : COLOR, | ||||
| uniform float4x4 u_modelview, | uniform float4x4 u_modelview, | ||||
| uniform float4x4 u_proj, | |||||
| uniform float4x4 u_projection, | |||||
| uniform float3x3 u_normalmat, | uniform float3x3 u_normalmat, | ||||
| out float4 pass_Vertex : TEXCOORD0, | out float4 pass_Vertex : TEXCOORD0, | ||||
| out float3 pass_TNormal : TEXCOORD1, | out float3 pass_TNormal : TEXCOORD1, | ||||
| @@ -139,7 +139,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| #endif | #endif | ||||
| out_Position = mul(u_proj, eye); | |||||
| out_Position = mul(u_projection, eye); | |||||
| } | } | ||||
| [frag.hlsl] | [frag.hlsl] | ||||
| @@ -9,7 +9,7 @@ attribute vec2 in_TexCoord; | |||||
| uniform mat4 u_modelview; | uniform mat4 u_modelview; | ||||
| uniform mat4 u_view; | uniform mat4 u_view; | ||||
| uniform mat4 u_proj; | |||||
| uniform mat4 u_projection; | |||||
| uniform mat3 u_normalmat; | uniform mat3 u_normalmat; | ||||
| varying vec4 pass_Vertex; /* View space */ | varying vec4 pass_Vertex; /* View space */ | ||||
| @@ -27,7 +27,7 @@ void main(void) | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| pass_TexCoord = in_TexCoord; | pass_TexCoord = in_TexCoord; | ||||
| gl_Position = u_proj * vertex; | |||||
| gl_Position = u_projection * vertex; | |||||
| } | } | ||||
| [frag.glsl] | [frag.glsl] | ||||
| @@ -102,7 +102,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Normal : NORMAL, | float3 in_Normal : NORMAL, | ||||
| float4 in_Color : COLOR, | float4 in_Color : COLOR, | ||||
| uniform float4x4 u_modelview, | uniform float4x4 u_modelview, | ||||
| uniform float4x4 u_proj, | |||||
| uniform float4x4 u_projection, | |||||
| uniform float3x3 u_normalmat, | uniform float3x3 u_normalmat, | ||||
| out float4 pass_Vertex : TEXCOORD0, | out float4 pass_Vertex : TEXCOORD0, | ||||
| out float3 pass_TNormal : TEXCOORD1, | out float3 pass_TNormal : TEXCOORD1, | ||||
| @@ -120,7 +120,7 @@ void main(float3 in_Vertex : POSITION, | |||||
| pass_Color = in_Color; | pass_Color = in_Color; | ||||
| #endif | #endif | ||||
| out_Position = mul(u_proj, eye); | |||||
| out_Position = mul(u_projection, eye); | |||||
| } | } | ||||
| [frag.hlsl] | [frag.hlsl] | ||||