Skip to content

Commit

Permalink
Style fixes, general code cleanup.
Browse files Browse the repository at this point in the history
  • Loading branch information
john-chapman committed May 15, 2020
1 parent a00e5fd commit 503dc30
Show file tree
Hide file tree
Showing 11 changed files with 1,513 additions and 911 deletions.
78 changes: 48 additions & 30 deletions examples/DirectX11/im3d_directx11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,76 +43,85 @@ bool Im3d_Init()
ID3D11Device* d3d = g_Example->m_d3dDevice;
{ // points shader
g_Im3dShaderPoints.m_vsBlob = LoadCompileShader("vs_" IM3D_DX11_VSHADER, "im3d.hlsl", "VERTEX_SHADER\0POINTS\0");
if (!g_Im3dShaderPoints.m_vsBlob) {
if (!g_Im3dShaderPoints.m_vsBlob)
{
return false;
}
dxAssert(d3d->CreateVertexShader((DWORD*)g_Im3dShaderPoints.m_vsBlob->GetBufferPointer(), g_Im3dShaderPoints.m_vsBlob->GetBufferSize(), nullptr, &g_Im3dShaderPoints.m_vs));

g_Im3dShaderPoints.m_gsBlob = LoadCompileShader("gs_" IM3D_DX11_VSHADER, "im3d.hlsl", "GEOMETRY_SHADER\0POINTS\0");
if (!g_Im3dShaderPoints.m_gsBlob) {
if (!g_Im3dShaderPoints.m_gsBlob)
{
return false;
}
dxAssert(d3d->CreateGeometryShader((DWORD*)g_Im3dShaderPoints.m_gsBlob->GetBufferPointer(), g_Im3dShaderPoints.m_gsBlob->GetBufferSize(), nullptr, &g_Im3dShaderPoints.m_gs));

g_Im3dShaderPoints.m_psBlob = LoadCompileShader("ps_" IM3D_DX11_VSHADER, "im3d.hlsl", "PIXEL_SHADER\0POINTS\0");
if (!g_Im3dShaderPoints.m_psBlob) {
if (!g_Im3dShaderPoints.m_psBlob)
{
return false;
}
dxAssert(d3d->CreatePixelShader((DWORD*)g_Im3dShaderPoints.m_psBlob->GetBufferPointer(), g_Im3dShaderPoints.m_psBlob->GetBufferSize(), nullptr, &g_Im3dShaderPoints.m_ps));
}

{ // lines shader
g_Im3dShaderLines.m_vsBlob = LoadCompileShader("vs_" IM3D_DX11_VSHADER, "im3d.hlsl", "VERTEX_SHADER\0LINES\0");
if (!g_Im3dShaderLines.m_vsBlob) {
if (!g_Im3dShaderLines.m_vsBlob)
{
return false;
}
dxAssert(d3d->CreateVertexShader((DWORD*)g_Im3dShaderLines.m_vsBlob->GetBufferPointer(), g_Im3dShaderLines.m_vsBlob->GetBufferSize(), nullptr, &g_Im3dShaderLines.m_vs));

g_Im3dShaderLines.m_gsBlob = LoadCompileShader("gs_" IM3D_DX11_VSHADER, "im3d.hlsl", "GEOMETRY_SHADER\0LINES\0");
if (!g_Im3dShaderLines.m_gsBlob) {
if (!g_Im3dShaderLines.m_gsBlob)
{
return false;
}
dxAssert(d3d->CreateGeometryShader((DWORD*)g_Im3dShaderLines.m_gsBlob->GetBufferPointer(), g_Im3dShaderLines.m_gsBlob->GetBufferSize(), nullptr, &g_Im3dShaderLines.m_gs));

g_Im3dShaderLines.m_psBlob = LoadCompileShader("ps_" IM3D_DX11_VSHADER, "im3d.hlsl", "PIXEL_SHADER\0LINES\0");
if (!g_Im3dShaderLines.m_psBlob) {
if (!g_Im3dShaderLines.m_psBlob)
{
return false;
}
dxAssert(d3d->CreatePixelShader((DWORD*)g_Im3dShaderLines.m_psBlob->GetBufferPointer(), g_Im3dShaderLines.m_psBlob->GetBufferSize(), nullptr, &g_Im3dShaderLines.m_ps));
}

{ // triangles shader
g_Im3dShaderTriangles.m_vsBlob = LoadCompileShader("vs_" IM3D_DX11_VSHADER, "im3d.hlsl", "VERTEX_SHADER\0TRIANGLES\0");
if (!g_Im3dShaderTriangles.m_vsBlob) {
if (!g_Im3dShaderTriangles.m_vsBlob)
{
return false;
}
dxAssert(d3d->CreateVertexShader((DWORD*)g_Im3dShaderTriangles.m_vsBlob->GetBufferPointer(), g_Im3dShaderTriangles.m_vsBlob->GetBufferSize(), nullptr, &g_Im3dShaderTriangles.m_vs));

g_Im3dShaderTriangles.m_psBlob = LoadCompileShader("ps_" IM3D_DX11_VSHADER, "im3d.hlsl", "PIXEL_SHADER\0TRIANGLES\0");
if (!g_Im3dShaderTriangles.m_psBlob) {
if (!g_Im3dShaderTriangles.m_psBlob)
{
return false;
}
dxAssert(d3d->CreatePixelShader((DWORD*)g_Im3dShaderTriangles.m_psBlob->GetBufferPointer(), g_Im3dShaderTriangles.m_psBlob->GetBufferSize(), nullptr, &g_Im3dShaderTriangles.m_ps));
}

{
D3D11_INPUT_ELEMENT_DESC desc[] = {
{ "POSITION_SIZE", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, (UINT)offsetof(Im3d::VertexData, m_positionSize), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)offsetof(Im3d::VertexData, m_color), D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
{ D3D11_INPUT_ELEMENT_DESC desc[] =
{
{ "POSITION_SIZE", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, (UINT)offsetof(Im3d::VertexData, m_positionSize), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)offsetof(Im3d::VertexData, m_color), D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
dxAssert(d3d->CreateInputLayout(desc, 2, g_Im3dShaderPoints.m_vsBlob->GetBufferPointer(), g_Im3dShaderPoints.m_vsBlob->GetBufferSize(), &g_Im3dInputLayout));
}

{
D3D11_RASTERIZER_DESC desc = {};
{ D3D11_RASTERIZER_DESC desc = {};
desc.FillMode = D3D11_FILL_SOLID;
desc.CullMode = D3D11_CULL_NONE; // culling invalid for points/lines (they are view-aligned), valid but optional for triangles
dxAssert(d3d->CreateRasterizerState(&desc, &g_Im3dRasterizerState));
}
{
D3D11_DEPTH_STENCIL_DESC desc = {};

{ D3D11_DEPTH_STENCIL_DESC desc = {};
dxAssert(d3d->CreateDepthStencilState(&desc, &g_Im3dDepthStencilState));
}
{
D3D11_BLEND_DESC desc = {};

{ D3D11_BLEND_DESC desc = {};
desc.RenderTarget[0].BlendEnable = true;
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
Expand Down Expand Up @@ -168,14 +177,17 @@ void Im3d_NewFrame()
cursorPos = (cursorPos / ad.m_viewportSize) * 2.0f - 1.0f;
cursorPos.y = -cursorPos.y; // window origin is top-left, ndc is bottom-left
Vec3 rayOrigin, rayDirection;
if (g_Example->m_camOrtho) {
if (g_Example->m_camOrtho)
{
rayOrigin.x = cursorPos.x / g_Example->m_camProj(0, 0);
rayOrigin.y = cursorPos.y / g_Example->m_camProj(1, 1);
rayOrigin.z = 0.0f;
rayOrigin = g_Example->m_camWorld * Vec4(rayOrigin, 1.0f);
rayDirection = g_Example->m_camWorld * Vec4(0.0f, 0.0f, -1.0f, 0.0f);

} else {
}
else
{
rayOrigin = ad.m_viewOrigin;
rayDirection.x = cursorPos.x / g_Example->m_camProj(0, 0);
rayDirection.y = cursorPos.y / g_Example->m_camProj(1, 1);
Expand Down Expand Up @@ -224,20 +236,23 @@ void Im3d_EndFrame()
ID3D11Device* d3d = g_Example->m_d3dDevice;
ID3D11DeviceContext* ctx = g_Example->m_d3dDeviceCtx;

D3D11_VIEWPORT viewport = {
0.0f, 0.0f, // TopLeftX, TopLeftY
(float)g_Example->m_width, (float)g_Example->m_height,
0.0f, 1.0f // MinDepth, MaxDepth
D3D11_VIEWPORT viewport =
{
0.0f, 0.0f, // TopLeftX, TopLeftY
(float)g_Example->m_width, (float)g_Example->m_height,
0.0f, 1.0f // MinDepth, MaxDepth
};
ctx->RSSetViewports(1, &viewport);
ctx->OMSetBlendState(g_Im3dBlendState, nullptr, 0xffffffff);
ctx->OMSetDepthStencilState(g_Im3dDepthStencilState, 0);
ctx->RSSetState(g_Im3dRasterizerState);

for (U32 i = 0, n = Im3d::GetDrawListCount(); i < n; ++i) {
for (U32 i = 0, n = Im3d::GetDrawListCount(); i < n; ++i)
{
auto& drawList = Im3d::GetDrawLists()[i];

if (drawList.m_layerId == Im3d::MakeId("NamedLayer")) {
if (drawList.m_layerId == Im3d::MakeId("NamedLayer"))
{
// The application may group primitives into layers, which can be used to change the draw state (e.g. enable depth testing, use a different shader)
}

Expand All @@ -250,8 +265,10 @@ void Im3d_EndFrame()

// upload vertex data
static U32 s_vertexBufferSize = 0;
if (!g_Im3dVertexBuffer || s_vertexBufferSize < drawList.m_vertexCount) {
if (g_Im3dVertexBuffer) {
if (!g_Im3dVertexBuffer || s_vertexBufferSize < drawList.m_vertexCount)
{
if (g_Im3dVertexBuffer)
{
g_Im3dVertexBuffer->Release();
g_Im3dVertexBuffer = nullptr;
}
Expand All @@ -262,7 +279,8 @@ void Im3d_EndFrame()
UnmapBuffer(g_Im3dVertexBuffer);

// select shader/primitive topo
switch (drawList.m_primType) {
switch (drawList.m_primType)
{
case Im3d::DrawPrimitive_Points:
ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
ctx->VSSetShader(g_Im3dShaderPoints.m_vs, nullptr, 0);
Expand Down
42 changes: 28 additions & 14 deletions examples/MultiContext/im3d_multicontext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,21 +48,25 @@ static void MainThreadDraw();
int main(int, char**)
{
Im3d::Example example;
if (!example.init(-1, -1, "Im3d Example")) {
if (!example.init(-1, -1, "Im3d Example"))
{
return 1;
}

for (int i = 0; i < kThreadCountMax; ++i) {
for (int i = 0; i < kThreadCountMax; ++i)
{
float threadX = (float)i / (float)kThreadCountMax * 10.0f - 5.0f;
g_ThreadGizmoTest[i] = Im3d::Mat4(Im3d::Vec3(threadX, 0.0f, 0.0f), Im3d::Mat3(1.0f), Im3d::Vec3(1.0f));
}

while (example.update()) { // calls Im3d_NewFrame() (see im3d_opengl33.cpp)
while (example.update()) // calls Im3d_NewFrame() (see im3d_opengl33.cpp)
{
// At this point we have updated the default context and filled its AppData struct.

// Each separate context could potentially use different AppData (e.g. different cameras/viewports). Here
// we just copy the default for simplicity.
for (auto& ctx : g_ThreadContexts) {
for (auto& ctx : g_ThreadContexts)
{
ctx.getAppData() = Im3d::GetAppData();

ctx.reset(); // equivalent to calling Im3d::NewFrame() on the thread
Expand All @@ -72,17 +76,20 @@ int main(int, char**)

// The frame can now proceed, threads can safely make Im3d:: calls (after setting the context ptr, see ThreadDraw()).
std::thread threads[kThreadCountMax];
for (int i = 0; i < g_ThreadCount; ++i) {
for (int i = 0; i < g_ThreadCount; ++i)
{
threads[i] = std::thread(&ThreadDraw, i);
}

// Towards the end of the frame we need to synchronize so that we can safely merge vertex data from the per-thread contexts.
for (int i = 0; i < g_ThreadCount; ++i) {
for (int i = 0; i < g_ThreadCount; ++i)
{
threads[i].join();
}

// Prior to calling Im3d::EndFrame() we need to merge the per-thread contexts into the main thread context.
for (int i = 0; i < g_ThreadCount; ++i) {
for (int i = 0; i < g_ThreadCount; ++i)
{
Im3d::MergeContexts(Im3d::GetContext(), g_ThreadContexts[i]);
}

Expand Down Expand Up @@ -127,14 +134,16 @@ void ThreadDraw(int _threadIndex)
Im3d::SetColor(g_ThreadColors[_threadIndex]);

Im3d::BeginPoints();
for (int i = 0; i < 256; ++i) {
for (int i = 0; i < 256; ++i)
{
Im3d::Vertex(Im3d::RandVec3(-10.0f, 10.0f), Im3d::RandFloat(2.0f, 16.0f));
}
Im3d::End();

Im3d::SetAlpha(0.5f);
Im3d::BeginTriangles();
for (int i = 0; i < 32; ++i) {
for (int i = 0; i < 32; ++i)
{
Im3d::Mat4 wm(1.0f);
Im3d::PushMatrix();
Im3d::Rotate(Im3d::Normalize(Im3d::RandVec3(-1.0f, 1.0f)), Im3d::RandFloat(0.0f, 6.0f));
Expand All @@ -159,7 +168,8 @@ void MainThreadDraw()
ImGui::Begin("Im3d Demo", nullptr, ImGuiWindowFlags_AlwaysAutoResize);

ImGui::SetNextTreeNodeOpen(true, ImGuiSetCond_Once);
if (ImGui::TreeNode("About")) {
if (ImGui::TreeNode("About"))
{
ImGui::Text("Welcome to the Im3d demo!");
ImGui::Spacing();
ImGui::Text("WASD = forward/left/backward/right");
Expand All @@ -173,25 +183,29 @@ void MainThreadDraw()
ImGui::Spacing();

ImGui::SetNextTreeNodeOpen(true, ImGuiSetCond_Once);
if (ImGui::TreeNode("Threads")) {
if (ImGui::TreeNode("Threads"))
{
ImGui::SliderInt("Thread Count", &g_ThreadCount, 0, kThreadCountMax);
ImGui::Checkbox("Enable Sorting", &g_EnableSorting);
ImGui::TreePop();
}

ImGui::SetNextTreeNodeOpen(true, ImGuiSetCond_Once);
if (ImGui::TreeNode("Grid")) {
if (ImGui::TreeNode("Grid"))
{
static int gridSize = 20;
ImGui::SliderInt("Grid Size", &gridSize, 1, 50);
const float gridHalf = (float)gridSize * 0.5f;
Im3d::SetAlpha(1.0f);
Im3d::SetSize(1.0f);
Im3d::BeginLines();
for (int x = 0; x <= gridSize; ++x) {
for (int x = 0; x <= gridSize; ++x)
{
Im3d::Vertex(-gridHalf, 0.0f, (float)x - gridHalf, Im3d::Color(0.0f, 0.0f, 0.0f));
Im3d::Vertex( gridHalf, 0.0f, (float)x - gridHalf, Im3d::Color(1.0f, 0.0f, 0.0f));
}
for (int z = 0; z <= gridSize; ++z) {
for (int z = 0; z <= gridSize; ++z)
{
Im3d::Vertex((float)z - gridHalf, 0.0f, -gridHalf, Im3d::Color(0.0f, 0.0f, 0.0f));
Im3d::Vertex((float)z - gridHalf, 0.0f, gridHalf, Im3d::Color(0.0f, 0.0f, 1.0f));
}
Expand Down
Loading

0 comments on commit 503dc30

Please sign in to comment.