Got it working but its not working...

The UVs are off for some reason but I'm not 100% sure why. Possibly
caused by some sort of offset not being accounted for.
This commit is contained in:
elipzer 2018-10-14 21:19:38 -04:00
parent e3c85324c6
commit 94de35536a
15 changed files with 330 additions and 2 deletions

View File

@ -17,7 +17,9 @@ namespace charcoal
void setup_vao_vertex() override
{
glBindBuffer(GL_ARRAY_BUFFER, m_vertex_vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), NULL);
glVertexAttribDivisor(0, 0);

View File

@ -159,6 +159,11 @@ copy "$(ProjectDir)*.h" "$(SolutionDir)include\charcoal-builtin\"</Command>
<ClInclude Include="MeshGenerator.h" />
<ClInclude Include="PoseableBatch.h" />
<ClInclude Include="SpriteBatch.h" />
<ClInclude Include="TexturedBatch.h" />
<ClInclude Include="TexturedPipeline.h" />
<ClInclude Include="TexturedRenderable.h" />
<ClInclude Include="TexturedShaderProgram.h" />
<ClInclude Include="TexturedTypes.h" />
<ClInclude Include="TextureGenerator.h" />
<ClInclude Include="WithCamera.h" />
</ItemGroup>

View File

@ -25,6 +25,9 @@
<Filter Include="Header Files\Pipelines\Basic">
<UniqueIdentifier>{1dbc28a4-b52f-4171-a385-79490dfa9b0a}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files\Pipelines\Textured">
<UniqueIdentifier>{a0a4d461-a490-40ce-bc57-22c47460f60e}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="GLUtil.cpp">
@ -89,5 +92,20 @@
<ClInclude Include="BuiltinPipeline.h">
<Filter>Header Files\General</Filter>
</ClInclude>
<ClInclude Include="TexturedBatch.h">
<Filter>Header Files\Pipelines\Textured</Filter>
</ClInclude>
<ClInclude Include="TexturedTypes.h">
<Filter>Header Files\Pipelines\Textured</Filter>
</ClInclude>
<ClInclude Include="TexturedShaderProgram.h">
<Filter>Header Files\Pipelines\Textured</Filter>
</ClInclude>
<ClInclude Include="TexturedPipeline.h">
<Filter>Header Files\Pipelines\Textured</Filter>
</ClInclude>
<ClInclude Include="TexturedRenderable.h">
<Filter>Header Files\Pipelines\Textured</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -0,0 +1,40 @@
#pragma once
#include "TexturedTypes.h"
#include "TexturedRenderable.h"
#include "PoseableBatch.h"
namespace charcoal
{
namespace builtin
{
namespace textured
{
class Batch : public PoseableBatch<Vertex, Index, 2, Renderable>
{
public:
using PoseableBatch<Vertex, Index, 2, Renderable>::PoseableBatch;
protected:
void setup_vao_vertex() override
{
glBindBuffer(GL_ARRAY_BUFFER, m_vertex_vbo);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, uv));
glVertexAttribDivisor(0, 0);
glVertexAttribDivisor(1, 0);
}
void preprender() const override {
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_p_renderable->get_texture()->get_texture());
glBindSampler(0, m_p_renderable->get_sampler()->get_sampler());
}
};
}
}
}

View File

@ -0,0 +1,31 @@
#pragma once
#include "GLUtil.h"
#include "BuiltinPipeline.h"
#include "WithCamera.h"
#include "TexturedShaderProgram.h"
#include "TexturedBatch.h"
namespace charcoal
{
namespace builtin
{
namespace textured
{
class Pipeline : public builtin::Pipeline<ShaderProgram, Batch>, public WithCamera
{
public:
void prepare_opengl() override
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
}
void prepare_uniforms() override
{
glutil::uniform_matrix(0, get_camera()->get_world_to_view_matrix());
}
};
}
}
}

View File

@ -0,0 +1,38 @@
#pragma once
#include <charcoal/Renderable.h>
#include <charcoal/Texture.h>
#include <charcoal/Sampler.h>
#include "TexturedTypes.h"
namespace charcoal
{
namespace builtin
{
namespace textured
{
class Renderable : public RenderableT<Vertex, Index>
{
public:
Renderable(
const Mesh<Vertex, Index>* mesh,
const DrawMode& draw_mode,
Texture* texture,
Sampler* sampler
)
: RenderableT<Vertex, Index>(mesh, draw_mode),
m_p_texture(texture),
m_p_sampler(sampler)
{}
Texture* get_texture() const { return m_p_texture; }
Sampler* get_sampler() const { return m_p_sampler; }
private:
Texture* m_p_texture;
Sampler* m_p_sampler;
};
}
}
}

