Skip to content

Commit

Permalink
add shader settings
Browse files Browse the repository at this point in the history
  • Loading branch information
hikipuro committed Aug 28, 2018
1 parent cea6436 commit 0faf8af
Show file tree
Hide file tree
Showing 17 changed files with 562 additions and 48 deletions.
5 changes: 5 additions & 0 deletions src/tea/App.ts
Expand Up @@ -170,6 +170,11 @@ export class App {
Tea.Shader.textVertexShaderSource,
Tea.Shader.textFragmentShaderSource
);
shader.settings.enableBlend = true;
shader.settings.blend.srcRGB = Tea.ShaderBlendFunc.SrcAlpha;
shader.settings.blend.dstRGB = Tea.ShaderBlendFunc.OneMinusSrcAlpha;
shader.settings.blend.srcAlpha = Tea.ShaderBlendFunc.One;
shader.settings.blend.dstAlpha = Tea.ShaderBlendFunc.One;
var mesh = new Tea.TextMesh(this);
var meshFilter = object3d.addComponent(Tea.MeshFilter);
meshFilter.mesh = mesh;
Expand Down
53 changes: 39 additions & 14 deletions src/tea/Tea.ts
Expand Up @@ -44,11 +44,23 @@ import { Renderer } from "./object/Renderer";
import { LineRenderer } from "./object/LineRenderer";
import { Material, UniformType } from "./object/Material";
import { MeshRenderer } from "./object/MeshRenderer";
import { Shader } from "./object/Shader";
import { TextMesh } from "./object/TextMesh";
import { Texture } from "./object/Texture";
import { Transform } from "./object/Transform";

import { Shader } from "./shader/Shader";
import { ShaderBlend } from "./shader/ShaderBlend";
import { ShaderBlendEquation } from "./shader/ShaderBlendEquation";
import { ShaderBlendFunc } from "./shader/ShaderBlendFunc";
import { ShaderColorMask } from "./shader/ShaderColorMask";
import { ShaderFace } from "./shader/ShaderFace";
import { ShaderHint } from "./shader/ShaderHint";
import { ShaderSettings } from "./shader/ShaderSettings";
import { ShaderStencil } from "./shader/ShaderStencil";
import { ShaderStencilMask } from "./shader/ShaderStencilMask";
import { ShaderStencilOp } from "./shader/ShaderStencilOp";
import { ShaderTestFunc } from "./shader/ShaderTestFunc";

import { App } from "./App";
import { DaeReader } from "./DaeReader";
import { GLCapabilities } from "./GLCapabilities";
Expand Down Expand Up @@ -96,35 +108,48 @@ export {
TextureWrapMode,
Time,

App,
Bounds,
Camera,
Collider,
Component,
DaeReader,
GLCapabilities,
GLExtensions,
GLParameters,
Keyboard,
Mouse,
Mesh,
MeshFilter,
Object3D,
Ray,
RaycastHit,
ObjReader,
Primitives,
Renderer,
LineRenderer,
Material,
UniformType,
MeshRenderer,
Scene,
Script,
Shader,
TextMesh,
Texture,
Transform
Transform,

Shader,
ShaderBlend,
ShaderBlendEquation,
ShaderBlendFunc,
ShaderColorMask,
ShaderFace,
ShaderHint,
ShaderSettings,
ShaderStencil,
ShaderStencilMask,
ShaderStencilOp,
ShaderTestFunc,

App,
DaeReader,
GLCapabilities,
GLExtensions,
GLParameters,
Keyboard,
Mouse,
ObjReader,
Primitives,
Scene,
Script,
}


Expand Down
50 changes: 21 additions & 29 deletions src/tea/object/MeshRenderer.ts
Expand Up @@ -40,6 +40,7 @@ export class MeshRenderer extends Renderer {
this.setMeshData(mesh);
this.setVertexBuffer(mesh);
this.setIndexBuffer(mesh);
this.setFrontFace();
this.draw(mesh);
}

