scenejs_on_rails 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -5
  3. data/app/controllers/scenejs_controller.rb +53 -0
  4. data/app/views/scenejs/get_scenejs_data.html.erb +3 -0
  5. data/lib/scenejs_on_rails.rb +1 -1
  6. data/lib/scenejs_on_rails/rails.rb +5 -0
  7. data/lib/scenejs_on_rails/version.rb +1 -1
  8. data/vendor/assets/javascripts/scenejs.js +17307 -0
  9. data/vendor/assets/javascripts/scenejs_extras/gui.js +478 -0
  10. data/vendor/assets/javascripts/scenejs_extras/gui/README.md +4 -0
  11. data/vendor/assets/javascripts/scenejs_extras/gui/dat.gui.min.js +94 -0
  12. data/vendor/assets/javascripts/scenejs_extras/gui/gui.js +385 -0
  13. data/vendor/assets/javascripts/scenejs_lib/cityBuilder.js +457 -0
  14. data/vendor/assets/javascripts/scenejs_lib/dat.gui.min.js +94 -0
  15. data/vendor/assets/javascripts/scenejs_lib/gl-matrix-min.js +28 -0
  16. data/vendor/assets/javascripts/scenejs_lib/gl-matrix.js +4078 -0
  17. data/vendor/assets/javascripts/scenejs_lib/require.js +36 -0
  18. data/vendor/assets/javascripts/scenejs_lib/requireConfig.js +18 -0
  19. data/vendor/assets/javascripts/scenejs_lib/requireWrapperEnd.js +1 -0
  20. data/vendor/assets/javascripts/scenejs_lib/requireWrapperStart.js +2 -0
  21. data/vendor/assets/javascripts/scenejs_lib/stats.min.js +6 -0
  22. data/vendor/assets/javascripts/scenejs_lib/sylvester.js +1 -0
  23. data/vendor/assets/javascripts/scenejs_lib/webgl-debug-utils.js +839 -0
  24. data/vendor/assets/javascripts/scenejs_plugins/geometry/boundary.js +59 -0
  25. data/vendor/assets/javascripts/scenejs_plugins/geometry/box.js +72 -0
  26. data/vendor/assets/javascripts/scenejs_plugins/geometry/plane.js +126 -0
  27. data/vendor/assets/javascripts/scenejs_plugins/geometry/quad.js +37 -0
  28. data/vendor/assets/javascripts/scenejs_plugins/geometry/skybox.js +86 -0
  29. data/vendor/assets/javascripts/scenejs_plugins/geometry/sphere.js +82 -0
  30. data/vendor/assets/javascripts/scenejs_plugins/geometry/teapot.js +5853 -0
  31. data/vendor/assets/javascripts/scenejs_plugins/geometry/torus.js +139 -0
  32. data/vendor/assets/javascripts/scenejs_plugins/geometry/vectorText.js +1499 -0
  33. data/vendor/assets/javascripts/scenejs_plugins/geometry/wobblyBox.js +44 -0
  34. data/vendor/assets/javascripts/scenejs_plugins/lib/canvas2image.js +198 -0
  35. data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullEngine.js +810 -0
  36. data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullSystem.js +185 -0
  37. data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullSystemPool.js +174 -0
  38. data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullWorker.js +142 -0
  39. data/vendor/assets/javascripts/scenejs_plugins/lib/gl-matrix-min.js +28 -0
  40. data/vendor/assets/javascripts/scenejs_plugins/lib/jquery-1.8.3.min.js +2 -0
  41. data/vendor/assets/javascripts/scenejs_plugins/lib/k3d.js +1029 -0
  42. data/vendor/assets/javascripts/scenejs_plugins/lib/physics/jiglib.all.min.js +3 -0
  43. data/vendor/assets/javascripts/scenejs_plugins/lib/physics/physics.js +223 -0
  44. data/vendor/assets/javascripts/scenejs_plugins/lib/physics/worker.js +330 -0
  45. data/vendor/assets/javascripts/scenejs_plugins/node/alpha/orbitTracking.js +295 -0
  46. data/vendor/assets/javascripts/scenejs_plugins/node/alpha/orbitTrackingTarget.js +43 -0
  47. data/vendor/assets/javascripts/scenejs_plugins/node/backgrounds/gradient.js +148 -0
  48. data/vendor/assets/javascripts/scenejs_plugins/node/cameras/orbit.js +172 -0
  49. data/vendor/assets/javascripts/scenejs_plugins/node/cameras/pickFlyOrbit.js +409 -0
  50. data/vendor/assets/javascripts/scenejs_plugins/node/canvas/capture.js +107 -0
  51. data/vendor/assets/javascripts/scenejs_plugins/node/demos/color.js +30 -0
  52. data/vendor/assets/javascripts/scenejs_plugins/node/demos/redTeapot.js +52 -0
  53. data/vendor/assets/javascripts/scenejs_plugins/node/demos/spinningTeapot.js +43 -0
  54. data/vendor/assets/javascripts/scenejs_plugins/node/effects/crt.js +36 -0
  55. data/vendor/assets/javascripts/scenejs_plugins/node/effects/fog.js +159 -0
  56. data/vendor/assets/javascripts/scenejs_plugins/node/effects/snowyPeaks.js +50 -0
  57. data/vendor/assets/javascripts/scenejs_plugins/node/effects/wobble.js +42 -0
  58. data/vendor/assets/javascripts/scenejs_plugins/node/effects/xray.js +126 -0
  59. data/vendor/assets/javascripts/scenejs_plugins/node/frustum/body.js +112 -0
  60. data/vendor/assets/javascripts/scenejs_plugins/node/frustum/cull.js +42 -0
  61. data/vendor/assets/javascripts/scenejs_plugins/node/frustum/lod.js +125 -0
  62. data/vendor/assets/javascripts/scenejs_plugins/node/heightmaps/custom.js +185 -0
  63. data/vendor/assets/javascripts/scenejs_plugins/node/import/3ds.js +91 -0
  64. data/vendor/assets/javascripts/scenejs_plugins/node/import/md2.js +139 -0
  65. data/vendor/assets/javascripts/scenejs_plugins/node/import/obj.js +100 -0
  66. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building.js +352 -0
  67. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/HighRiseGlass.jpg +0 -0
  68. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/HighRiseGlassSpecular.jpg +0 -0
  69. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/highrise-windows.jpg +0 -0
  70. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/pixelcity_windows7.jpg +0 -0
  71. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/city.js +26 -0
  72. data/vendor/assets/javascripts/scenejs_plugins/node/objects/plants/ghostTree.js +387 -0
  73. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth.js +168 -0
  74. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth-lights.gif +0 -0
  75. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth-specular.gif +0 -0
  76. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth-specular.jpg +0 -0
  77. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth.jpg +0 -0
  78. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earthbump.jpg +0 -0
  79. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earthclouds.jpg +0 -0
  80. data/vendor/assets/javascripts/scenejs_plugins/node/objects/toys/drinkingBird.js +632 -0
  81. data/vendor/assets/javascripts/scenejs_plugins/node/objects/vehicles/tank.js +77670 -0
  82. data/vendor/assets/javascripts/scenejs_plugins/node/objects/vehicles/tank.js~ +77636 -0
  83. data/vendor/assets/javascripts/scenejs_plugins/node/physics/body.js +85 -0
  84. data/vendor/assets/javascripts/scenejs_plugins/node/physics/box.js +30 -0
  85. data/vendor/assets/javascripts/scenejs_plugins/node/physics/material.js +35 -0
  86. data/vendor/assets/javascripts/scenejs_plugins/node/physics/plane.js +47 -0
  87. data/vendor/assets/javascripts/scenejs_plugins/node/physics/sphere.js +32 -0
  88. data/vendor/assets/javascripts/scenejs_plugins/node/physics/system.js +44 -0
  89. data/vendor/assets/javascripts/scenejs_plugins/node/physics/teapot.js +29 -0
  90. data/vendor/assets/javascripts/scenejs_plugins/node/prims/boundary.js +73 -0
  91. data/vendor/assets/javascripts/scenejs_plugins/node/prims/box.js +87 -0
  92. data/vendor/assets/javascripts/scenejs_plugins/node/prims/cylinder.js +186 -0
  93. data/vendor/assets/javascripts/scenejs_plugins/node/prims/grid.js +47 -0
  94. data/vendor/assets/javascripts/scenejs_plugins/node/prims/plane.js +137 -0
  95. data/vendor/assets/javascripts/scenejs_plugins/node/prims/quad.js +43 -0
  96. data/vendor/assets/javascripts/scenejs_plugins/node/prims/sphere.js +107 -0
  97. data/vendor/assets/javascripts/scenejs_plugins/node/prims/teapot.js +5846 -0
  98. data/vendor/assets/javascripts/scenejs_plugins/node/prims/torus.js +149 -0
  99. data/vendor/assets/javascripts/scenejs_plugins/node/prims/vectorText.js +1508 -0
  100. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/clouds.js +19 -0
  101. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/cloudySea.js +19 -0
  102. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/custom.js +150 -0
  103. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/grimmNight.js +19 -0
  104. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/interstellarClouds.js +19 -0
  105. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/miramarClouds.js +19 -0
  106. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/stormyDays.js +19 -0
  107. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/clouds.jpg +0 -0
  108. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/cloudySea.jpg +0 -0
  109. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/grimmNight.jpg +0 -0
  110. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/interstellarClouds.jpg +0 -0
  111. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/miramarClouds.jpg +0 -0
  112. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/stormyDays.jpg +0 -0
  113. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/violentDays.jpg +0 -0
  114. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/violentDays.js +19 -0
  115. data/vendor/assets/javascripts/scenejs_plugins/texture/image.js +67 -0
  116. data/vendor/assets/javascripts/scenejs_plugins/texture/video.js +105 -0
  117. metadata +113 -1
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Cloudy skybox node type, with fine clouds
3
+ *
4
+ * Usage example:
5
+ *
6
+ * someNode.addNode({
7
+ * type: "skyboxes/clouds"
8
+ * });
9
+ */
10
+ SceneJS.Types.addType("skyboxes/clouds", {
11
+ construct:function (params) {
12
+
13
+ // Wraps a 'custom' skybox node type, passing in a clouds texture
14
+ this.addNode({
15
+ type:"skyboxes/custom",
16
+ src:SceneJS.getConfigs("pluginPath") + "/node/skyboxes/textures/clouds.jpg"
17
+ })
18
+ }
19
+ });
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Cloudy skybox node type, with clouds reflected in a calm sea
3
+ *
4
+ * Usage example:
5
+ *
6
+ * someNode.addNode({
7
+ * type: "skyboxes/cloudySea"
8
+ * });
9
+ */
10
+ SceneJS.Types.addType("skyboxes/cloudySea", {
11
+ construct:function (params) {
12
+
13
+ // Wraps a 'custom' skybox node type, passing in a cloudySea texture
14
+ this.addNode({
15
+ type:"skyboxes/custom",
16
+ src:SceneJS.getConfigs("pluginPath") + "/node/skyboxes/textures/cloudySea.jpg"
17
+ })
18
+ }
19
+ });
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Customizable skybox node type, which allows you to customize its texture
3
+ *
4
+ * Usage example:
5
+ *
6
+ * someNode.addNode({
7
+ * type: "skyboxes/custom",
8
+ * texture: "foo/bar/mySkyboxTexture.jpg",
9
+ * size: 5000 // Box half-size on each axis - default is 5000
10
+ * });
11
+ */
12
+ SceneJS.Types.addType("skyboxes/custom", {
13
+
14
+ // TODO: expose node props to tweak the geometry coords to map to variations in texture UV mappings?
15
+
16
+ construct:function (params) {
17
+
18
+ // Fall back on clouds texture by default
19
+ var src = params.src || SceneJS.getConfigs("pluginPath") + "/node/skyboxes/textures/clouds.jpg";
20
+
21
+ // Sky box dimensions on each axis
22
+ var size = params.size || 5000.0;
23
+
24
+ // Vertex shader which anchors the skybox translation
25
+ this.addNode({
26
+
27
+ // Special pick name so that we can ignore picks on sky boxes
28
+ type:"name",
29
+ name:"__SceneJS_dontPickMe",
30
+
31
+ nodes:[
32
+ {
33
+ type:"shader",
34
+ shaders:[
35
+ {
36
+ stage:"vertex",
37
+ code:[
38
+ "mat4 myViewMatrix(mat4 m) {",
39
+ " m[3][0] =m[3][1] = m[3][2] = 0.0;",
40
+ "return m;",
41
+ "}"
42
+ ],
43
+ // Bind our injected functions to SceneJS hook points
44
+ hooks:{
45
+ viewMatrix:"myViewMatrix"
46
+ }
47
+ }
48
+ ],
49
+ nodes:[
50
+ // Disable lighting for the sky box
51
+ {
52
+ type:"flags",
53
+ flags:{
54
+ specular:false,
55
+ diffuse:false,
56
+ ambient:false
57
+ },
58
+ nodes:[
59
+ {
60
+ type:"material",
61
+ color:{ r:0, g:0, b:0 },
62
+ emit:0.0,
63
+ nodes:[
64
+ // Clouds texture
65
+ {
66
+ type:"texture",
67
+ layers:[
68
+ {
69
+ src:src,
70
+ blendMode:"add"
71
+ }
72
+ ],
73
+ nodes:[
74
+ {
75
+ type:"scale",
76
+ x:size, y:size, z:size,
77
+ nodes:[
78
+ // Sky box geometry
79
+ {
80
+ type:"geometry",
81
+ positions:[
82
+ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, // v0-v1-v2-v3 front
83
+ 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, // v0-v3-v4-v5 right
84
+ 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, // v0-v5-v6-v1 top
85
+ -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, // v1-v6-v7-v2 left
86
+ -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, // v7-v4-v3-v2 bottom
87
+ 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, -1 // v4-v7-v6-v5 back
88
+ ],
89
+ uv:[
90
+ 0.5, 0.6666,
91
+ 0.25, 0.6666,
92
+ 0.25, 0.3333,
93
+ 0.5, 0.3333,
94
+
95
+ 0.5, 0.6666,
96
+ 0.5, 0.3333,
97
+ 0.75, 0.3333,
98
+ 0.75, 0.6666,
99
+
100
+ 0.5, 0.6666,
101
+ 0.5, 1,
102
+ 0.25, 1,
103
+ 0.25, 0.6666,
104
+
105
+ 0.25, 0.6666,
106
+ 0.0, 0.6666,
107
+ 0.0, 0.3333,
108
+ 0.25, 0.3333,
109
+
110
+ 0.25, 0,
111
+ 0.50, 0,
112
+ 0.50, 0.3333,
113
+ 0.25, 0.3333,
114
+
115
+ 0.75, 0.3333,
116
+ 1.0, 0.3333,
117
+ 1.0, 0.6666,
118
+ 0.75, 0.6666
119
+ ],
120
+ indices:[
121
+ 0, 1, 2,
122
+ 0, 2, 3,
123
+ 4, 5, 6,
124
+ 4, 6, 7,
125
+ 8, 9, 10,
126
+ 8, 10, 11,
127
+ 12, 13, 14,
128
+ 12, 14, 15,
129
+
130
+ 16, 17, 18,
131
+ 16, 18, 19,
132
+
133
+ 20, 21, 22,
134
+ 20, 22, 23
135
+ ]
136
+ }
137
+ ]
138
+ }
139
+ ]
140
+ }
141
+ ]
142
+ }
143
+ ]
144
+ }
145
+ ]
146
+ }
147
+ ]
148
+ })
149
+ }
150
+ });
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Skybox node type, with gloomy night clouds
3
+ *
4
+ * Usage example:
5
+ *
6
+ * someNode.addNode({
7
+ * type: "skyboxes/grimmNight"
8
+ * });
9
+ */
10
+ SceneJS.Types.addType("skyboxes/grimmNight", {
11
+ construct:function (params) {
12
+
13
+ // Wraps a 'custom' skybox node type, passing in a the grimmNight texture
14
+ this.addNode({
15
+ type:"skyboxes/custom",
16
+ src:SceneJS.getConfigs("pluginPath") + "/node/skyboxes/textures/grimmNight.jpg"
17
+ })
18
+ }
19
+ });
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Skybox node type, with an interstellar cloudy background
3
+ *
4
+ * Usage example:
5
+ *
6
+ * someNode.addNode({
7
+ * type: "skyboxes/interstellarClouds"
8
+ * });
9
+ */
10
+ SceneJS.Types.addType("skyboxes/interstellarClouds", {
11
+ construct:function (params) {
12
+
13
+ // Wraps a 'custom' skybox node type, passing in the interstellarClouds texture
14
+ this.addNode({
15
+ type:"skyboxes/custom",
16
+ src:SceneJS.getConfigs("pluginPath") + "/node/skyboxes/textures/interstellarClouds.jpg"
17
+ })
18
+ }
19
+ });
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Skybox node type, with a cloudy Miramar beachscape background
3
+ *
4
+ * Usage example:
5
+ *
6
+ * someNode.addNode({
7
+ * type: "skyboxes/miramarClouds"
8
+ * });
9
+ */
10
+ SceneJS.Types.addType("skyboxes/miramarClouds", {
11
+ construct:function (params) {
12
+
13
+ // Wraps a 'custom' skybox node type, passing in the miramarClouds texture
14
+ this.addNode({
15
+ type:"skyboxes/custom",
16
+ src:SceneJS.getConfigs("pluginPath") + "/node/skyboxes/textures/miramarClouds.jpg"
17
+ })
18
+ }
19
+ });
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Skybox node type, with stormy clouds
3
+ *
4
+ * Usage example:
5
+ *
6
+ * someNode.addNode({
7
+ * type: "skyboxes/stormyDays"
8
+ * });
9
+ */
10
+ SceneJS.Types.addType("skyboxes/stormyDays", {
11
+ construct:function (params) {
12
+
13
+ // Wraps a 'custom' skybox node type, passing in the stormyDays texture
14
+ this.addNode({
15
+ type:"skyboxes/custom",
16
+ src:SceneJS.getConfigs("pluginPath") + "/node/skyboxes/textures/stormyDays.jpg"
17
+ })
18
+ }
19
+ });
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Skybox node type, with firey apocalyptic clouds
3
+ *
4
+ * Usage example:
5
+ *
6
+ * someNode.addNode({
7
+ * type: "skyboxes/violentDays"
8
+ * });
9
+ */
10
+ SceneJS.Types.addType("skyboxes/violentDays", {
11
+ construct:function (params) {
12
+
13
+ // Wraps a 'custom' skybox node type, passing in the violentDays texture
14
+ this.addNode({
15
+ type:"skyboxes/custom",
16
+ src:SceneJS.getConfigs("pluginPath") + "/node/skyboxes/textures/violentDays.jpg"
17
+ })
18
+ }
19
+ });
@@ -0,0 +1,67 @@
1
+ SceneJS.Plugins.addPlugin(
2
+
3
+ "texture",
4
+ "image",
5
+
6
+ new (function () {
7
+
8
+ this.getSource = function (params) {
9
+
10
+ var gl = params.gl;
11
+ var texture = gl.createTexture();
12
+ var publish;
13
+
14
+ return {
15
+ subscribe:function (fn) {
16
+ publish = fn;
17
+ },
18
+ configure:function (cfg) {
19
+ if (!cfg.src) {
20
+ throw "Parameter expected: 'src'";
21
+ }
22
+ var image = new Image();
23
+ image.crossOrigin = "anonymous";
24
+ image.onload = function () {
25
+ gl.bindTexture(gl.TEXTURE_2D, texture);
26
+ var potImage = ensureImageSizePowerOfTwo(image); // WebGL hates NPOT images
27
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, potImage);
28
+ if (publish) {
29
+ publish(texture);
30
+ }
31
+ };
32
+ image.src = cfg.src;
33
+ },
34
+
35
+ destroy:function () { // TODO
36
+ }
37
+ };
38
+ };
39
+
40
+ function ensureImageSizePowerOfTwo(image) {
41
+ if (!isPowerOfTwo(image.width) || !isPowerOfTwo(image.height)) {
42
+ var canvas = document.createElement("canvas");
43
+ canvas.width = nextHighestPowerOfTwo(image.width);
44
+ canvas.height = nextHighestPowerOfTwo(image.height);
45
+ var ctx = canvas.getContext("2d");
46
+ ctx.drawImage(image,
47
+ 0, 0, image.width, image.height,
48
+ 0, 0, canvas.width, canvas.height);
49
+ image = canvas;
50
+ }
51
+ return image;
52
+ }
53
+
54
+ function isPowerOfTwo(x) {
55
+ return (x & (x - 1)) == 0;
56
+ }
57
+
58
+ function nextHighestPowerOfTwo(x) {
59
+ --x;
60
+ for (var i = 1; i < 32; i <<= 1) {
61
+ x = x | x >> i;
62
+ }
63
+ return x + 1;
64
+ }
65
+
66
+ })());
67
+
@@ -0,0 +1,105 @@
1
+ SceneJS.Plugins.addPlugin(
2
+
3
+ "texture",
4
+ "video",
5
+
6
+ new (function () {
7
+
8
+ this.getSource = function (params) {
9
+
10
+ var gl = params.gl;
11
+ var publish;
12
+ var video;
13
+ var texture = gl.createTexture();
14
+
15
+ return {
16
+
17
+ subscribe:function (fn) {
18
+ publish = fn;
19
+ },
20
+
21
+ configure:function (cfg) {
22
+
23
+ if (cfg.src) {
24
+
25
+ var canvas = document.createElement("canvas");
26
+ document.getElementsByTagName("body")[0].appendChild(canvas);
27
+ var ctx = canvas.getContext("2d");
28
+
29
+ /* Create hidden video canvas
30
+ */
31
+ video = document.createElement("video");
32
+ video.style.display = "none";
33
+ video.setAttribute("loop", "loop");
34
+ video.autoplay = true;
35
+ video.addEventListener("ended", // looping broken in FF
36
+ function () {
37
+ this.play();
38
+ },
39
+ true);
40
+
41
+ document.getElementsByTagName("body")[0].appendChild(video);
42
+
43
+ //video.crossOrigin = "anonymous";
44
+ video.src = cfg.src;
45
+
46
+ var updateTexture = function () {
47
+
48
+ if (video.readyState > 0) {
49
+
50
+ if (video.height <= 0) {
51
+ video.style.display = "";
52
+ video.height = video.offsetHeight;
53
+ video.width = video.offsetWidth;
54
+ video.style.display = "none";
55
+ }
56
+
57
+ // canvas.height = video.height;
58
+ // canvas.width = video.width;
59
+ //
60
+ // ctx.drawImage(video, 0, 0);
61
+ //
62
+ // gl.bindTexture(gl.TEXTURE_2D, texture);
63
+ // //
64
+ // try {
65
+ // gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);
66
+ //
67
+ // } catch(e) {
68
+ //
69
+ // gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas, null);
70
+ // }
71
+ //
72
+ // gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
73
+ // gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
74
+ //
75
+ // gl.generateMipmap(gl.TEXTURE_2D);
76
+ //
77
+
78
+ try {
79
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video);
80
+ }
81
+ catch (e) {
82
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video, null);
83
+ }
84
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
85
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
86
+ gl.generateMipmap(gl.TEXTURE_2D);
87
+ if (publish) {
88
+ publish(texture);
89
+ }
90
+ }
91
+ window.requestAnimationFrame(updateTexture);
92
+ };
93
+
94
+ window.requestAnimationFrame(updateTexture);// TODO: synch with render loop
95
+ }
96
+ },
97
+
98
+ destroy:function () {
99
+ // TODO: destroy any existing video
100
+ }
101
+ };
102
+ };
103
+
104
+ })());
105
+