Disabled JavaDoc because functionality is still broken in Debian OpenJDK
[sixth-3d.git] / doc / index.html
1 <!doctype html>
2 <html lang="en">
3 <head>
4 <title>Sixth 3D - 3D engine</title>
5 <!-- 2020-01-29 K 21:36 -->
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/3/darkly/bootstrap.min.css" rel="stylesheet">
11 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
12 <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/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
200 <div id="outline-container-sec-1" class="outline-2">
201 <h2 id="sec-1"><span class="section-number-2">1</span> General</h2>
202 <div class="outline-text-2" id="text-1">
203 <ul class="org-ul">
204 <li>This is a subproject of parent project: <a href="https://www3.svjatoslav.eu/projects/sixth/">Sixth</a>.
205 </li>
206
207 <li>This program is free software: you can redistribute it and/or modify
208 it under the terms of the <a href="https://www.gnu.org/licenses/lgpl.html">GNU Lesser General Public License</a> as
209 published by the Free Software Foundation, either version 3 of the
210 License, or (at your option) any later version.
211 </li>
212
213 <li>Program author:
214 <ul class="org-ul">
215 <li>Svjatoslav Agejenko
216 </li>
217 <li>Homepage: <a href="https://svjatoslav.eu">https://svjatoslav.eu</a>
218 </li>
219 <li>Email: <a href="mailto://svjatoslav@svjatoslav.eu">mailto://svjatoslav@svjatoslav.eu</a>
220 </li>
221 </ul>
222 </li>
223
224 <li><a href="https://www.svjatoslav.eu/projects/">Other software projects hosted at svjatoslav.eu</a>
225 </li>
226 </ul>
227 </div>
228
229 <div id="outline-container-sec-1-1" class="outline-3">
230 <h3 id="sec-1-1"><span class="section-number-3">1.1</span> Source code</h3>
231 <div class="outline-text-3" id="text-1-1">
232 <ul class="org-ul">
233 <li><a href="https://www2.svjatoslav.eu/gitweb/?p=sixth-3d.git;a=snapshot;h=HEAD;sf=tgz">Download latest snapshot in TAR GZ format</a>
234 </li>
235
236 <li><a href="https://www2.svjatoslav.eu/gitweb/?p=sixth-3d.git;a=summary">Browse Git repository online</a>
237 </li>
238
239 <li>Clone Git repository using command:
240 <pre class="example">
241 git clone https://www2.svjatoslav.eu/git/sixth-3d.git
242
243 </pre>
244 </li>
245 </ul>
246 </div>
247 </div>
248 </div>
249
250 <div id="outline-container-sec-2" class="outline-2">
251 <h2 id="sec-2"><span class="section-number-2">2</span> Project description</h2>
252 <div class="outline-text-2" id="text-2">
253 <ul class="org-ul">
254 <li>See: <a href="https://www3.svjatoslav.eu/projects/sixth-3d-demos/">demos of current 3D engine capabilities</a>
255 </li>
256 </ul>
257
258 <p>
259 <a href="#sec-2-1">In software</a>, <a href="#sec-2-2">pure Java</a> realtime 3D rendering engine. With the final
260 goal of becoming a platform for buildng 3D user interfaces and
261 interactive data visualization for <a href="https://www3.svjatoslav.eu/projects/sixth/">project Sixth</a>.
262 </p>
263
264 <p>
265 Sixth 3D can be also used as standalone <a href="#sec-4">3D engine in your project</a>.
266 </p>
267 </div>
268
269 <div id="outline-container-sec-2-1" class="outline-3">
270 <h3 id="sec-2-1"><a id="ID-d03013e5-931b-40ca-bc4b-e4b3f23b9a4e" name="ID-d03013e5-931b-40ca-bc4b-e4b3f23b9a4e"></a><span class="section-number-3">2.1</span> Justification for software rendering</h3>
271 <div class="outline-text-3" id="text-2-1">
272 <p>
273 3D rendering is done in software, 100% pure Java on CPU. At least for
274 now. Modern CPU cores count keeps growing and therefore rendering by
275 CPU is not as expensive as it used to be for the old single core
276 systems.
277 </p>
278
279 <p>
280 CPU rendering performance is already good enough to implement usable
281 3D UI at sufficient detail level, resolution and frame rate.
282 </p>
283
284 <p>
285 Also CPU rendering allows to freely test different rendering and
286 optimization algorithms and retains complete control of every rendered
287 pixel.
288 </p>
289 </div>
290 </div>
291 <div id="outline-container-sec-2-2" class="outline-3">
292 <h3 id="sec-2-2"><a id="ID-a11f7150-1b25-4ca4-a3c3-8c8bd1352bd4" name="ID-a11f7150-1b25-4ca4-a3c3-8c8bd1352bd4"></a><span class="section-number-3">2.2</span> Justification for Java</h3>
293 <div class="outline-text-3" id="text-2-2">
294 <ul class="org-ul">
295 <li>It is easy to refactor and experiment with.
296 </li>
297
298 <li>Easy portability and installation. No need to deal with platform
299 specific dependencies.
300 </li>
301
302 <li>It scales well to handle great complexity.
303 <ul class="org-ul">
304 <li>Allows to implement clever performance optimizations (instead of
305 going for GPU offered brute-force rendering approach).
306 </li>
307 </ul>
308 </li>
309
310 <li>No limitations imposed by:
311 <ul class="org-ul">
312 <li>requirement for decent GPU
313 </li>
314 <li>GPU missing features
315 </li>
316 <li>GPU missing/incomplete/buggy drivers
317 </li>
318 <li>OpenGL specification
319 </li>
320 </ul>
321 </li>
322
323 <li>It is fast enough thanks to:
324 <ul class="org-ul">
325 <li>Java virtual machine just-in-time compiler.
326 </li>
327 <li>Growing CPU cores count.
328 </li>
329 </ul>
330 </li>
331
332 <li>As a result it is easy to run on various hardware platforms and
333 operating systems.
334 </li>
335 </ul>
336 </div>
337 </div>
338 </div>
339
340 <div id="outline-container-sec-3" class="outline-2">
341 <h2 id="sec-3"><span class="section-number-2">3</span> API documentation</h2>
342 <div class="outline-text-2" id="text-3">
343 <p>
344 Note: due to a lack of time, there is still big room for improvement
345 on documentation.
346 </p>
347
348 <p>
349 So far best resource is to download and explore source code for:
350 </p>
351 <ul class="org-ul">
352 <li>3D engine (<a href="https://www3.svjatoslav.eu/projects/sixth-3d/graphs/">generated code graphs</a> (generated using <a href="https://www3.svjatoslav.eu/projects/javainspect/">JavaInspect</a>))
353 </li>
354 <li>For API usage examples, see <a href="https://www3.svjatoslav.eu/projects/sixth-3d-demos/">demos</a>
355 </li>
356 </ul>
357 </div>
358 </div>
359 <div id="outline-container-sec-4" class="outline-2">
360 <h2 id="sec-4"><a id="ID-08f71987-90af-40dc-bb65-bac87db9e652" name="ID-08f71987-90af-40dc-bb65-bac87db9e652"></a><span class="section-number-2">4</span> Instructions to embed Sixth-3D in your project</h2>
361 <div class="outline-text-2" id="text-4">
362 <p>
363 Maven *pom.xml* file snippet:
364 </p>
365 <div class="org-src-container">
366
367 <pre class="src src-xml">&lt;<span style="color: #A6E22E;">dependencies</span>&gt;
368     ...
369     &lt;<span style="color: #A6E22E;">dependency</span>&gt;
370         &lt;<span style="color: #A6E22E;">groupId</span>&gt;eu.svjatoslav&lt;/<span style="color: #A6E22E;">groupId</span>&gt;
371         &lt;<span style="color: #A6E22E;">artifactId</span>&gt;sixth-3d&lt;/<span style="color: #A6E22E;">artifactId</span>&gt;
372         &lt;<span style="color: #A6E22E;">version</span>&gt;1.1&lt;/<span style="color: #A6E22E;">version</span>&gt;
373     &lt;/<span style="color: #A6E22E;">dependency</span>&gt;
374     ...
375 &lt;/<span style="color: #A6E22E;">dependencies</span>&gt;
376
377 &lt;<span style="color: #A6E22E;">repositories</span>&gt;
378     ...
379     &lt;<span style="color: #A6E22E;">repository</span>&gt;
380         &lt;<span style="color: #A6E22E;">id</span>&gt;svjatoslav.eu&lt;/<span style="color: #A6E22E;">id</span>&gt;
381         &lt;<span style="color: #A6E22E;">name</span>&gt;Svjatoslav repository&lt;/<span style="color: #A6E22E;">name</span>&gt;
382         &lt;<span style="color: #A6E22E;">url</span>&gt;http://www2.svjatoslav.eu/maven/&lt;/<span style="color: #A6E22E;">url</span>&gt;
383     &lt;/<span style="color: #A6E22E;">repository</span>&gt;
384     ...
385 &lt;/<span style="color: #A6E22E;">repositories</span>&gt;
386 </pre>
387 </div>
388
389 <p>
390 For API usage examples, see <a href="https://www3.svjatoslav.eu/projects/sixth-3d-demos/">demos</a>.
391 </p>
392 </div>
393 </div>
394 <div id="outline-container-sec-5" class="outline-2">
395 <h2 id="sec-5"><span class="section-number-2">5</span> <span class="label label-primary TODO">TODO</span> features to add</h2>
396 <div class="outline-text-2" id="text-5">
397 <ul class="org-ul">
398 <li>read this as example, and apply improvements/fixes where applicable:
399 <a href="http://blog.rogach.org/2015/08/how-to-create-your-own-simple-3d-render.html">http://blog.rogach.org/2015/08/how-to-create-your-own-simple-3d-render.html</a>
400 </li>
401
402 <li>Partial region/frame repaint: when only one small object changed on
403 the scene, it would be faster to re-render that specific area.
404 </li>
405
406 <li>Once partial rendering works, in would be easy to add multi-core
407 rendering support. So that each core renders it's own region of the
408 screen.
409 </li>
410
411 <li>Antialiazing. Would improve text readability. If antialiazing is too
412 expensive for every frame, it could be used only for last frame
413 before animations become still and waiting for user input starts.
414 </li>
415 </ul>
416 </div>
417 <div id="outline-container-sec-5-1" class="outline-3">
418 <h3 id="sec-5-1"><span class="section-number-3">5.1</span> Render only visible polygons</h3>
419 <div class="outline-text-3" id="text-5-1">
420 <ul class="org-ul">
421 <li>This would significantly reduce RAM &lt;-&gt; CPU traffic.
422 </li>
423
424 <li>General algorithm description:
425 <ul class="org-ul">
426 <li>For each horizontal scanline:
427 <ul class="org-ul">
428 <li>sort polygon edges from left to right
429 </li>
430 <li>while iterating and drawing pixels over screen X axis (left to
431 right) track next appearing/disappearing polygons.
432 <ul class="org-ul">
433 <li>For each polygon edge update Z sorted active polygons list.
434 </li>
435 <li>Only draw pixel from the top-most polygon.
436 <ul class="org-ul">
437 <li>Only if polygon area is transparent/half-transparent add
438 colors from the polygons below.
439 </li>
440 </ul>
441 </li>
442 </ul>
443 </li>
444 </ul>
445 </li>
446 </ul>
447 </li>
448
449 <li>As a bonus, this would allow to track which polygons are really
450 visible in the final scene for each frame.
451
452 <ul class="org-ul">
453 <li>Such information allows further optimizations:
454
455 <ul class="org-ul">
456 <li>Dynamic geometry simplification:
457 <ul class="org-ul">
458 <li>Dynamically detect and replace invisible objects from the
459 scene with simplified bounding box.
460 </li>
461
462 <li>Dynamically replace boudnig box with actual object once it
463 becomes visible.
464 </li>
465 </ul>
466 </li>
467
468 <li>Dynamically unload unused textures from RAM.
469 </li>
470 </ul>
471 </li>
472 </ul>
473 </li>
474 </ul>
475 </div>
476 </div>
477 </div>
478 </div><div class="col-md-3"><nav id="table-of-contents">
479 <div id="text-table-of-contents" class="bs-docs-sidebar">
480 <ul class="nav">
481 <li><a href="#sec-1">1. General</a>
482 <ul class="nav">
483 <li><a href="#sec-1-1">1.1. Source code</a></li>
484 </ul>
485 </li>
486 <li><a href="#sec-2">2. Project description</a>
487 <ul class="nav">
488 <li><a href="#sec-2-1">2.1. Justification for software rendering</a></li>
489 <li><a href="#sec-2-2">2.2. Justification for Java</a></li>
490 </ul>
491 </li>
492 <li><a href="#sec-3">3. API documentation</a></li>
493 <li><a href="#sec-4">4. Instructions to embed Sixth-3D in your project</a></li>
494 <li><a href="#sec-5">5. features to add</a>
495 <ul class="nav">
496 <li><a href="#sec-5-1">5.1. Render only visible polygons</a></li>
497 </ul>
498 </li>
499 </ul>
500 </div>
501 </nav>
502 </div></div></div>
503 <footer id="postamble" class="">
504 <div><p class="author">Author: Svjatoslav Agejenko</p>
505 <p class="date">Created: 2020-01-29 K 21:36</p>
506 <p class="creator"><a href="http://www.gnu.org/software/emacs/">Emacs</a> 26.1 (<a href="http://orgmode.org">Org-mode</a> 9.1.9)</p>
507 </div>
508 </footer>
509 </body>
510 </html>