Fixed broken link
[sixth-3d.git] / doc / index.html
1 <!doctype html>
2 <html lang="en">
3 <head>
4 <title>Sixth 3D - 3D engine</title>
5 <!-- 2017-07-07 Fri 13:11 -->
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width, initial-scale=1">
8 <meta name="generator" content="Org-mode">
9 <meta name="author" content="Svjatoslav Agejenko">
10 <link href="https://bootswatch.com/darkly/bootstrap.min.css" rel="stylesheet">
11 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
12 <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>"
13 <style type="text/css">
14 footer {background-color: #111 !important;}
15 pre {background-color: #111; color: #ccc;}
16 </style>
17 <style type="text/css">
18 /* org mode styles on top of twbs */
19
20 html {
21     position: relative;
22     min-height: 100%;
23 }
24
25 body {
26     font-size: 18px;
27     margin-bottom: 105px;
28 }
29
30 footer {
31     position: absolute;
32     bottom: 0;
33     width: 100%;
34     height: 101px;
35     background-color: #f5f5f5;
36 }
37
38 footer > div {
39     padding: 10px;
40 }
41
42 footer p {
43     margin: 0 0 5px;
44     text-align: center;
45     font-size: 16px;
46 }
47
48 #table-of-contents {
49     margin-top: 20px;
50     margin-bottom: 20px;
51 }
52
53 blockquote p {
54     font-size: 18px;
55 }
56
57 pre {
58     font-size: 16px;
59 }
60
61 .footpara {
62     display: inline-block;
63 }
64
65 figcaption {
66   font-size: 16px;
67   color: #666;
68   font-style: italic;
69   padding-bottom: 15px;
70 }
71
72 /* from twbs docs */
73
74 .bs-docs-sidebar.affix {
75     position: static;
76 }
77 @media (min-width: 768px) {
78     .bs-docs-sidebar {
79         padding-left: 20px;
80     }
81 }
82
83 /* All levels of nav */
84 .bs-docs-sidebar .nav > li > a {
85     display: block;
86     padding: 4px 20px;
87     font-size: 14px;
88     font-weight: 500;
89     color: #999;
90 }
91 .bs-docs-sidebar .nav > li > a:hover,
92 .bs-docs-sidebar .nav > li > a:focus {
93     padding-left: 19px;
94     color: #A1283B;
95     text-decoration: none;
96     background-color: transparent;
97     border-left: 1px solid #A1283B;
98 }
99 .bs-docs-sidebar .nav > .active > a,
100 .bs-docs-sidebar .nav > .active:hover > a,
101 .bs-docs-sidebar .nav > .active:focus > a {
102     padding-left: 18px;
103     font-weight: bold;
104     color: #A1283B;
105     background-color: transparent;
106     border-left: 2px solid #A1283B;
107 }
108
109 /* Nav: second level (shown on .active) */
110 .bs-docs-sidebar .nav .nav {
111     display: none; /* Hide by default, but at >768px, show it */
112     padding-bottom: 10px;
113 }
114 .bs-docs-sidebar .nav .nav > li > a {
115     padding-top: 1px;
116     padding-bottom: 1px;
117     padding-left: 30px;
118     font-size: 12px;
119     font-weight: normal;
120 }
121 .bs-docs-sidebar .nav .nav > li > a:hover,
122 .bs-docs-sidebar .nav .nav > li > a:focus {
123     padding-left: 29px;
124 }
125 .bs-docs-sidebar .nav .nav > .active > a,
126 .bs-docs-sidebar .nav .nav > .active:hover > a,
127 .bs-docs-sidebar .nav .nav > .active:focus > a {
128     padding-left: 28px;
129     font-weight: 500;
130 }
131
132 /* Nav: third level (shown on .active) */
133 .bs-docs-sidebar .nav .nav .nav {
134     padding-bottom: 10px;
135 }
136 .bs-docs-sidebar .nav .nav .nav > li > a {
137     padding-top: 1px;
138     padding-bottom: 1px;
139     padding-left: 40px;
140     font-size: 12px;
141     font-weight: normal;
142 }
143 .bs-docs-sidebar .nav .nav .nav > li > a:hover,
144 .bs-docs-sidebar .nav .nav .nav > li > a:focus {
145     padding-left: 39px;
146 }
147 .bs-docs-sidebar .nav .nav .nav > .active > a,
148 .bs-docs-sidebar .nav .nav .nav > .active:hover > a,
149 .bs-docs-sidebar .nav .nav .nav > .active:focus > a {
150     padding-left: 38px;
151     font-weight: 500;
152 }
153
154 /* Show and affix the side nav when space allows it */
155 @media (min-width: 992px) {
156     .bs-docs-sidebar .nav > .active > ul {
157         display: block;
158     }
159     /* Widen the fixed sidebar */
160     .bs-docs-sidebar.affix,
161     .bs-docs-sidebar.affix-bottom {
162         width: 213px;
163     }
164     .bs-docs-sidebar.affix {
165         position: fixed; /* Undo the static from mobile first approach */
166         top: 20px;
167     }
168     .bs-docs-sidebar.affix-bottom {
169         position: absolute; /* Undo the static from mobile first approach */
170     }
171     .bs-docs-sidebar.affix .bs-docs-sidenav,.bs-docs-sidebar.affix-bottom .bs-docs-sidenav {
172         margin-top: 0;
173         margin-bottom: 0
174     }
175 }
176 @media (min-width: 1200px) {
177     /* Widen the fixed sidebar again */
178     .bs-docs-sidebar.affix-bottom,
179     .bs-docs-sidebar.affix {
180         width: 263px;
181     }
182 }
183 </style>
184 <script type="text/javascript">
185 $(function() {
186     'use strict';
187
188     $('.bs-docs-sidebar li').first().addClass('active');
189
190     $(document.body).scrollspy({target: '.bs-docs-sidebar'});
191
192     $('.bs-docs-sidebar').affix();
193 });
194 </script>
195 </head>
196 <body>
197 <div id="content" class="container">
198 <div class="row"><div class="col-md-9"><h1 class="title">Sixth 3D - 3D engine</h1>
199 <hr >
200 <ul class="org-ul">
201 <li>This is a subproject of <a href="http://www2.svjatoslav.eu/gitbrowse/sixth/doc/index.html">Sixth</a>
202 </li>
203
204 <li><a href="http://www2.svjatoslav.eu/gitweb/?p=sixth-3d.git;a=snapshot;h=HEAD;sf=tgz">download latest snapshot</a>
205 </li>
206
207 <li>This program is free software; you can redistribute it and/or modify it under
208 the terms of version 3 of the <a href="https://www.gnu.org/licenses/lgpl.html">GNU Lesser General Public License</a> or later as
209 published by the Free Software Foundation.
210 </li>
211
212 <li>Program author:
213 <ul class="org-ul">
214 <li>Svjatoslav Agejenko
215 </li>
216 <li>Homepage: <a href="http://svjatoslav.eu">http://svjatoslav.eu</a>
217 </li>
218 <li>Email: <a href="mailto://svjatoslav@svjatoslav.eu">mailto://svjatoslav@svjatoslav.eu</a>
219 </li>
220 </ul>
221 </li>
222
223 <li><a href="http://www.svjatoslav.eu/programs.jsp">other applications hosted at svjatoslav.eu</a>
224 </li>
225 </ul>
226
227 <div id="outline-container-sec-1" class="outline-2">
228 <h2 id="sec-1"><span class="section-number-2">1</span> Project description</h2>
229 <div class="outline-text-2" id="text-1">
230 <p>
231 In-software, pure Java realtime 3D rendering engine. With the final
232 goal of becoming a platform for buildng 3D user interfaces and
233 interactive data visualization.
234 </p>
235
236 <ul class="org-ul">
237 <li>See: <a href="http://www2.svjatoslav.eu/gitbrowse/sixth-3d-demos/doc/index.html">demos of current 3D engine capabilities</a>
238 </li>
239 </ul>
240
241
242 <p>
243 System is implemented in Java because:
244 </p>
245 <ul class="org-ul">
246 <li>It is easy to refactor and experiment with.
247 </li>
248
249 <li>It scales well to handle great complexity.
250 <ul class="org-ul">
251 <li>Allows to implement clever performance optimizations (instead of
252 going for GPU offered brute-force rendering approach).
253 </li>
254 </ul>
255 </li>
256
257 <li>No limitations imposed by:
258 <ul class="org-ul">
259 <li>requirement for decent GPU
260 </li>
261 <li>GPU missing features
262 </li>
263 <li>GPU missing/incomplete/buggy drivers
264 </li>
265 <li>OpenGL specification
266 </li>
267 </ul>
268 </li>
269
270 <li>It is fast enough thanks to:
271 <ul class="org-ul">
272 <li>Java virtual machine just-in-time compiler.
273 </li>
274 <li>Growing CPU cores count.
275 </li>
276 </ul>
277 </li>
278
279 <li>As a result it is easy to run on various hardware platforms and
280 operating systems.
281 </li>
282 </ul>
283
284 <p>
285 3D rendering is done in software, 100% pure Java on CPU. At least for
286 now. Modern CPU cores count keeps growing and therefore rendering by
287 CPU is not as expensive as it used to be for the old single core
288 systems.
289 </p>
290
291 <p>
292 CPU rendering performance is already good enough to implement usable
293 3D UI at sufficient detail level, resolution and frame rate.
294 </p>
295
296 <p>
297 Pure Java also means easy portability and installation. No need to
298 deal with platform specific dependencies.
299 </p>
300
301 <p>
302 Also CPU rendering allows to easily test different rendering
303 algorithms and retains complete control of every rendered pixel.
304 </p>
305 </div>
306 </div>
307
308
309 <div id="outline-container-sec-2" class="outline-2">
310 <h2 id="sec-2"><span class="section-number-2">2</span> Instructions to embed Sixth-3D in your project</h2>
311 <div class="outline-text-2" id="text-2">
312 <p>
313 Maven *pom.xml* file snippet:
314 </p>
315 <div class="org-src-container">
316
317 <pre class="src src-xml">&lt;<span style="color: #A6E22E;">dependencies</span>&gt;
318     ...
319     &lt;<span style="color: #A6E22E;">dependency</span>&gt;
320         &lt;<span style="color: #A6E22E;">groupId</span>&gt;eu.svjatoslav&lt;/<span style="color: #A6E22E;">groupId</span>&gt;
321         &lt;<span style="color: #A6E22E;">artifactId</span>&gt;sixth-3d&lt;/<span style="color: #A6E22E;">artifactId</span>&gt;
322         &lt;<span style="color: #A6E22E;">version</span>&gt;1.0&lt;/<span style="color: #A6E22E;">version</span>&gt;
323     &lt;/<span style="color: #A6E22E;">dependency</span>&gt;
324     ...
325 &lt;/<span style="color: #A6E22E;">dependencies</span>&gt;
326
327 &lt;<span style="color: #A6E22E;">repositories</span>&gt;
328     ...
329     &lt;<span style="color: #A6E22E;">repository</span>&gt;
330         &lt;<span style="color: #A6E22E;">id</span>&gt;svjatoslav.eu&lt;/<span style="color: #A6E22E;">id</span>&gt;
331         &lt;<span style="color: #A6E22E;">name</span>&gt;Svjatoslav repository&lt;/<span style="color: #A6E22E;">name</span>&gt;
332         &lt;<span style="color: #A6E22E;">url</span>&gt;http://www2.svjatoslav.eu/maven/&lt;/<span style="color: #A6E22E;">url</span>&gt;
333     &lt;/<span style="color: #A6E22E;">repository</span>&gt;
334     ...
335 &lt;/<span style="color: #A6E22E;">repositories</span>&gt;
336 </pre>
337 </div>
338
339 <p>
340 See <a href="codeGraph/index.html">generated code graph</a> using <a href="http://www2.svjatoslav.eu/gitbrowse/javainspect/doc/index.html">this tool</a>.
341 </p>
342 </div>
343 </div>
344 <div id="outline-container-sec-3" class="outline-2">
345 <h2 id="sec-3"><span class="section-number-2">3</span> <span class="label label-primary TODO">TODO</span> features to add</h2>
346 <div class="outline-text-2" id="text-3">
347 <ul class="org-ul">
348 <li>Partial region/frame repaint: when only one small object changed on
349 the scene, it would be faster to re-render that specific area.
350 </li>
351
352 <li>Once partial rendering works, in would be easy to add multi-core
353 rendering support. So that each core renders it's own region of the
354 screen.
355 </li>
356
357 <li>Antialiazing. Would improve text readability. If antialiazing is too
358 expensive for every frame, it could be used only for last frame
359 before animations become still and waiting for user input starts.
360 </li>
361
362 <li>Render only visible polygons.
363 <ul class="org-ul">
364 <li>This would significantly reduce RAM &lt;-&gt; CPU traffic.
365 </li>
366
367 <li>General algorithm description:
368 <ul class="org-ul">
369 <li>For each horizontal scanline:
370 <ul class="org-ul">
371 <li>sort polygon edges from left to right
372 </li>
373 <li>while iterating and drawing pixels over screen X axis (left to
374 right) track next appearing/disappearing polygons.
375 <ul class="org-ul">
376 <li>For each polygon edge update Z sorted active polygons list.
377 </li>
378 <li>Only draw pixel from the top-most polygon.
379 <ul class="org-ul">
380 <li>Only if polygon area is transparent/half-transparent add
381 colors from the polygons below.
382 </li>
383 </ul>
384 </li>
385 </ul>
386 </li>
387 </ul>
388 </li>
389 </ul>
390 </li>
391
392 <li>As a bonus, this would allow to track which polygons are really
393 visible in the final scene for each frame.
394
395 <ul class="org-ul">
396 <li>Such information allows further optimizations:
397
398 <ul class="org-ul">
399 <li>Dynamic geometry simplification:
400 <ul class="org-ul">
401 <li>Dynamically detect and replace invisible objects from the
402 scene with simplified bounding box.
403 </li>
404
405 <li>Dynamically replace boudnig box with actual object once it
406 becomes visible.
407 </li>
408 </ul>
409 </li>
410
411 <li>Dynamically unload unused textures from RAM.
412 </li>
413 </ul>
414 </li>
415 </ul>
416 </li>
417 </ul>
418 </li>
419 </ul>
420 </div>
421 </div>
422 </div><div class="col-md-3"><nav id="table-of-contents">
423 <div id="text-table-of-contents" class="bs-docs-sidebar">
424 <ul class="nav">
425 <li><a href="#sec-1">1. Project description</a></li>
426 <li><a href="#sec-2">2. Instructions to embed Sixth-3D in your project</a></li>
427 <li><a href="#sec-3">3. features to add</a></li>
428 </ul>
429 </div>
430 </nav>
431 </div></div></div>
432 <footer id="postamble" class="">
433 <div><p class="author">Author: Svjatoslav Agejenko</p>
434 <p class="date">Created: 2017-07-07 Fri 13:11</p>
435 <p class="creator"><a href="http://www.gnu.org/software/emacs/">Emacs</a> 25.1.1 (<a href="http://orgmode.org">Org-mode</a> 8.2.10)</p>
436 </div>
437 </footer>
438 </body>
439 </html>