This commit is contained in:
Бранимир Караџић 2019-07-20 18:22:28 -07:00
parent caccb56707
commit 29d3a01e3a

View File

@ -11,57 +11,66 @@
* https://github.com/jdupuy/opengl-framework/tree/master/demo-isubd-terrain#implicit-subdivision-on-the-gpu
*/
#include "common.h"
#include "bgfx_utils.h"
#include "imgui/imgui.h"
#include "camera.h"
#include "bounds.h"
#include <bx/allocator.h>
#include <bx/debug.h>
#include <bx/math.h>
#include <bx/file.h>
#include <vector>
#include <bx/math.h>
#include "bgfx_utils.h"
#include "bounds.h"
#include "camera.h"
#include "common.h"
#include "constants.h"
#include "imgui/imgui.h"
namespace
{
enum {
enum
{
PROGRAM_TERRAIN_NORMAL,
PROGRAM_TERRAIN,
SHADING_COUNT };
enum {
SHADING_COUNT
};
enum
{
BUFFER_SUBD
};
enum {
PROGRAM_SUBD_CS_LOD,
PROGRAM_UPDATE_INDIRECT,
enum
{
PROGRAM_SUBD_CS_LOD,
PROGRAM_UPDATE_INDIRECT,
PROGRAM_INIT_INDIRECT,
PROGRAM_UPDATE_DRAW,
PROGRAM_COUNT
};
enum {
enum
{
TERRAIN_DMAP_SAMPLER,
TERRAIN_SMAP_SAMPLER,
SAMPLER_COUNT
};
enum {
enum
{
TEXTURE_DMAP,
TEXTURE_SMAP,
TEXTURE_COUNT
};
constexpr int32_t kNumVec4 = 2;
struct Uniforms
{
enum { NumVec4 = 2 };
void init()
{
u_params = bgfx::createUniform("u_params", bgfx::UniformType::Vec4, NumVec4);
u_params = bgfx::createUniform("u_params", bgfx::UniformType::Vec4, kNumVec4);
cull = 1;
freeze = 0;
@ -71,7 +80,7 @@ namespace
void submit()
{
bgfx::setUniform(u_params, params, NumVec4);
bgfx::setUniform(u_params, params, kNumVec4);
}
void destroy()
@ -83,11 +92,18 @@ namespace
{
struct
{
float dmapFactor; float lodFactor; float cull; float freeze;
float gpuSubd; float padding[3];
float dmapFactor;
float lodFactor;
float cull;
float freeze;
float gpuSubd;
float padding0;
float padding1;
float padding2;
};
float params[NumVec4 * 4];
float params[kNumVec4 * 4];
};
bgfx::UniformHandle u_params;
@ -123,7 +139,7 @@ namespace
m_primitivePixelLengthTarget = 7.0f;
m_fovy = 60.0f;
m_pingPong = 0;
m_reset_gpu = true;
m_restart = true;
// Enable m_debug text.
bgfx::setDebug(m_debug);
@ -156,9 +172,9 @@ namespace
cameraSetPosition({ 0.0f, 0.5f, 0.0f });
cameraSetVerticalAngle(0);
is_wireframe = false;
is_frozen = false;
is_culled = true;
m_wireframe = false;
m_freeze = false;
m_cull = true;
loadPrograms();
loadBuffers();
@ -187,19 +203,23 @@ namespace
bgfx::destroy(m_instancedGeometryIndices);
bgfx::destroy(m_instancedGeometryVertices);
for (uint32_t i = 0; i < PROGRAM_COUNT; ++i) {
for (uint32_t i = 0; i < PROGRAM_COUNT; ++i)
{
bgfx::destroy(m_programsCompute[i]);
}
for (uint32_t i = 0; i < SHADING_COUNT; ++i) {
for (uint32_t i = 0; i < SHADING_COUNT; ++i)
{
bgfx::destroy(m_programsDraw[i]);
}
for (uint32_t i = 0; i < SAMPLER_COUNT; ++i) {
for (uint32_t i = 0; i < SAMPLER_COUNT; ++i)
{
bgfx::destroy(m_samplers[i]);
}
for (uint32_t i = 0; i < TEXTURE_COUNT; ++i) {
for (uint32_t i = 0; i < TEXTURE_COUNT; ++i)
{
bgfx::destroy(m_textures[i]);
}
@ -245,8 +265,8 @@ namespace
, 0
);
if (ImGui::Checkbox("Debug wireframe", &is_wireframe)) {
if (is_wireframe) {
if (ImGui::Checkbox("Debug wireframe", &m_wireframe)) {
if (m_wireframe) {
bgfx::setDebug(BGFX_DEBUG_WIREFRAME);
}
else {
@ -256,8 +276,8 @@ namespace
ImGui::SameLine();
if (ImGui::Checkbox("Cull", &is_culled)) {
if (is_culled) {
if (ImGui::Checkbox("Cull", &m_cull)) {
if (m_cull) {
m_uniforms.cull = 1.0;
}
else {
@ -267,8 +287,8 @@ namespace
ImGui::SameLine();
if (ImGui::Checkbox("Freeze subdividing", &is_frozen)) {
if (is_frozen) {
if (ImGui::Checkbox("Freeze subdividing", &m_freeze)) {
if (m_freeze) {
m_uniforms.freeze = 1.0;
}
else {
@ -282,7 +302,7 @@ namespace
int gpuSlider = (int)m_uniforms.gpuSubd;
if (ImGui::SliderInt("Triangle Patch level", &gpuSlider, 0, 3)) {
m_reset_gpu = true;
m_restart = true;
m_uniforms.gpuSubd = (float)gpuSlider;
}
@ -292,15 +312,11 @@ namespace
ImGui::End();
if (!ImGui::MouseOverArea())
{
// Update camera.
cameraUpdate(deltaTime, m_mouseState);
if (!!m_mouseState.m_buttons[entry::MouseButton::Left])
{
}
cameraUpdate(deltaTime*0.01f, m_mouseState);
}
bgfx::touch(0);
@ -326,8 +342,8 @@ namespace
m_uniforms.submit();
// update the subd buffers
if (m_reset_gpu) {
if (m_restart) {
m_pingPong = 1;
bgfx::destroy(m_instancedGeometryVertices);
@ -349,7 +365,7 @@ namespace
bgfx::dispatch(0, m_programsCompute[PROGRAM_INIT_INDIRECT], 1, 1, 1);
m_reset_gpu = false;
m_restart = false;
}
else {
@ -528,12 +544,12 @@ namespace
};
uint32_t indices[] = {
0,
1,
3,
2,
3,
1
0,
1,
3,
2,
3,
1
};
m_geometryDecl.begin().add(bgfx::Attrib::Position, 4, bgfx::AttribType::Float).end();
@ -653,22 +669,26 @@ namespace
int64_t m_timeOffset;
struct {
struct DMap
{
bx::FilePath pathToFile;
float scale;
} m_dmap;
};
DMap m_dmap;
int m_computeThreadCount;
int m_shading;
int m_gpuSubd;
int m_pingPong;
float m_primitivePixelLengthTarget;
float m_fovy;
int m_pingPong;
bool m_reset_gpu;
bool is_wireframe;
bool is_culled;
bool is_frozen;
bool m_restart;
bool m_wireframe;
bool m_cull;
bool m_freeze;
};
} // namespace