File: CastleSphericalHarmonics.html

package info (click to toggle)
castle-game-engine 5.2.0-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 185,428 kB
  • sloc: pascal: 260,781; cpp: 1,363; objc: 713; makefile: 537; xml: 496; sh: 480; php: 4
file content (179 lines) | stat: -rw-r--r-- 10,427 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>Castle Game Engine: CastleSphericalHarmonics</title>
<meta name="generator" content="PasDoc 0.13.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>Castle Game Engine</h2><p><a href="introduction.html" class="navigation">Introduction</a></p><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h1 class="unit">Unit CastleSphericalHarmonics</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td>Classes, Interfaces, Objects and Records</td><td><a class="section" href="#PasDoc-FuncsProcs">Functions and Procedures</a></td><td><a class="section" href="#PasDoc-Types">Types</a></td><td><a class="section" href="#PasDoc-Constants">Constants</a></td><td><a class="section" href="#PasDoc-Variables">Variables</a></td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
<p>
Spherical harmonic basis functions.</p>
<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li><a  href="CastleVectors.html">CastleVectors</a></li><li><a  href="CastleUtils.html">CastleUtils</a></li><li>Math</li><li><a  href="CastleCubeMaps.html">CastleCubeMaps</a></li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-FuncsProcs"></a><h3 class="summary">Functions and Procedures</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code>function <b><a  href="CastleSphericalHarmonics.html#SHBasis">SHBasis</a></b>(const LM: Cardinal; const PhiTheta: <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>): <a  href="CastleUtils.html#Float">Float</a>;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>procedure <b><a  href="CastleSphericalHarmonics.html#LMDecode">LMDecode</a></b>(const LM: Cardinal; out L: Cardinal; out M: Integer);</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code>procedure <b><a  href="CastleSphericalHarmonics.html#InitializeSHBasisMap">InitializeSHBasisMap</a></b>;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>procedure <b><a  href="CastleSphericalHarmonics.html#SHVectorFromCubeMap">SHVectorFromCubeMap</a></b>(var SHVector: array of Single; const Map: <a  href="CastleCubeMaps.html#TCubeMapByte">TCubeMapByte</a>);</code></td>
</tr>
</table>
<a name="PasDoc-Types"></a><h3 class="summary">Types</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code><b><a  href="CastleSphericalHarmonics.html#TSHVectorSingle">TSHVectorSingle</a></b> = array [0..<a  href="CastleSphericalHarmonics.html#MaxSHBasis">MaxSHBasis</a> - 1] of Single;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code><b><a  href="CastleSphericalHarmonics.html#PSHVectorSingle">PSHVectorSingle</a></b> = &circ;<a  href="CastleSphericalHarmonics.html#TSHVectorSingle">TSHVectorSingle</a>;</code></td>
</tr>
</table>
<a name="PasDoc-Constants"></a><h3 class="summary">Constants</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code><b><a  href="CastleSphericalHarmonics.html#MaxSHBasis">MaxSHBasis</a></b> = 25;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code><b><a  href="CastleSphericalHarmonics.html#SHBasis0">SHBasis0</a></b> = 1 / (2 * Sqrt(Pi));</code></td>
</tr>
</table>
<a name="PasDoc-Variables"></a><h3 class="summary">Variables</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code><b><a  href="CastleSphericalHarmonics.html#SHBasisMap">SHBasisMap</a></b>: array [0..<a  href="CastleSphericalHarmonics.html#MaxSHBasis">MaxSHBasis</a> - 1] of <a  href="CastleCubeMaps.html#TCubeMapFloat">TCubeMapFloat</a>;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Functions and Procedures</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="SHBasis"></a><code>function <b>SHBasis</b>(const LM: Cardinal; const PhiTheta: <a  href="CastleVectors.html#TVector2Single">TVector2Single</a>): <a  href="CastleUtils.html#Float">Float</a>;</code></td>
</tr>
<tr><td colspan="1">
<p>
Calculate spherical harmonic basis function for given arguments.

<p>LM indicates (L, M) that specify which SH basis to use. LM determines a pair (L, M) in the natural order: for each L, take for each M from -L to L. That is, LM = (0, 1, 2, 3, ...) indicate </p>

<pre class="preformatted">
    (L, M) =
  ( (0, 0),
    (1, -1), (1, 0), (1, 1),
    (2, -2), (2, -1), (2, 0), (2, 1), (2, 2),
    ... )
</pre>

<p> )</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="LMDecode"></a><code>procedure <b>LMDecode</b>(const LM: Cardinal; out L: Cardinal; out M: Integer);</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="InitializeSHBasisMap"></a><code>procedure <b>InitializeSHBasisMap</b>;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="SHVectorFromCubeMap"></a><code>procedure <b>SHVectorFromCubeMap</b>(var SHVector: array of Single; const Map: <a  href="CastleCubeMaps.html#TCubeMapByte">TCubeMapByte</a>);</code></td>
</tr>
<tr><td colspan="1">
<p>
Calculate SH basis coefficients that approximate function in Map. This uses <a class="normal" href="CastleSphericalHarmonics.html#SHBasisMap">SHBasisMap</a>, so be sure to initialize it first.</p>
</td></tr>
</table>
<h3 class="detail">Types</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TSHVectorSingle"></a><code><b>TSHVectorSingle</b> = array [0..<a  href="CastleSphericalHarmonics.html#MaxSHBasis">MaxSHBasis</a> - 1] of Single;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="PSHVectorSingle"></a><code><b>PSHVectorSingle</b> = &circ;<a  href="CastleSphericalHarmonics.html#TSHVectorSingle">TSHVectorSingle</a>;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<h3 class="detail">Constants</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="MaxSHBasis"></a><code><b>MaxSHBasis</b> = 25;</code></td>
</tr>
<tr><td colspan="1">
<p>
How many basis can <a class="normal" href="CastleSphericalHarmonics.html#SHBasis">SHBasis</a> calculate. LM for <a class="normal" href="CastleSphericalHarmonics.html#SHBasis">SHBasis</a> must be within 0 .. SHBasesCount - 1.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="SHBasis0"></a><code><b>SHBasis0</b> = 1 / (2 * Sqrt(Pi));</code></td>
</tr>
<tr><td colspan="1">
<p>
The first SH basis function is actually constant. This is sometimes useful.</p>
</td></tr>
</table>
<h3 class="detail">Variables</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="SHBasisMap"></a><code><b>SHBasisMap</b>: array [0..<a  href="CastleSphericalHarmonics.html#MaxSHBasis">MaxSHBasis</a> - 1] of <a  href="CastleCubeMaps.html#TCubeMapFloat">TCubeMapFloat</a>;</code></td>
</tr>
<tr><td colspan="1">
<p>
For each <a class="normal" href="CastleSphericalHarmonics.html#SHBasis">SHBasis</a> function (first index of the array is LM of this function), a precalculated results of basic spherical harmonic functions. Multiplied by solid angle of this cube map pixel, since this is what you usually need.

<p>For each side of the cube, and for each pixel on this side (pixels are arranged same as in <a class="normal" href="CastleImages.TGrayscaleImage.html">TGrayscaleImage</a>, that is row-by-row from lower to higher, from left to right) this gives the result of <a class="normal" href="CastleSphericalHarmonics.html#SHBasis">SHBasis</a> for this direction. Multiplied by solid angle.

<p>You have to initialize this (once, like at the beginning of your program) by <a class="normal" href="CastleSphericalHarmonics.html#InitializeSHBasisMap">InitializeSHBasisMap</a>.

<p>This is useful for calculating sh basis vector from given cube map: since you can just project any function on any basis, so if you have a particular cube map you can project it on each SH basis function. See <a class="normal" href="CastleSphericalHarmonics.html#SHVectorFromCubeMap">SHVectorFromCubeMap</a> implementation for code how to use <code>SHBasisMap</code> for this, and in simple cases you can just call <a class="normal" href="CastleSphericalHarmonics.html#SHVectorFromCubeMap">SHVectorFromCubeMap</a>.</p>
</td></tr>
</table>
<!-- Piwik -->
<script type="text/javascript">
  var _paq = _paq || [];
  _paq.push(["trackPageView"]);
  _paq.push(["enableLinkTracking"]);

  (function() {
    var u=(("https:" == document.location.protocol) ? "https" : "http") + "://michalis.ii.uni.wroc.pl/piwik-castle-engine/";
    _paq.push(["setTrackerUrl", u+"piwik.php"]);
    _paq.push(["setSiteId", "1"]);
    var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0]; g.type="text/javascript";
    g.defer=true; g.async=true; g.src=u+"piwik.js"; s.parentNode.insertBefore(g,s);
  })();
</script>
<!-- End Piwik Code -->

<noscript>
<!-- Piwik Image Tracker -->
<img src="http://michalis.ii.uni.wroc.pl/piwik-castle-engine/piwik.php?idsite=1&amp;rec=1" style="border:0" alt="" />
<!-- End Piwik -->
</noscript>
<hr noshade size="1"><span class="appinfo"><em>Generated by <a  href="http://pasdoc.sourceforge.net/">PasDoc 0.13.0</a> on 2015-06-15 04:43:12</em>
</span>
</td></tr></table></body></html>