Skip to content

Commit 490aa84

Browse files
committed
Rendering experiments
1 parent aebc1a4 commit 490aa84

10 files changed

+911
-432
lines changed

ascii-render.vcxproj

+38-9
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,32 @@
2222
<ProjectGuid>{8210BE36-4F8D-4CDA-BA18-5D0A55A072F4}</ProjectGuid>
2323
<Keyword>Win32Proj</Keyword>
2424
<RootNamespace>asciirender</RootNamespace>
25-
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
25+
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
2626
</PropertyGroup>
2727
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
2828
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
2929
<ConfigurationType>Application</ConfigurationType>
3030
<UseDebugLibraries>true</UseDebugLibraries>
31-
<PlatformToolset>v140</PlatformToolset>
31+
<PlatformToolset>v143</PlatformToolset>
3232
<CharacterSet>Unicode</CharacterSet>
3333
</PropertyGroup>
3434
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
3535
<ConfigurationType>Application</ConfigurationType>
3636
<UseDebugLibraries>false</UseDebugLibraries>
37-
<PlatformToolset>v140</PlatformToolset>
37+
<PlatformToolset>v143</PlatformToolset>
3838
<WholeProgramOptimization>true</WholeProgramOptimization>
3939
<CharacterSet>Unicode</CharacterSet>
4040
</PropertyGroup>
4141
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
4242
<ConfigurationType>Application</ConfigurationType>
4343
<UseDebugLibraries>true</UseDebugLibraries>
44-
<PlatformToolset>v140</PlatformToolset>
44+
<PlatformToolset>v143</PlatformToolset>
4545
<CharacterSet>Unicode</CharacterSet>
4646
</PropertyGroup>
4747
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
4848
<ConfigurationType>Application</ConfigurationType>
4949
<UseDebugLibraries>false</UseDebugLibraries>
50-
<PlatformToolset>v140</PlatformToolset>
50+
<PlatformToolset>v143</PlatformToolset>
5151
<WholeProgramOptimization>true</WholeProgramOptimization>
5252
<CharacterSet>Unicode</CharacterSet>
5353
</PropertyGroup>
@@ -89,14 +89,21 @@
8989
<Optimization>Disabled</Optimization>
9090
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
9191
<SDLCheck>true</SDLCheck>
92-
<AdditionalIncludeDirectories>$(DXSDK_DIR)\Include\</AdditionalIncludeDirectories>
92+
<AdditionalIncludeDirectories>
93+
</AdditionalIncludeDirectories>
94+
<OpenMPSupport>true</OpenMPSupport>
95+
<IntrinsicFunctions>true</IntrinsicFunctions>
96+
<LanguageStandard>stdcpp20</LanguageStandard>
9397
</ClCompile>
9498
<Link>
9599
<SubSystem>Windows</SubSystem>
96100
<GenerateDebugInformation>true</GenerateDebugInformation>
97101
<AdditionalLibraryDirectories>$(DXSDK_DIR)\Lib\x86\</AdditionalLibraryDirectories>
98102
<EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>
99103
</Link>
104+
<Manifest>
105+
<EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
106+
</Manifest>
100107
</ItemDefinitionGroup>
101108
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
102109
<ClCompile>
@@ -106,14 +113,21 @@
106113
<Optimization>Disabled</Optimization>
107114
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
108115
<SDLCheck>true</SDLCheck>
109-
<AdditionalIncludeDirectories>$(DXSDK_DIR)\Include\</AdditionalIncludeDirectories>
116+
<AdditionalIncludeDirectories>
117+
</AdditionalIncludeDirectories>
118+
<OpenMPSupport>true</OpenMPSupport>
119+
<IntrinsicFunctions>true</IntrinsicFunctions>
120+
<LanguageStandard>stdcpp20</LanguageStandard>
110121
</ClCompile>
111122
<Link>
112123
<SubSystem>Windows</SubSystem>
113124
<GenerateDebugInformation>true</GenerateDebugInformation>
114125
<AdditionalLibraryDirectories>$(DXSDK_DIR)\Lib\x64\</AdditionalLibraryDirectories>
115126
<EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>
116127
</Link>
128+
<Manifest>
129+
<EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
130+
</Manifest>
117131
</ItemDefinitionGroup>
118132
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
119133
<ClCompile>
@@ -125,7 +139,10 @@
125139
<IntrinsicFunctions>true</IntrinsicFunctions>
126140
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
127141
<SDLCheck>true</SDLCheck>
128-
<AdditionalIncludeDirectories>$(DXSDK_DIR)\Include\</AdditionalIncludeDirectories>
142+
<AdditionalIncludeDirectories>
143+
</AdditionalIncludeDirectories>
144+
<OpenMPSupport>true</OpenMPSupport>
145+
<LanguageStandard>stdcpp20</LanguageStandard>
129146
</ClCompile>
130147
<Link>
131148
<SubSystem>Windows</SubSystem>
@@ -135,6 +152,9 @@
135152
<AdditionalLibraryDirectories>$(DXSDK_DIR)\Lib\x86\</AdditionalLibraryDirectories>
136153
<EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>
137154
</Link>
155+
<Manifest>
156+
<EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
157+
</Manifest>
138158
</ItemDefinitionGroup>
139159
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
140160
<ClCompile>
@@ -146,7 +166,10 @@
146166
<IntrinsicFunctions>true</IntrinsicFunctions>
147167
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
148168
<SDLCheck>true</SDLCheck>
149-
<AdditionalIncludeDirectories>$(DXSDK_DIR)\Include\</AdditionalIncludeDirectories>
169+
<AdditionalIncludeDirectories>
170+
</AdditionalIncludeDirectories>
171+
<OpenMPSupport>true</OpenMPSupport>
172+
<LanguageStandard>stdcpp20</LanguageStandard>
150173
</ClCompile>
151174
<Link>
152175
<SubSystem>Windows</SubSystem>
@@ -156,6 +179,9 @@
156179
<AdditionalLibraryDirectories>$(DXSDK_DIR)\Lib\x64\</AdditionalLibraryDirectories>
157180
<EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>
158181
</Link>
182+
<Manifest>
183+
<EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
184+
</Manifest>
159185
</ItemDefinitionGroup>
160186
<ItemGroup>
161187
<ClCompile Include="drawing.cpp" />
@@ -189,6 +215,9 @@
189215
<ItemGroup>
190216
<None Include="math.inl" />
191217
</ItemGroup>
218+
<ItemGroup>
219+
<Natvis Include="support\ascii-render.natvis" />
220+
</ItemGroup>
192221
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
193222
<ImportGroup Label="ExtensionTargets">
194223
</ImportGroup>