View File

@ -0,0 +1,18 @@
#pragma once
#include <charcoal/VertexFragmentShaderProgram.h>
namespace charcoal
{
namespace builtin
{
namespace textured
{
class ShaderProgram : public VertexFragmentShaderProgram
{
public:
ShaderProgram() : VertexFragmentShaderProgram(SHADER_PATH "TexturedVS.glsl", SHADER_PATH "TexturedFS.glsl") {}
};
}
}
}

View File

@ -0,0 +1,15 @@
#pragma once
#include "BuiltinTypes.h"
namespace charcoal
{
namespace builtin
{
namespace textured
{
typedef PTVertex Vertex;
typedef Index Index;
}
}
}

View File

@ -24,6 +24,7 @@
<ClCompile Include="MyBasicScene.cpp" />
<ClCompile Include="MyBatch.cpp" />
<ClCompile Include="MyBuiltinCubeScene.cpp" />
<ClCompile Include="MyBuiltinTexturedScene.cpp" />
<ClCompile Include="MySimple2DScene.cpp" />
<ClCompile Include="MySimple3DScene.cpp" />
<ClCompile Include="MySimpleCubeScene.cpp" />
@ -34,6 +35,7 @@
<ClInclude Include="MyBasicShaderProgram.h" />
<ClInclude Include="MyBatch.h" />
<ClInclude Include="MyBuiltinCubeScene.h" />
<ClInclude Include="MyBuiltinTexturedScene.h" />
<ClInclude Include="MySimple2DScene.h" />
<ClInclude Include="MySimple3DScene.h" />
<ClInclude Include="MySimpleCubeScene.h" />

View File

@ -39,6 +39,9 @@
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MyBuiltinTexturedScene.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="MyApplication.h">
@ -68,5 +71,8 @@
<ClInclude Include="MySimpleCubeScene.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="MyBuiltinTexturedScene.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -6,7 +6,8 @@ MyApplication::MyApplication(int width, int height)
m_simple_2d_scene(*this),
m_simple_3d_scene(*this),
m_simple_cube_scene(*this),
m_builtin_basic_cube_scene(*this)
m_builtin_basic_cube_scene(*this),
m_builtin_textured_scene(*this)
{}
void MyApplication::init()
@ -16,6 +17,7 @@ void MyApplication::init()
m_simple_3d_scene.init();
m_simple_cube_scene.init();
m_builtin_basic_cube_scene.init();
m_builtin_textured_scene.init();
m_p_current_scene = &m_basic_scene;
m_p_current_scene->use();
@ -43,6 +45,10 @@ void MyApplication::update(float delta_time, clock_t clock)
{
swap_scene(&m_builtin_basic_cube_scene);
}
else if (m_glfw_input_manager.is_key_pressed(GLFW_KEY_6))
{
swap_scene(&m_builtin_textured_scene);
}
m_p_current_scene->update(delta_time, clock);
}

View File

@ -8,6 +8,7 @@
#include "MySimple3DScene.h"
#include "MySimpleCubeScene.h"
#include "MyBuiltinCubeScene.h"
#include "MyBuiltinTexturedScene.h"
using namespace charcoal;
@ -36,5 +37,6 @@ private:
MySimple3DScene m_simple_3d_scene;
MySimpleCubeScene m_simple_cube_scene;
MyBuiltinCubeScene m_builtin_basic_cube_scene;
MyBuiltinTexturedScene m_builtin_textured_scene;
};

View File

@ -1,7 +1,7 @@
#pragma once
#include <charcoal/Poseable.h>
#include <charcoal-builtin/BasicScene.h>
#include <charcoal/Scene.h>
#include <charcoal-builtin/BuiltinCamera3D.h>
#include <charcoal-builtin/BasicPipeline.h>

View File