Expand Down Expand Up @@ -168,48 +169,39 @@ export class MeshRenderer extends Renderer {
}
}

protected draw(mesh: Tea.Mesh): void {
protected setFrontFace(): void {
var gl = this.app.gl;
if (mesh.hasTriangles === false) {
var count = this._vertexCount;
if (this.wireframe) {
gl.drawArrays(gl.LINE_LOOP, 0, count);
return;
}
//gl.drawArrays(gl.POINTS, 0, count);
//gl.drawArrays(gl.LINE_LOOP, 0, count);
gl.drawArrays(gl.TRIANGLES, 0, count);
//gl.drawArrays(gl.TRIANGLE_STRIP, 0, count);
return;
}

var scale = this.object3d.scale;
if (scale.x * scale.y * scale.z < 0) {
gl.frontFace(gl.CW);
} else {
gl.frontFace(gl.CCW);
}
}

protected draw(mesh: Tea.Mesh): void {
if (this.wireframe) {
var count = this._triangleCount;
gl.drawElements(gl.LINE_STRIP, count, gl.UNSIGNED_SHORT, 0);
this.drawWireframe(mesh);
return;
}

if (mesh instanceof Tea.TextMesh) {
//gl.disable(gl.DEPTH_TEST);
gl.enable(gl.BLEND);
//gl.blendEquation(gl.FUNC_ADD);
gl.blendFuncSeparate(
gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA,
gl.ONE, gl.ONE
);
} else {
//gl.enable(gl.DEPTH_TEST);
gl.disable(gl.BLEND);
var gl = this.app.gl;
if (mesh.hasTriangles === false) {
var count = this._vertexCount;
gl.drawArrays(gl.TRIANGLES, 0, count);
return;
}

var count = this._triangleCount;
gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, 0);
}

protected drawWireframe(mesh: Tea.Mesh): void {
var gl = this.app.gl;
if (mesh.hasTriangles === false) {
var count = this._vertexCount;
gl.drawArrays(gl.LINE_LOOP, 0, count);
return;
}
var count = this._triangleCount;
gl.drawElements(gl.LINE_STRIP, count, gl.UNSIGNED_SHORT, 0);
}
}
166 changes: 166 additions & 0 deletions src/tea/object/Renderer.ts
Expand Up @@ -180,6 +180,7 @@ export class Renderer extends Component {
}
this._uniforms.program = program;
this._uniforms.useProgram();
this.setShaderSettings();
this.setUniforms(camera);
this.setTexture(this.material.mainTexture);
}
Expand Down Expand Up @@ -215,6 +216,170 @@ export class Renderer extends Component {
}
}

protected setShaderSettings(): void {
var gl = this.app.gl;
var settings = this.material.shader.settings;
if (settings.enableBlend) {
gl.enable(gl.BLEND);
this.setShaderBlend(settings);
} else {
gl.disable(gl.BLEND);
}
if (settings.enableCullFace) {
gl.enable(gl.CULL_FACE);
var mode = Tea.Shader.getFaceValue(
gl, settings.cullFaceMode
);
gl.cullFace(mode);
} else {
gl.disable(gl.CULL_FACE);
}
if (settings.enableDither) {
gl.enable(gl.DITHER);
} else {
gl.disable(gl.DITHER);
}
if (settings.enableDepthTest) {
gl.enable(gl.DEPTH_TEST);
var func = Tea.Shader.getTestFuncValue(
gl, settings.depthFunc
);
gl.depthFunc(func);
} else {
gl.disable(gl.DEPTH_TEST);
}
if (settings.depthWriteMask) {
gl.depthMask(true);
} else {
gl.depthMask(false);
}
if (settings.colorWriteMask != null) {
var colorWriteMask = settings.colorWriteMask;
gl.colorMask(
colorWriteMask.red,
colorWriteMask.green,
colorWriteMask.blue,
colorWriteMask.alpha
);
}
//if (settings.enablePolygonOffsetFill) {
// gl.enable(gl.POLYGON_OFFSET_FILL);
//} else {
// gl.disable(gl.POLYGON_OFFSET_FILL);
//}
//if (settings.enableSampleCoverage) {
// gl.enable(gl.SAMPLE_COVERAGE);
//} else {
// gl.disable(gl.SAMPLE_COVERAGE);
//}
//if (settings.enableScissorTest) {
// gl.enable(gl.SCISSOR_TEST);
//} else {
// gl.disable(gl.SCISSOR_TEST);
//}
if (settings.enableStencilTest) {
gl.enable(gl.STENCIL_TEST);
this.setShaderStencil(settings);
} else {
gl.disable(gl.STENCIL_TEST);
}
}