ascii-render.vcxproj.filters

+8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
<Filter Include="mesh">
2020
<UniqueIdentifier>{317dece4-ddc7-4381-8928-8967e84d50c8}</UniqueIdentifier>
2121
</Filter>
22+
<Filter Include="support">
23+
<UniqueIdentifier>{51b45bd5-73b2-4f4d-8bf1-f8536330e040}</UniqueIdentifier>
24+
</Filter>
2225
</ItemGroup>
2326
<ItemGroup>
2427
<ClCompile Include="toaster\PixelToaster.cpp">
@@ -102,4 +105,9 @@
102105
<Filter>math</Filter>
103106
</None>
104107
</ItemGroup>
108+
<ItemGroup>
109+
<Natvis Include="support\ascii-render.natvis">
110+
<Filter>support</Filter>
111+
</Natvis>
112+
</ItemGroup>
105113
</Project>

drawing.cpp

+64
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include "drawing.h"
22
#include <algorithm>
33

4+
using std::min;
5+
using std::max;
46
template <typename T> static inline T min(T a, T b, T c) { return std::min(a, std::min(b, c)); }
57
template <typename T> static inline T max(T a, T b, T c) { return std::max(a, std::max(b, c)); }
68

@@ -465,6 +467,7 @@ void generic_triangle_3d(framebuffer_t& buffer,
465467
int CX1 = CY1 - FDY12 * offset_x;
466468
int CX2 = CY2 - FDY20 * offset_x;
467469

470+
//#pragma omp parallel for
468471
for (int x = minx; x < maxx; x++)
469472
{
470473
{
@@ -488,3 +491,64 @@ void generic_triangle_3d(framebuffer_t& buffer,
488491
CY2 += FDX20;
489492
}
490493
}
494+
495+
void generic_line_3d(framebuffer_t& buffer,
496+
float x0, float y0, float z0,
497+
float x1, float y1, float z1,
498+
float c0, float c1)
499+
{
500+
// 28.4 fixed-point coordinates
501+
int X0 = (int)(x0 * 16.0f);
502+
int X1 = (int)(x1 * 16.0f);
503+
int Y0 = (int)(y0 * 16.0f);
504+
int Y1 = (int)(y1 * 16.0f);
505+
506+
// 8.24 fixed-point coordinate
507+
int Z0 = (int)(1.0f / z0 * 0x1000000);
508+
int Z1 = (int)(1.0f / z1 * 0x1000000);
509+
510+
// Swap X/Y if Y is major axis, so X is always major axis
511+
const auto flip = abs(Y1 - Y0) > abs(X1 - X0);
512+
if (flip)
513+
{
514+
std::swap(X0, Y0);
515+
std::swap(X1, Y1);
516+
}
517+
518+
// Always draw left to right
519+
if (X0 > X1)
520+
{
521+
std::swap(X0, X1);
522+
std::swap(Y0, Y1);
523+
std::swap(Z0, Z1);
524+
std::swap(c0, c1);
525+
}
526+
527+
const auto ONE = 16; // sub-pixel precission
528+
const auto DX = X1 - X0;
529+
const auto DY = abs(Y1 - Y0);
530+
const auto step = Y0 < Y1 ? 1 : -1;
531+
532+
auto error = ONE * DX / 2;
533+
auto Y = Y0;
534+
535+
for (int X = X0; X < X1; X += ONE)
536+
{
537+
int Z = Z0 + (Z1 - Z0) * (X - X0) / DX; // 1/z in 8.24 fixed-point coordinate
538+
539+
auto z = 1.0f / (Z * (1.0f / 0x1000000)); // reconstruct z
540+
auto c = c0 + (c1 - c0) * (X - X0) / DX; // interpolate color
541+
542+
if (flip)
543+
buffer.set(Y >> 4, X >> 4, z, c); // draw pixel (x and y are swapped)
544+
else
545+
buffer.set(X >> 4, Y >> 4, z, c); // draw pixel
546+
547+
error = error - DY * ONE;
548+
while (error < 0)
549+
{
550+
Y += step;
551+
error += DX;
552+
}
553+
}
554+
}

drawing.h

+18-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ void generic_triangle_3d(framebuffer_t& buffer,
2222
float x2, float y2, float z2,
2323
float c0, float c1, float c2);
2424

25+
void generic_line_3d(framebuffer_t& buffer,
26+
float x0, float y0, float z0,
27+
float x1, float y1, float z1,
28+
float c0, float c1);
29+
2530
struct image_t
2631
{
2732
const uint8_t* data;
@@ -71,16 +76,21 @@ struct framebuffer_t
7176

7277
void set(int x, int y, float c)
7378
{
74-
set_color(x, y, c);
79+
if (!clip(x, y))
80+
set_color(x, y, c);
7581
}
7682

7783
void blend(int x, int y, float c, float a)
7884
{
79-
blend_color(x, y, c, a);
85+
if (!clip(x, y))
86+
blend_color(x, y, c, a);
8087
}
8188

8289
void set(int x, int y, float z, float c)
8390
{
91+
if (clip(x, y))
92+
return;
93+
8494
auto& d = depth[width * y + x];
8595
if (z > d)
8696
return;
@@ -111,5 +121,11 @@ struct framebuffer_t
111121
virtual void blend_color(int x, int y, float c, float a) = 0;
112122
virtual void commit_impl() = 0;
113123
virtual void present_impl() = 0;
124+
125+
private:
126+
bool clip(int x, int y) const
127+
{
128+
return x < 0 || y < 0 || x >= width || y >= height;
129+
}
114130
};
115131

0 commit comments

Comments
 (0)