Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AroriaNetwork
GitHub Repository: AroriaNetwork/3kho-backup
Path: blob/main/projects/missiles/src/wall.js
1835 views
1
MG.tunnelWall = (function (rootNode) {
2
var DTHETA = 20;
3
var NUM_SEGMENTS = 5;
4
5
var NEAR_CLIPPING_PLANE = 25;
6
7
var GRADIENT_START = MG.LINE_OF_SIGHT;
8
var GRADIENT_STOP = GRADIENT_START - MG.BARRIER_SPACING;
9
10
11
var mTheta = 0;
12
13
var mSegments = [];
14
15
return {
16
init: function (rootNode) {
17
18
var gradient = document.createElementNS(NAMESPACE_SVG, 'linearGradient');
19
gradient.id = 'tunnel-wall-segment-fade-gradient';
20
gradient.setAttribute('gradientUnits', 'userSpaceOnUse');
21
rootNode.appendChild(gradient);
22
23
var gradientStart = document.createElementNS(NAMESPACE_SVG, 'stop');
24
gradientStart.setAttribute('offset', (5*NEAR_CLIPPING_PLANE / GRADIENT_START) + '');
25
gradientStart.setAttribute('stop-color', '#fff');
26
gradient.appendChild(gradientStart);
27
28
var gradientStop = document.createElementNS(NAMESPACE_SVG, 'stop');
29
gradientStop.setAttribute('offset', (5*NEAR_CLIPPING_PLANE / GRADIENT_STOP) + '');
30
gradientStop.setAttribute('stop-color', '#000');
31
gradient.appendChild(gradientStop);
32
33
for (var i=0; i < NUM_SEGMENTS; i++) {
34
35
mSegments[i] = document.createElementNS(NAMESPACE_SVG, 'path');
36
mSegments[i].setAttribute('class', 'wall-segment-dark');
37
mSegments[i].setAttribute('d', 'M 0,0 l 1000,50 l 0,-50 z');
38
39
mSegments[i].setAttribute('fill', 'url(#tunnel-wall-segment-fade-gradient)');
40
41
42
rootNode.appendChild(mSegments[i]) ;
43
}
44
45
this.updateDOM(0,0,0);
46
},
47
48
update: function (dt) {
49
mTheta = mTheta + dt * DTHETA;
50
mTheta %= 360;
51
},
52
53
updateDOM: function (x, y, offset) {
54
55
for (var i=0; i<NUM_SEGMENTS; i++) {
56
var segmentTheta = mTheta + 360*i/NUM_SEGMENTS;
57
58
var x_ = -x * Math.cos(segmentTheta*Math.PI/180) + -y * Math.sin(segmentTheta*Math.PI/180);
59
var y_ = -x * Math.sin(segmentTheta*Math.PI/180) + y * Math.cos(segmentTheta*Math.PI/180);
60
61
var scale_x_ = 0.1*MG.PROJECTION_PLANE_DISTANCE * (1 - x_/MG.TUNNEL_RADIUS)
62
/ (Math.tan(Math.PI * MG.FIELD_OF_VIEW/360.0)*NEAR_CLIPPING_PLANE);
63
var scale_y_ = 0.1*MG.PROJECTION_PLANE_DISTANCE
64
/ (Math.tan(Math.PI * MG.FIELD_OF_VIEW/360.0)*NEAR_CLIPPING_PLANE);
65
66
var skew = 180*Math.atan(y_/MG.TUNNEL_RADIUS)/Math.PI;
67
68
mSegments[i].setAttribute('transform', 'rotate(' + segmentTheta + ') '
69
+ 'scale(' + scale_x_ + ',' + scale_y_ + ') '
70
+ 'skewY(' + skew + ')' );
71
72
73
74
}
75
}
76
}
77
}());
78
79