protected setShaderBlend(settings: Tea.ShaderSettings): void {
var gl = this.app.gl;
var blend = settings.blend;
gl.blendColor(
blend.red,
blend.green,
blend.blue,
blend.alpha
);
var modeRGB = Tea.Shader.getBlendEquationValue(
gl, blend.equationRGB
);
var modeAlpha = Tea.Shader.getBlendEquationValue(
gl, blend.equationAlpha
);
gl.blendEquationSeparate(
modeRGB,
modeAlpha
);
var srcRGB = Tea.Shader.getBlendFuncValue(
gl, blend.srcRGB
);
var dstRGB = Tea.Shader.getBlendFuncValue(
gl, blend.dstRGB
);
var srcAlpha = Tea.Shader.getBlendFuncValue(
gl, blend.srcAlpha
);
var dstAlpha = Tea.Shader.getBlendFuncValue(
gl, blend.dstAlpha
);
gl.blendFuncSeparate(
srcRGB,
dstRGB,
srcAlpha,
dstAlpha
);
}

protected setShaderStencil(settings: Tea.ShaderSettings): void {
var gl = this.app.gl;
var stencil = settings.stencil;
var func = Tea.Shader.getTestFuncValue(
gl, stencil.frontFunc
);
gl.stencilFuncSeparate(
gl.FRONT,
func,
stencil.frontRef,
stencil.frontMask
);
func = Tea.Shader.getTestFuncValue(
gl, stencil.backFunc
);
gl.stencilFuncSeparate(
gl.BACK,
func,
stencil.backRef,
stencil.backMask
);
var fail = Tea.Shader.getStencilOpValue(
gl, stencil.frontFail
);
var zfail = Tea.Shader.getStencilOpValue(
gl, stencil.frontZfail
);
var zpass = Tea.Shader.getStencilOpValue(
gl, stencil.frontZpass
);
gl.stencilOpSeparate(
gl.FRONT,
fail,
zfail,
zpass
);
fail = Tea.Shader.getStencilOpValue(
gl, stencil.backFail
);
zfail = Tea.Shader.getStencilOpValue(
gl, stencil.backZfail
);
zpass = Tea.Shader.getStencilOpValue(
gl, stencil.backZpass
);
gl.stencilOpSeparate(
gl.BACK,
fail,
zfail,
zpass
);
//var stencilMask = settings.stencilMask;
//gl.stencilMaskSeparate(gl.FRONT, stencilMask.front);
//gl.stencilMaskSeparate(gl.BACK, stencilMask.back);
}

protected setUniforms(camera: Tea.Camera): void {
this.setIntrinsicUniforms(camera);
this.setMaterialUniforms();
Expand Down Expand Up @@ -326,6 +491,7 @@ export class Renderer extends Component {
return;
}
gl.bindTexture(gl.TEXTURE_2D, texture.webgl.texture);
gl.activeTexture(gl.TEXTURE0);
this._uniforms.uniform1i("_MainTex", 0);
}
}
1 change: 0 additions & 1 deletion src/tea/object/TextMesh.ts
@@ -1,5 +1,4 @@
import * as Tea from "../Tea";
import { Component } from "./Component";
import { Mesh } from "./Mesh";
import { Primitives } from "../Primitives";

Expand Down

0 comments on commit 0faf8af

Please sign in to comment.