Commit e14b99fa authored by wjf's avatar wjf

2.0.35

parent 7b0befe2
declare namespace FYGE{export const VERSION = "2.0.34";
declare namespace FYGE{export const VERSION = "2.0.35";
export const osType: "ios" | "android" | "pc";
......@@ -8853,9 +8853,15 @@ export class SvgaAni extends AnimationNode {
* @param rotation
* @param anchorX
* @param anchorY
* @returns 返回添加的部件
*/
addAniPart<T extends Container>(imageKey: string, child: T, index: number, x?: number, y?: number, scaleX?: number, scaleY?: number, rotation?: number, anchorX?: number, anchorY?: number): T;
/**
* 移动部件
* @param child
* @returns
*/
addAniPart(imageKey: string, child: Container, index: number, x?: number, y?: number, scaleX?: number, scaleY?: number, rotation?: number, anchorX?: number, anchorY?: number): void;
removeAniPart<T extends Container>(child: T): T;
/**
* 给图层修改图片,一般用于出奖动效的奖品图片的替换,尺寸不一致时会做居中适配
* @param imagekey 会查找所有用了imagekey的图层
......@@ -9549,7 +9555,6 @@ export class Geometry extends HashObject {
_vertices: Float32Array | number[];
_colors: Float32Array | number[];
_uvs: Float32Array | number[];
_uvsOrigin: Float32Array | number[];
_normals: Float32Array | number[];
attrBufferNeedUpdate: boolean;
_indices: Uint16Array | number[];
......@@ -9650,6 +9655,14 @@ export class ShaderMaterial extends HashObject {
value: any;
};
};
/**
* 是否用线框形式绘制
*/
wireframe: boolean;
/**
* 材质渲染面
*/
side: RenderSideType;
/**
* key就是渲染器唯一id
*/
......@@ -9660,7 +9673,7 @@ export class ShaderMaterial extends HashObject {
* 标记下。
* 本来想直接用_instanceType判断,但是后续考虑到SpriteMaterial,SkyMaterial都会继承这个,会重写_instanceType
*/
isShaderMaterial: boolean;
get isShaderMaterial(): boolean;
constructor(vertexShader?: string, fragmentShader?: string, uniforms?: {
[key: string]: {
type: UniformType;
......@@ -9701,7 +9714,11 @@ export enum UniformType {
/**
* m4对象
*/
matrix4 = "m4"
matrix4 = "m4",
/**
* m3对象
*/
matrix3 = "m3"
}
export class Sprite3dMaterial extends ShaderMaterial {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
export const VERSION = "2.0.34";
export const VERSION = "2.0.35";
export const osType: "ios" | "android" | "pc";
......@@ -8853,9 +8853,15 @@ export class SvgaAni extends AnimationNode {
* @param rotation
* @param anchorX
* @param anchorY
* @returns 返回添加的部件
*/
addAniPart<T extends Container>(imageKey: string, child: T, index: number, x?: number, y?: number, scaleX?: number, scaleY?: number, rotation?: number, anchorX?: number, anchorY?: number): T;
/**
* 移动部件
* @param child
* @returns
*/
addAniPart(imageKey: string, child: Container, index: number, x?: number, y?: number, scaleX?: number, scaleY?: number, rotation?: number, anchorX?: number, anchorY?: number): void;
removeAniPart<T extends Container>(child: T): T;
/**
* 给图层修改图片,一般用于出奖动效的奖品图片的替换,尺寸不一致时会做居中适配
* @param imagekey 会查找所有用了imagekey的图层
......@@ -9549,7 +9555,6 @@ export class Geometry extends HashObject {
_vertices: Float32Array | number[];
_colors: Float32Array | number[];
_uvs: Float32Array | number[];
_uvsOrigin: Float32Array | number[];
_normals: Float32Array | number[];
attrBufferNeedUpdate: boolean;
_indices: Uint16Array | number[];
......@@ -9650,6 +9655,14 @@ export class ShaderMaterial extends HashObject {
value: any;
};
};
/**
* 是否用线框形式绘制
*/
wireframe: boolean;
/**
* 材质渲染面
*/
side: RenderSideType;
/**
* key就是渲染器唯一id
*/
......@@ -9660,7 +9673,7 @@ export class ShaderMaterial extends HashObject {
* 标记下。
* 本来想直接用_instanceType判断,但是后续考虑到SpriteMaterial,SkyMaterial都会继承这个,会重写_instanceType
*/
isShaderMaterial: boolean;
get isShaderMaterial(): boolean;
constructor(vertexShader?: string, fragmentShader?: string, uniforms?: {
[key: string]: {
type: UniformType;
......@@ -9701,7 +9714,11 @@ export enum UniformType {
/**
* m4对象
*/
matrix4 = "m4"
matrix4 = "m4",
/**
* m3对象
*/
matrix3 = "m3"
}
export class Sprite3dMaterial extends ShaderMaterial {
......
......@@ -161,16 +161,16 @@
var inputX = document.getElementById("x");
inputX.oninput = () => {
var x = parseInt(inputX.value)
if (x) {
spine.x = x;
}
// if (x) {
spine.x = x || 0;
// }
}
var inputY = document.getElementById("y");
inputY.oninput = () => {
var y = parseInt(inputY.value)
if (y) {
spine.y = y;
}
// if (y) {
spine.y = y || 0;
// }
}
}
})
......
......@@ -15,6 +15,7 @@
<!-- <script src="./js/svgaParser.min.js"></script> -->
<!-- 主引擎 -->
<script src="../build/fyge.min.js"></script>
<!-- <script src="//yun.duiba.com.cn/db_games/libs0924/fyge2030.min.js"></script> -->
<style>
html,
body {
......@@ -88,7 +89,7 @@
var tex = await new Promise((r) => {
FYGE.GlobalLoader.loadImage((s, image) => { r(FYGE.Texture.fromImage(image)) }, "res/11.png")
})
//好多图
//好多图,iphone678/30帧以上
for (var i = 0; i < 20000; i++) {
let a = stage.addChild(new FYGE.Sprite(tex))
.addEventListener(FYGE.Event.ENTER_FRAME, () => {
......
{
"name": "fyge",
"version": "2.0.34",
"version": "2.0.35",
"description": "canvas渲染引擎",
"main": "./build/fyge.min.js",
"types": "./build/types.d.ts",
......
......@@ -413,16 +413,43 @@
2.0.34 InputText的lineSpacing改成lineHeight,原先就是lineHeight
删除TextField的lineSpacing,新增lineHeight
2.0.35 Container的renderWebGL对mask进行判断纹理为空或不可用或者没有几何数据时直接return不渲染
RoundedRectangle的构造函数里对于圆角radius与最小边的半值相等时需要减个小数,防止相等,否则计算顶点会出现NaN
CanvasMaskManager的pushMask里setTransform里a和d不能为0,降级一个小数
SvgaAni的addAniPart增加泛型返回值
SvgaAni新增removeAniPart方法
D3Renderer的flush方法里自定义材质新增uniform类型matrix3
D3Renderer的flush方法里对于map新增uUvTransform(为了图集),去掉原先傻逼的处理方式
getCusShader里新增uUvTransform计算
D3Renderer里对于vao.draw绘制新增point的判断
Geometry去掉字段_uvsOrigin
Sprite3D的几何变成公用的
Sprite3dMaterial添加uvTransform,涉及顶点着色器,uniforms字段,map的set方法需要多处理uvTransform
ShaderMaterial新增字段wireframe,side,,isShaderMaterial变成只读
ShaderMaterial文件里UniformType新增matrix3类型
有些类以后用Particles3D,IMaterial,Points3dMaterial
大尺寸纹理首次传gpu使用时会掉帧,越大耗时越多。考虑如何处理
现在不改,索引数据过大时得用Uint32Array,同时开扩展gl.getExtension( "OES_element_index_uint" )和drawElements改参数类型为gl.UNSIGNED_INT
//现在不改,DisplayObject的getLocalBounds最后是否考虑计算一次updateTransform(不用计算自己的,为了计算子级的)
现在不改,D3Renderer里的aSkinIndex传值用了Uint8Array,类型是gl.UNSIGNED_BYTE,估计那个外星头是因为这个
现在不改,到时loadSpine要改成返回数据(方便创建多个实例)
//现在不改,到时loadSpine要改成返回数据(方便创建多个实例)
引擎内自执行的东西容易导致报错,以后考虑修改,改成方法获取(或者变量用到时再实例)比较安全
lottie的tm字段时啥
深度检测加透明度混合流程,
开启深度检测,gl.enable(gl.DEPTH_TEST)
绘制所有非透明对象,
锁定深度缓冲区(只读),gl.depthMask(false)
绘制所有带透明对象 a < 1.0,注意将物体按深度排序,a 最小最先绘制,(还是说按照离相机距离)
释放深度缓冲区,使之可读可写,gl.depthMask(true)
//滤镜遮罩,当Shape无指令时会导致后面绘制的东西无效,待排查
graphics一直画圆,到后面会画不出来,是超出限制了吗?
显示对象的update方法到时考虑加_(现在先加注释,避免重写覆盖,因为可能影响以前项目)
检查spine动画区间问题
......
......@@ -21,7 +21,7 @@ var json = Buffer.from(JSON.stringify(JSON.parse(fs.readFileSync(inUrl + ".json"
//头部信息
var header = new ArrayBuffer(12);
var headerView = new DataView(header);
var headerView = new DataView(header);//32位最高存储数值2^32-1,每个数值存储字节长度4
headerView.setUint32(0, img.byteLength, true);
headerView.setUint32(4, atlas.byteLength, true);
headerView.setUint32(8, json.byteLength, true);
......
......@@ -7,7 +7,7 @@
* @name VERSION
* @type {string}
*/
export const VERSION = "2.0.34";
export const VERSION = "2.0.35";
/**
......
......@@ -39,7 +39,7 @@ export default class Container extends DisplayObject {
* children改变时触发,暂时没地方用到,考虑废弃
* @param {number} index
*/
onChildrenChange(index:number) {
onChildrenChange(index: number) {
//子类需要时重写
}
......@@ -427,6 +427,19 @@ export default class Container extends DisplayObject {
if (!this.visible || this._worldAlpha <= 0 || !this.renderable) {
return;
}
//如果有遮罩,但是遮罩无数据,直接return
if (this.mask) {
//Shape遮罩,或者Sprite遮罩
// if (this.mask.texture && this.mask.texture.valid) return//不能这么判断,因为此时valid肯定false
if (this.mask.texture) {
this.mask.updateShape && this.mask.updateShape();//更新一下
if (!this.mask.texture.valid) return;
}
//Graphics遮罩,其实这个判断也包括了Sprite的纹理为空的情况
else if (!this.mask.graphicsData || !this.mask.graphicsData.length) {
return;
}
}
//是否有遮罩。到时如果有滤镜,
if (this.mask || (this.filters && this.filters.length)) {
this.renderAdvancedWebGL(renderer);
......
......@@ -45,7 +45,10 @@ export default class RoundedRectangle {
radius = radius < 0 ? -radius : radius;
//大于max取max
radius = radius > max ? max : radius;
//等于最大圆角时额外处理下,否则有点重合
if (radius == max) radius -= 0.0000000001
this.radius = radius;
this.type = SHAPES.RREC;
......
......@@ -30,10 +30,10 @@ export default class CanvasMaskManager extends HashObject {
renderer.context.globalAlpha = 0;//得加上,不绘制
const transform = maskData.transform.worldMatrix;
renderer.context.setTransform(
transform.a,
transform.a || 0.0000000001,//暂时发现a或d为0时,接下来绘制被遮对象用的setTransform时遮罩clip不起作用
transform.b,
transform.c,
transform.d,
transform.d || 0.0000000001,
transform.tx,
transform.ty
);
......
......@@ -122,11 +122,11 @@ export class SvgaAni extends AnimationNode {
* @param rotation
* @param anchorX
* @param anchorY
* @returns
* @returns 返回添加的部件
*/
addAniPart(
addAniPart<T extends Container>(
imageKey: string,
child: Container,
child: T,
index: number,
x?: number,
y?: number,
......@@ -135,7 +135,7 @@ export class SvgaAni extends AnimationNode {
rotation?: number,
anchorX?: number,
anchorY?: number
) {
): T {
if (!child || !imageKey || !this.rawData || !this.animationClip) return;
var oriFrames: FrameEntity[], sprites = this.rawData.sprites;
for (var i = 0; i < sprites.length; i++) {
......@@ -154,6 +154,27 @@ export class SvgaAni extends AnimationNode {
this.addChildAt(child, index),
frames
))
//返回添加的部分
return child;
}
/**
* 移动部件
* @param child
* @returns
*/
removeAniPart<T extends Container>(child: T): T {
//先从父级移除
this.removeChild(child);
//再从tracks移除,为了不想加polyfill,不用find或findIndex
let tracks = this.animationClip["tracks"] as SvgaTrack[];
//找出track;
for (var i = 0; i < tracks.length; i++) {
if (tracks[i]["obj"] == child) {
tracks.splice(i, 1);
break;
}
}
return child
}
/**
* 给图层修改图片,一般用于出奖动效的奖品图片的替换,尺寸不一致时会做居中适配
......
......@@ -160,6 +160,9 @@ export class D3Renderer extends ObjectRenderer {
case UniformType.color:
uniforms[u] = hex2rgb(value)
break;
case UniformType.matrix3:
uniforms[u] = value.toArray(true);
break;
case UniformType.vector2:
case UniformType.vector3:
case UniformType.vector4:
......@@ -218,14 +221,8 @@ export class D3Renderer extends ObjectRenderer {
if (!map.transform) map.transform = new TextureMatrix(map);
//更新下
map.transform.update();
//计算下
let uvs = map.transform.multiplyUvs(geo._uvsOrigin, []);
//判断下map的uv和几何_uv是否一致,原先几何的uv估计需要存下来
if (!isArrayEqual(geo._uvs, uvs)) {
geo._uvs = uvs;
//标记下
geo.attrBufferNeedUpdate = true
}
//赋值偏移
uniforms["uUvTransform"] = map.transform.mapCoord.toArray(true);
}
//是否带环境贴图
if (mat.envMap) {//环境贴图先不考虑图集的情况,一般一张大jpg
......@@ -391,7 +388,7 @@ export class D3Renderer extends ObjectRenderer {
this.renderer.state.setFrontFace(mat.side)
}
//绘制
vao.draw(mat.wireframe ? gl.LINES : gl.TRIANGLES);
vao.draw(mat["isPointsMaterial"] ? gl.POINTS : mat.wireframe ? gl.LINES : gl.TRIANGLES);
}
this.meshes.length = 0
}
......@@ -493,6 +490,7 @@ function addMorphtargetsAttr(
gl: WebGLRenderingContext,
): UploadBufferData[] {
var morphTargets = geo._morphPositions;
//这里的判断是有问题的,讲道理应该是mat.morphNormals&&geo._morphNormals;但是现在变形动画都由glb提供,里面只要有法线变形就会设置mat.morphNormals=true
var morphNormals = geo._morphNormals;
var length = objectInfluences.length;//权重数据总长度,基本不会被手动修改,到时排序只取权重大的,最多8
......@@ -778,7 +776,8 @@ function getShadowMap(
}
//绘制
vao.draw(mat.wireframe ? gl.LINES : gl.TRIANGLES);
// vao.draw(mat.wireframe ? gl.LINES : gl.TRIANGLES);
vao.draw(mat["isPointsMaterial"] ? gl.POINTS : mat.wireframe ? gl.LINES : gl.TRIANGLES)
})
//纹理绑定回去
......
......@@ -23,7 +23,7 @@ export class Geometry extends HashObject {
_vertices: Float32Array | number[];
_colors: Float32Array | number[];
_uvs: Float32Array | number[]; _uvsOrigin: Float32Array | number[];
_uvs: Float32Array | number[];
_normals: Float32Array | number[];
//记录上面四项数据是否修改了,自行赋值
......@@ -97,7 +97,7 @@ export class Geometry extends HashObject {
for (var i = 0; i < vertices.length; i++)f[i] = 1;
return f;
})()//new Float32Array(vertices.length).map(() => { return 1 });//不传就全是白色
this._uvs = this._uvsOrigin = uvs || new Float32Array(vertices.length / 3 * 2);
this._uvs = uvs || new Float32Array(vertices.length / 3 * 2);
//索引直接用,可能没有,需要转成类型化数组,会直接upload
this._indices = indices ? new Uint16Array(indices) : null;
//顶点长度先记录,渲染时再加了,先去掉
......
......@@ -12,7 +12,7 @@ const templeSphere: Sphere = new Sphere();
const tempMatrix: Matrix4 = new Matrix4();
const tempRay: Ray = new Ray();
const tempPoint = new Vector3();
//现在基本所有3d的显示对象(sprite3d以及所有help)都继承自Mesh3D,但是以后尽量分开,包括line和point,以及材质也需要分开,TODO
export class Mesh3D extends Object3D {
/**
* 用于变形权重,只能获取,修改只能内部修改
......
//3d例子对象
//提前设定好最大粒子数。也就是几何的顶点数
//考虑各种参数在cpu计算,然后传数据,比如attribute位置,透明度,颜色,尺寸,是否渲染等等,都是数组,
//暂时这些信息都在cpu内托管,以后有时间参考babylon的gpu粒子,一次gpuupdate,一次gpurender
//暂时不好写,到时得修改下Geometry才行,否则很多attribute没法传
import { Mesh3D } from "../Mesh3D";
//又是继承Mesh3D,以后有时间注意修改,区分mesh,point,line
export class Particles3D extends Mesh3D {
// constructor(public count: number = 1000) {
// super()
// this._instanceType = "Particles3D"
// }
}
\ No newline at end of file
......@@ -2,22 +2,26 @@ import { Geometry } from "../Geometry";
import { Sprite3dMaterial } from "../materials";
import { Mesh3D } from "../Mesh3D";
//所有sprite公用一个几何
let geometrySpirte3D: Geometry;
export class Sprite3D extends Mesh3D {
constructor(material: Sprite3dMaterial) {
var vertices = [
- 0.5, - 0.5, 0,// 0, 0,
0.5, - 0.5, 0,// 1, 0,
0.5, 0.5, 0, //1, 1,
- 0.5, 0.5, 0,// 0, 1
];
var uvs = [
0, 1,
1, 1,
1, 0,
0, 0
]
if (!geometrySpirte3D) {
var vertices = [
- 0.5, - 0.5, 0,// 0, 0,
0.5, - 0.5, 0,// 1, 0,
0.5, 0.5, 0, //1, 1,
- 0.5, 0.5, 0,// 0, 1
];
var uvs = [
0, 1,
1, 1,
1, 0,
0, 0
];
geometrySpirte3D = new Geometry(vertices, [0, 1, 2, 0, 2, 3], null, null, uvs);
}
//@ts-ignore
super(new Geometry(vertices, [0, 1, 2, 0, 2, 3], null, null,uvs), material);
super(geometrySpirte3D, material);
}
}
\ No newline at end of file
import { BLEND_MODES } from "../../2d/const";
import { HashObject } from "../../2d/HashObject";
/**
* 材质基类,一些公用的属性,,一般是渲染状态机的属性,不会包括uniform的属性
* 到时着色器还需要分块,否则自定义着色器不好拼
* 感觉改得越来越像three了
* 暂时还没启用
*/
export class IMaterial extends HashObject {
/**
* 是否用线框形式绘制
*/
wireframe: boolean = false;
/**
* 材质渲染面
*/
// side: RenderSideType = RenderSideType.FrontSide;
/**
* BLEND_MODES到时都得重新整理下,现在很多是无效的
* 暂时不加three得自定义混色,也不设置是否预乘透明度,只用引擎给的
*/
blending: BLEND_MODES = BLEND_MODES.NORMAL
/**
* 是否允许透明,
*/
transparent: boolean;
/**
* 是否进行深度检测,默认true depthFunc先不加
*/
depthTest: boolean = true;
/**
* 是否进行深度写入,默认true
*/
depthWrite: boolean = true;
/**
* 是否需要更新材质
*/
needsUpdate: boolean = true;
constructor() {
super();
this._instanceType = "IMaterial"
}
destroy() {
}
}
\ No newline at end of file
import { DEG_TO_RAD, RAD_TO_DEG } from "../../2d/const";
import { Matrix } from "../../2d/math";
import { WebglRenderer } from "../../2d/renderers/WebglRenderer";
import { Texture } from "../../2d/texture";
import { GLShader } from "../../glCore";
import { Vector2 } from "../math/Vector2";
import { ShaderMaterial, UniformType } from "./ShaderMaterial";
const points3dVertexShader =
`precision mediump float;
attribute vec3 aPosition;
uniform mat4 uViewMatrix;
uniform mat4 uProjectionMatrix;
uniform mat4 uModelMatrix;
uniform float size;
uniform float scale;
void main() {
vec4 mvPosition = uViewMatrix * uModelMatrix * vec4( aPosition, 1.0 );
gl_Position = uProjectionMatrix * mvPosition;
gl_PointSize = size;
#ifdef USE_SIZEATTENUATION
bool isPerspective = ( uProjectionMatrix[ 2 ][ 3 ] == - 1.0 );
if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );
#endif
}`;
const points3dFragmentShader =
`precision mediump float;
uniform vec3 color;
uniform float alpha;
uniform sampler2D map;
uniform mat3 uvTransform;
void main() {
vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;
vec4 mapColor = texture2D( map, uv );
gl_FragColor = vec4( color*alpha, alpha )*mapColor;
}`;
/**
* 为了粒子系统的点材料,其实也可能是顶点变形动画网格,
* 暂时只用作粒子系统,到时候glsl都规范后仿three的chunk写,通通可以拼,
* 所以暂时命名为ParticlesMaterial,不用point,
* 新版three的Points是支持变形动画的
* three貌似是分开的,考虑按three的方式来,网格点分开,材质也分开
* 暂时按照自定义着色器来
* 透明度和深度检测是个大问题,到时候大改的时候再用,暂时不用
*/
export class Points3dMaterial extends ShaderMaterial {
sizeAttenuation: boolean = true;
get isPointsMaterial() {
return true
}
constructor() {
super(points3dVertexShader, points3dFragmentShader, {
color: { type: UniformType.color, value: 0xffffff },
alpha: { type: UniformType.float, value: 1.0 },
map: { type: UniformType.texture, value: Texture.WHITE },
uvTransform: { type: UniformType.matrix3, value: new Matrix() },
scale: { type: UniformType.float, value: 100.0 },//一般是一半的画布高度
size: { type: UniformType.float, value: 1.0 }
})
}
getShader(renderer: WebglRenderer): GLShader {
const id = "" + renderer.CONTEXT_UID + this.sizeAttenuation;
if (!this.shaders[id]) {
//生成
this.shaders[id] = new GLShader(
renderer.gl,
(this.sizeAttenuation ? '#define USE_SIZEATTENUATION\n' : "") + this.vertexShader,
this.fragmentShader
);
this.shaders[id]["_glShaderKey"] = `customShader${"id" + id}${"instanceId" + this.instanceId}${"sizeAttenuation" + this.sizeAttenuation}`;
};
return this.shaders[id];
}
}
\ No newline at end of file
import { HashObject } from "../../2d/HashObject";
import { WebglRenderer } from "../../2d/renderers/WebglRenderer";
import { GLShader } from "../../glCore";
import { RenderSideType } from "./BaseMaterial";
// precision mediump float;
// precision mediump int;
......@@ -31,6 +32,14 @@ export const defaultFragmentShader3d =
* uniform mat4 uModelMatrix;
*/
export class ShaderMaterial extends HashObject {
/**
* 是否用线框形式绘制
*/
wireframe: boolean = false;
/**
* 材质渲染面
*/
side: RenderSideType = RenderSideType.FrontSide;
/**
* key就是渲染器唯一id
*/
......@@ -39,7 +48,9 @@ export class ShaderMaterial extends HashObject {
* 标记下。
* 本来想直接用_instanceType判断,但是后续考虑到SpriteMaterial,SkyMaterial都会继承这个,会重写_instanceType
*/
isShaderMaterial: boolean = true;
get isShaderMaterial(): boolean {
return true;
};
constructor(
protected vertexShader = defaultVertexShader3d,
protected fragmentShader = defaultFragmentShader3d,
......@@ -106,4 +117,8 @@ export enum UniformType {
* m4对象
*/
matrix4 = "m4",
/**
* m3对象
*/
matrix3 = "m3",
}
\ No newline at end of file
import { DEG_TO_RAD, RAD_TO_DEG } from "../../2d/const";
import { Matrix } from "../../2d/math";
import { WebglRenderer } from "../../2d/renderers/WebglRenderer";
import { Texture } from "../../2d/texture";
import TextureMatrix from "../../2d/texture/TextureMatrix";
import { GLShader } from "../../glCore";
import { Vector2 } from "../math/Vector2";
import { ShaderMaterial, UniformType } from "./ShaderMaterial";
......@@ -19,8 +21,10 @@ uniform vec2 center;
uniform float rotation;
uniform mat3 uvTransform;
void main() {
vTextureCoord = aTextureCoord;
vTextureCoord = ( uvTransform * vec3( aTextureCoord, 1 ) ).xy;
vec4 mvPosition = uViewMatrix * uModelMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );
vec2 scale;
scale.x = length( vec3( uModelMatrix[ 0 ].x, uModelMatrix[ 0 ].y, uModelMatrix[ 0 ].z ) );
......@@ -49,7 +53,7 @@ uniform sampler2D map;
varying vec2 vTextureCoord;
void main() {
vec4 mapColor = texture2D( map, vTextureCoord );
gl_FragColor = vec4( color, alpha )*mapColor;
gl_FragColor = vec4( color*alpha, alpha )*mapColor;
}`;
export class Sprite3dMaterial extends ShaderMaterial {
......@@ -61,6 +65,7 @@ export class Sprite3dMaterial extends ShaderMaterial {
color: { type: UniformType.color, value: 0xffffff },
alpha: { type: UniformType.float, value: 1.0 },
map: { type: UniformType.texture, value: Texture.WHITE },
uvTransform: { type: UniformType.matrix3, value: new Matrix() },
});
this._instanceType = "Sprite3dMaterial";
}
......@@ -106,5 +111,12 @@ export class Sprite3dMaterial extends ShaderMaterial {
}
set map(v: Texture) {
this.uniforms.map.value = v;
//纹理坐标矩阵
//没加的加一个
if (!v.transform) v.transform = new TextureMatrix(v);
//更新下
v.transform.update();
//赋值偏移
(this.uniforms.uvTransform.value as Matrix).copy(v.transform.mapCoord);
}
}
\ No newline at end of file
......@@ -290,6 +290,7 @@ const VERT = [
"#ifdef USE_MAP",//有贴图才用到纹理坐标
" attribute vec2 aTextureCoord;",//纹理坐标,
" varying vec2 vTextureCoord;",//传到着色器的纹理坐标
" uniform mat3 uUvTransform;",//纹理uv偏移,为了图集
"#endif",
//使用环境贴图或灯光
'#if defined( USE_ENVMAP ) || defined( USE_LIGHT )',
......@@ -410,7 +411,8 @@ const VERT = [
" #endif",
//纹理坐标
" #ifdef USE_MAP",
" vTextureCoord = aTextureCoord;",
// " vTextureCoord = aTextureCoord;",
" vTextureCoord = ( uUvTransform * vec3( aTextureCoord, 1 ) ).xy;",//转换下uv
" #endif",
//使用环境贴图或灯光
' #if defined( USE_ENVMAP ) || defined( USE_LIGHT )',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment