-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCommonGeometry.js
More file actions
168 lines (137 loc) · 4.18 KB
/
CommonGeometry.js
File metadata and controls
168 lines (137 loc) · 4.18 KB
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
import {JoinTypedArrays} from './PopApi.js'
const Default = `Common geometry generating functions`;
export default Default;
export function CreateCubeGeometry(Min=-1,Max=1,MinY=undefined,MaxY=undefined)
{
let PositionData = [];
let UvData = [];
let NormalData = [];
if ( MinY === undefined )
MinY = Min;
if ( MaxY === undefined )
MaxY = Max;
let AddTriangle = function(a,b,c,Normal,Uvs)
{
let ReverseWinding = false;
if ( ReverseWinding )
{
PositionData.push( ...c.slice(0,3) );
PositionData.push( ...b.slice(0,3) );
PositionData.push( ...a.slice(0,3) );
}
else
{
PositionData.push( ...a.slice(0,3) );
PositionData.push( ...b.slice(0,3) );
PositionData.push( ...c.slice(0,3) );
}
UvData.push( ...Uvs[0] );
UvData.push( ...Uvs[1] );
UvData.push( ...Uvs[2] );
NormalData.push( ...Normal );
NormalData.push( ...Normal );
NormalData.push( ...Normal );
}
// top left near bottom right far
let tln = [Min,MinY,Min];
let trn = [Max,MinY,Min];
let brn = [Max,MaxY,Min];
let bln = [Min,MaxY,Min];
let tlf = [Min,MinY,Max];
let trf = [Max,MinY,Max];
let brf = [Max,MaxY,Max];
let blf = [Min,MaxY,Max];
const UvFirstTriangle = [ [0,0], [1,0], [1,1] ];
const UvSecondTriangle = [ [1,1], [0,1], [0,0] ];
// near
AddTriangle( brn, trn, tln, [0,0,-1], UvFirstTriangle );
AddTriangle( tln, bln, brn, [0,0,-1], UvSecondTriangle );
// far
AddTriangle( trf, tlf, blf, [0,0,1], UvFirstTriangle );
AddTriangle( blf, brf, trf, [0,0,1], UvSecondTriangle );
// top (or bottom depending on camera, it's +y)
AddTriangle( tln, tlf, trf, [0,-1,0], UvFirstTriangle );
AddTriangle( trf, trn, tln, [0,-1,0], UvSecondTriangle );
// bottom
AddTriangle( brf, blf, bln, [0,1,0], UvFirstTriangle );
AddTriangle( bln, brn, brf, [0,1,0], UvSecondTriangle );
// left
AddTriangle( tlf, tln, bln, [-1,0,0], UvFirstTriangle );
AddTriangle( bln, blf, tlf, [-1,0,0], UvSecondTriangle );
// right
AddTriangle( trn, trf, brf, [1,0,0], UvFirstTriangle );
AddTriangle( brf, brn, trn, [1,0,0], UvSecondTriangle );
const Attributes = {};
Attributes.LocalPosition = {};
Attributes.LocalPosition.Size = 3;
Attributes.LocalPosition.Data = new Float32Array(PositionData);
Attributes.LocalUv = {};
Attributes.LocalUv.Size = 2;
Attributes.LocalUv.Data = new Float32Array(UvData);
Attributes.LocalNormal = {};
Attributes.LocalNormal.Size = 3;
Attributes.LocalNormal.Data = new Float32Array(NormalData);
return Attributes;
}
export function CreateQuad3Geometry(Min=-1,Max=1)
{
let PositionData = [];
let UvData = [];
let AddTriangle = function(a,b,c)
{
PositionData.push( ...a.slice(0,3) );
PositionData.push( ...b.slice(0,3) );
PositionData.push( ...c.slice(0,3) );
UvData.push( ...a.slice(3,5) );
UvData.push( ...b.slice(3,5) );
UvData.push( ...c.slice(3,5) );
}
const y = 0;
// top left near bottom right far
let tln = [Min,y,Min, 0,0];
let trn = [Max,y,Min, 1,0];
let tlf = [Min,y,Max, 0,1];
let trf = [Max,y,Max, 1,1];
// top
AddTriangle( tln, tlf, trf );
AddTriangle( trf, trn, tln );
const Attributes = {};
Attributes.LocalPosition = {};
Attributes.LocalPosition.Size = 3;
Attributes.LocalPosition.Data = new Float32Array(PositionData);
Attributes.LocalUv = {};
Attributes.LocalUv.Size = 2;
Attributes.LocalUv.Data = new Float32Array(UvData);
return Attributes;
}
export function CreateBlitQuadGeometry(Rect=[0,0,1,1],Attrib='TexCoord')
{
let l = Rect[0];
let t = Rect[1];
let r = Rect[0]+Rect[2];
let b = Rect[1]+Rect[3];
const VertexData = [ l,t, r,t, r,b, r,b, l,b, l,t ];
const TexCoord = {};
TexCoord.Size = 2;
TexCoord.Data = VertexData;
const Geometry = {};
Geometry[Attrib] = TexCoord;
return Geometry;
}
export function MergeGeometry(Geometrys)
{
if ( Geometrys.length <= 1 )
return Geometrys[0];
// todo: need to verify matching attribs etc
const Attribs = Object.keys(Geometrys[0]);
const MergedGeometry = {};
for ( let Attrib of Attribs )
{
// todo: check .Size is same all
const AttribDatas = Geometrys.map( g => g[Attrib].Data );
MergedGeometry[Attrib] = {};
MergedGeometry[Attrib].Data = JoinTypedArrays(AttribDatas);
MergedGeometry[Attrib].Size = Geometrys[0][Attrib].Size;
}
return MergedGeometry;
}