@ -0,0 +1,98 @@
#include "MyBuiltinTexturedScene.h"
#include <charcoal/constants.h>
#include <charcoal/TextureFactory.h>
#include <charcoal-builtin/MeshGenerator.h>
#include <charcoal-builtin/TextureGenerator.h>
#include <charcoal-builtin/GLUtil.h>
MyBuiltinTexturedScene::MyBuiltinTexturedScene(Application& application)
: Scene(application),
m_sprite_image(image_loader::load_file(IMAGE_PATH "uber.png")),
m_cube(
meshgenerator::gen_cube_pt<textured::Vertex, textured::Index>(DRAW_TRIANGLES, 2.0f, 2.0f, 2.0f),
DRAW_TRIANGLES,
texturegenerator::gen_quick_cube_texture(),
texturegenerator::gen_quick_sampler()
),
m_sprite(
meshgenerator::gen_rect_pt<textured::Vertex, textured::Index>(DRAW_TRIANGLES, 2.0f, 2.0f),
DRAW_TRIANGLES,
TextureFactory::gen_image_texture(m_sprite_image),
texturegenerator::gen_quick_sampler()
),
m_camera((float)TAU_1_4, (float)m_screen_size.x / m_screen_size.y, 1.0f, 10.0f, vec3(0.0f, 0.0f, -5.0f)),
m_cube_batch(&m_cube, 2),
m_sprite_batch(&m_sprite, 1)
{
m_pipeline.add_batch(&m_cube_batch);
m_pipeline.add_batch(&m_sprite_batch);
m_pipeline.set_camera(&m_camera);
}
void MyBuiltinTexturedScene::init()
{
m_cube_batch.init();
m_sprite_batch.init();
}
void MyBuiltinTexturedScene::update(float delta_time, clock_t clock)
{
float brightness;
float radians;
clock_t c;
const clock_t intervals = 512 * CLOCKS_PER_SEC / 100;
const clock_t half_interval = 256 * CLOCKS_PER_SEC / 100;
c = clock % intervals;
if (c < half_interval)
brightness = (float)c / half_interval;
else
brightness = (float)(intervals - c) / half_interval;
radians = (float)TAU * c / intervals;
m_cube_pose_a.rotate(glm::normalize(vec3(1.0f, 1.0f, 0.0f)), (float)TAU_1_2 * delta_time);
m_cube_pose_a.update_position(vec3(3 * (float)cos(radians), 1.0f, 0.0f));
m_cube_pose_b.rotate(glm::normalize(vec3(1.0f, 1.0f, 0.0f)), (float)TAU_1_2 * delta_time);
m_cube_pose_b.update_position(vec3(-3 * (float)cos(radians), -1.0f, 0.0f));
vec3 camera_translation(0.0f, 0.0f, 0.0f);
if (m_input_manager.is_key_down(GLFW_KEY_W)) camera_translation.y += 1;
if (m_input_manager.is_key_down(GLFW_KEY_S)) camera_translation.y -= 1;
if (m_input_manager.is_key_down(GLFW_KEY_A)) camera_translation.x -= 1;
if (m_input_manager.is_key_down(GLFW_KEY_D)) camera_translation.x += 1;
if (m_input_manager.is_key_down(GLFW_KEY_Q)) camera_translation.z -= 1;
if (m_input_manager.is_key_down(GLFW_KEY_E)) camera_translation.z += 1;
float camera_rotation = 0.0f;
if (m_input_manager.is_key_down(GLFW_KEY_Z)) camera_rotation += 1;
if (m_input_manager.is_key_down(GLFW_KEY_C)) camera_rotation -= 1;
m_camera.translate(camera_translation * delta_time);
m_camera.rotate(vec3(0.0f, 1.0f, 0.0f), camera_rotation * (float)TAU_1_8 * delta_time);
m_cube_batch.reset_rendered();
m_cube_batch.add_rendered(m_cube_pose_a);
m_cube_batch.add_rendered(m_cube_pose_b);
m_sprite_batch.reset_rendered();
m_sprite_batch.add_rendered(m_sprite_pose);
}
void MyBuiltinTexturedScene::prerender()
{
m_camera.prerender();
m_cube_batch.prerender();
m_sprite_batch.prerender();
}
void MyBuiltinTexturedScene::render()
{
glutil::clear_screen();
m_pipeline.render();
}

View File

@ -0,0 +1,47 @@
#pragma once
#include <charcoal/Poseable.h>
#include <charcoal/Scene.h>
#include <charcoal/ImageLoader.h>
#include <charcoal-builtin/TexturedPipeline.h>
#include <charcoal-builtin/BuiltinCamera3D.h>
using namespace charcoal;
using namespace charcoal::builtin;
class MyBuiltinTexturedScene : public Scene
{
public:
MyBuiltinTexturedScene(Application& application);
void init() override;
void use() override {}
void unuse() override {}
void update(float delta_time, clock_t clock) override;
void prerender() override;
void render() override;
private:
image_loader::ImageRGBA m_sprite_image;
textured::Renderable m_cube;
textured::Renderable m_sprite;
builtin::Camera3D m_camera;
textured::Batch m_cube_batch;
textured::Batch m_sprite_batch;
textured::Pipeline m_pipeline;
Poseable m_cube_pose_a;
Poseable m_cube_pose_b;
Poseable m_sprite_pose;
};