Skip to content

Commit 0013db3

Browse files
committed
Created new Mesh Pipeline
1 parent 74f35ac commit 0013db3

4 files changed

Lines changed: 206 additions & 3 deletions

File tree

src/renderer/webgl/PipelineManager.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var CONST = require('./pipelines/const');
1111
// Default Phaser 3 Pipelines
1212
var BitmapMaskPipeline = require('./pipelines/BitmapMaskPipeline');
1313
var LightPipeline = require('./pipelines/LightPipeline');
14+
var MeshPipeline = require('./pipelines/MeshPipeline');
1415
var MultiPipeline = require('./pipelines/MultiPipeline');
1516
var RopePipeline = require('./pipelines/RopePipeline');
1617
var SinglePipeline = require('./pipelines/SinglePipeline');
@@ -131,6 +132,7 @@ var PipelineManager = new Class({
131132
this.add(CONST.SINGLE_PIPELINE, new SinglePipeline({ game: game }));
132133
this.add(CONST.ROPE_PIPELINE, new RopePipeline({ game: game }));
133134
this.add(CONST.LIGHT_PIPELINE, new LightPipeline({ game: game }));
135+
this.add(CONST.MESH_PIPELINE, new MeshPipeline({ game: game }));
134136

135137
this.set(this.MULTI_PIPELINE);
136138
},
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
/**
2+
* @author Richard Davey <rich@photonstorm.com>
3+
* @copyright 2020 Photon Storm Ltd.
4+
* @license {@link https://opensource.org/licenses/MIT|MIT License}
5+
*/
6+
7+
var Class = require('../../../utils/Class');
8+
var GetFastValue = require('../../../utils/object/GetFastValue');
9+
var ShaderSourceFS = require('../shaders/Mesh-frag.js');
10+
var ShaderSourceVS = require('../shaders/Mesh-vert.js');
11+
var WebGLPipeline = require('../WebGLPipeline');
12+
13+
/**
14+
* @classdesc
15+
* TODO
16+
*
17+
* @class MeshPipeline
18+
* @extends Phaser.Renderer.WebGL.WebGLPipeline
19+
* @memberof Phaser.Renderer.WebGL.Pipelines
20+
* @constructor
21+
* @since 3.50.0
22+
*
23+
* @param {Phaser.Types.Renderer.WebGL.WebGLPipelineConfig} config - The configuration options for this pipeline.
24+
*/
25+
var MeshPipeline = new Class({
26+
27+
Extends: WebGLPipeline,
28+
29+
initialize:
30+
31+
function MeshPipeline (config)
32+
{
33+
var gl = config.game.renderer.gl;
34+
35+
config.fragShader = GetFastValue(config, 'fragShader', ShaderSourceFS),
36+
config.vertShader = GetFastValue(config, 'vertShader', ShaderSourceVS),
37+
config.vertexCapacity = GetFastValue(config, 'vertexCapacity', 2048 * 8),
38+
config.vertexSize = GetFastValue(config, 'vertexSize', 32),
39+
config.attributes = GetFastValue(config, 'attributes', [
40+
{
41+
name: 'aVertexPosition',
42+
size: 3,
43+
type: gl.FLOAT,
44+
normalized: false,
45+
offset: 0,
46+
enabled: false,
47+
location: -1
48+
},
49+
{
50+
name: 'aVertexNormal',
51+
size: 3,
52+
type: gl.FLOAT,
53+
normalized: false,
54+
offset: 12,
55+
enabled: false,
56+
location: -1
57+
},
58+
{
59+
name: 'aTextureCoord',
60+
size: 2,
61+
type: gl.FLOAT,
62+
normalized: false,
63+
offset: 24,
64+
enabled: false,
65+
location: -1
66+
}
67+
]);
68+
69+
WebGLPipeline.call(this, config);
70+
71+
/**
72+
* Float32 view of the array buffer containing the pipeline's vertices.
73+
*
74+
* @name Phaser.Renderer.WebGL.Pipelines.MeshPipeline#vertexViewF32
75+
* @type {Float32Array}
76+
* @since 3.0.0
77+
*/
78+
this.vertexViewF32 = new Float32Array(this.vertexData);
79+
80+
this.forceZero = true;
81+
},
82+
83+
/**
84+
* Called every time the pipeline is bound by the renderer.
85+
* Sets the shader program, vertex buffer and other resources.
86+
* Should only be called when changing pipeline.
87+
*
88+
* @method Phaser.Renderer.WebGL.Pipelines.MeshPipeline#bind
89+
* @since 3.50.0
90+
*
91+
* @param {boolean} [reset=false] - Should the pipeline be fully re-bound after a renderer pipeline clear?
92+
*
93+
* @return {this} This WebGLPipeline instance.
94+
*/
95+
bind: function (reset)
96+
{
97+
if (reset === undefined) { reset = false; }
98+
99+
WebGLPipeline.prototype.bind.call(this, reset);
100+
101+
var gl = this.gl;
102+
103+
gl.enable(gl.DEPTH_TEST);
104+
gl.enable(gl.CULL_FACE);
105+
gl.cullFace(gl.BACK);
106+
107+
return this;
108+
},
109+
110+
/**
111+
* This method is called every time a Game Object asks the Pipeline Manager to use this pipeline.
112+
*
113+
* Unlike the `bind` method, which is only called once per frame, this is called for every object
114+
* that requests it, allowing you to perform per-object GL set-up.
115+
*
116+
* @method Phaser.Renderer.WebGL.Pipelines.MeshPipeline#onBind
117+
* @since 3.50.0
118+
*
119+
* @param {Phaser.GameObjects.Mesh} mesh - The Mesh that requested this pipeline.
120+
*
121+
* @return {this} This WebGLPipeline instance.
122+
*/
123+
onBind: function (mesh)
124+
{
125+
var program = this.program;
126+
var renderer = this.renderer;
127+
128+
var camera = mesh.camera;
129+
var light = mesh.light;
130+
131+
renderer.setMatrix4(program, 'uViewProjectionMatrix', false, camera.viewProjectionMatrix.val);
132+
133+
renderer.setFloat3(program, 'uLightPosition', light.x, light.y, light.z);
134+
renderer.setFloat3(program, 'uLightAmbient', light.ambient.x, light.ambient.y, light.ambient.z);
135+
renderer.setFloat3(program, 'uLightDiffuse', light.diffuse.x, light.diffuse.y, light.diffuse.z);
136+
renderer.setFloat3(program, 'uLightSpecular', light.specular.x, light.specular.y, light.specular.z);
137+
renderer.setFloat3(program, 'uCameraPosition', camera.x, camera.y, camera.z);
138+
},
139+
140+
drawModel: function (mesh, model)
141+
{
142+
var program = this.program;
143+
var renderer = this.renderer;
144+
145+
renderer.setMatrix4(program, 'uModelMatrix', false, model.transformMatrix.val);
146+
renderer.setMatrix4(program, 'uNormalMatrix', false, model.normalMatrix.val);
147+
148+
renderer.setFloat3(program, 'uMaterialAmbient', model.ambient.x, model.ambient.y, model.ambient.z);
149+
renderer.setFloat3(program, 'uMaterialDiffuse', model.diffuse.x, model.diffuse.y, model.diffuse.z);
150+
renderer.setFloat3(program, 'uMaterialSpecular', model.specular.x, model.specular.y, model.specular.z);
151+
renderer.setFloat1(program, 'uMaterialShine', model.shine);
152+
153+
renderer.setTextureZero(model.frame.glTexture);
154+
renderer.setInt1(program, 'uTexture', 0);
155+
156+
// All the uniforms are finally bound, so now lets draw our faces!
157+
158+
var vertexViewF32 = this.vertexViewF32;
159+
160+
var vertices = model.vertices;
161+
162+
for (var i = 0; i < vertices.length; i++)
163+
{
164+
if (this.shouldFlush(1))
165+
{
166+
this.flush();
167+
}
168+
169+
var vertexOffset = (this.vertexCount * this.vertexComponentCount) - 1;
170+
171+
var vert = vertices[i];
172+
173+
vertexViewF32[++vertexOffset] = vert.x;
174+
vertexViewF32[++vertexOffset] = vert.y;
175+
vertexViewF32[++vertexOffset] = vert.z;
176+
vertexViewF32[++vertexOffset] = vert.nx;
177+
vertexViewF32[++vertexOffset] = vert.ny;
178+
vertexViewF32[++vertexOffset] = vert.nz;
179+
vertexViewF32[++vertexOffset] = vert.u;
180+
vertexViewF32[++vertexOffset] = vert.v;
181+
182+
this.vertexCount++;
183+
}
184+
185+
this.flush();
186+
}
187+
188+
});
189+
190+
module.exports = MeshPipeline;

src/renderer/webgl/pipelines/const.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,17 @@ var PIPELINE_CONST = {
5454
* @const
5555
* @since 3.50.0
5656
*/
57-
ROPE_PIPELINE: 'RopePipeline'
57+
ROPE_PIPELINE: 'RopePipeline',
58+
59+
/**
60+
* The Mesh Pipeline.
61+
*
62+
* @name Phaser.Renderer.WebGL.Pipelines.MESH_PIPELINE
63+
* @type {string}
64+
* @const
65+
* @since 3.50.0
66+
*/
67+
MESH_PIPELINE: 'MeshPipeline'
5868

5969
};
6070

src/renderer/webgl/pipelines/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ var Pipelines = {
1515

1616
BitmapMaskPipeline: require('./BitmapMaskPipeline'),
1717
LightPipeline: require('./LightPipeline'),
18-
SinglePipeline: require('./SinglePipeline'),
18+
MeshPipeline: require('./MeshPipeline'),
19+
ModelViewProjection: require('./components/ModelViewProjection'),
1920
MultiPipeline: require('./MultiPipeline'),
2021
RopePipeline: require('./RopePipeline'),
21-
ModelViewProjection: require('./components/ModelViewProjection')
22+
SinglePipeline: require('./SinglePipeline')
2223

2324
};
2425

0 commit comments

Comments
 (0)