Skip to content

Commit

Permalink
fix some defects
Browse files Browse the repository at this point in the history
  • Loading branch information
zxg0622 committed Dec 23, 2019
1 parent 0347238 commit 18301c4
Show file tree
Hide file tree
Showing 14 changed files with 51 additions and 50 deletions.
4 changes: 3 additions & 1 deletion cocos/core/3d/framework/model-component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,9 @@ export class ModelComponent extends RenderableComponent {
this._model.isDynamicBatching = this._enableDynamicBatching; // should pass this in before create PSO
const meshCount = this._mesh ? this._mesh.subMeshCount : 0;
for (let i = 0; i < meshCount; ++i) {
const material = this.getRenderMaterial(i);
// warning:这里先改成model总是使用材质实例,等model中的createPipelineState修改完后再替换成getRenderMaterial
const material = this.getMaterialInstance(i);
// const material = this.getRenderMaterial(i);
const renderingMesh = this._mesh.renderingMesh;
if (renderingMesh) {
const subMeshData = renderingMesh.getSubmesh(i);
Expand Down
2 changes: 1 addition & 1 deletion cocos/core/assets/effect-asset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import { GFXDynamicState, GFXPrimitiveMode } from '../gfx/define';
import { GFXBlendState, GFXDepthStencilState, GFXRasterizerState } from '../gfx/pipeline-state';
import { GFXUniformBlock, GFXUniformSampler } from '../gfx/shader';
import { RenderPassStage } from '../pipeline/define';
import { IDefineMap } from '../renderer/core/pass';
import { IDefineMap } from '../renderer/core/pass-utils';
import { programLib } from '../renderer/core/program-lib';
import { Asset } from './asset';

Expand Down
16 changes: 3 additions & 13 deletions cocos/core/assets/material.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
import { ccclass, property } from '../../core/data/class-decorator';
import { builtinResMgr } from '../3d/builtin/init';
import { RenderableComponent } from '../3d/framework/renderable-component';
import { IDefineMap, Pass, PassOverrides } from '../renderer/core/pass';
import { Pass, PassOverrides } from '../renderer/core/pass';
import { IDefineMap } from '../renderer/core/pass-utils';
import { _uploadProperty, generateMaterailHash, IMaterial } from '../utils/material-interface';
import { Asset } from './asset';
import { EffectAsset } from './effect-asset';
Expand Down Expand Up @@ -222,18 +223,7 @@ export class Material extends Asset implements IMaterial {
* @param passIdx 要重载的 pass 索引,默认重载所有 pass。
*/
public overridePipelineStates (overrides: PassOverrides, passIdx?: number) {
if (!this._passes || !this._effectAsset) { return; }
const passInfos = this._effectAsset.techniques[this._techIdx].passes;
if (passIdx === undefined) {
for (let i = 0; i < this._passes.length; i++) {
const pass = this._passes[i];
this._states[i] = overrides;
pass.overridePipelineStates(passInfos[pass.idxInTech], overrides);
}
} else {
this._states[passIdx] = overrides;
this._passes[passIdx].overridePipelineStates(passInfos[passIdx], overrides);
}
console.error('Material:' + this.effectName + ' cann\'t be overwritten.Please use pass instance to do so.');
}

/**
Expand Down
2 changes: 1 addition & 1 deletion cocos/core/pipeline/render-pipeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { GFXTexture } from '../gfx/texture';
import { GFXTextureView } from '../gfx/texture-view';
import { Mat4, Vec3, Vec4 } from '../math';
import { Camera, Model } from '../renderer';
import { IDefineMap } from '../renderer/core/pass';
import { IDefineMap } from '../renderer/core/pass-utils';
import { programLib } from '../renderer/core/program-lib';
import { SKYBOX_FLAG } from '../renderer/scene/camera';
import { Root } from '../root';
Expand Down
3 changes: 2 additions & 1 deletion cocos/core/renderer/core/material-instance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ import { EffectAsset, Material } from '../../assets';
import { _uploadProperty, IMaterial } from '../../utils/material-interface';
import { murmurhash2_32_gc } from '../../utils/murmurhash2_gc';
import { IPass } from '../../utils/pass-interface';
import { IDefineMap, PassOverrides } from './pass';
import { PassOverrides } from './pass';
import { PassInstance } from './pass-instance';
import { IDefineMap } from './pass-utils';

export class MaterialInstance implements IMaterial {

Expand Down
27 changes: 9 additions & 18 deletions cocos/core/renderer/core/pass-instance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import { isBuiltinBinding, RenderPassStage, RenderPriority } from '../../pipelin
import { getPhaseID } from '../../pipeline/pass-phase';
import { IMaterial } from '../../utils/material-interface';
import { generatePassPSOHash, IBlock, IPass, IPassDynamics, IPSOHashInfo } from '../../utils/pass-interface';
import { IDefineMap, Pass } from './pass';
import { getBindingFromHandle, getOffsetFromHandle, getTypeFromHandle, type2default, type2reader, type2writer } from './pass-utils';
import { Pass } from './pass';
import { assignDefines, getBindingFromHandle, getOffsetFromHandle, getTypeFromHandle, IDefineMap, type2default, type2reader, type2writer } from './pass-utils';
import { IProgramInfo, programLib } from './program-lib';
import { samplerLib } from './sampler-lib';

Expand Down Expand Up @@ -360,7 +360,10 @@ export class PassInstance implements IPass {
}
}

public tryCompile (defineOverrides?: IDefineMap, saveOverrides?: boolean): any {
public tryCompile (defineOverrides?: IDefineMap): any {
if (defineOverrides && !assignDefines(this._defines, defineOverrides)) {
return null;
}
const pipeline = cc.director.root.pipeline;
if (!pipeline) {
return null;
Expand All @@ -369,25 +372,13 @@ export class PassInstance implements IPass {
if (!this._renderPass) {
console.warn(`illegal pass stage.`); return null;
}
let defines = this._defines;
if (defineOverrides) {
if (saveOverrides) {
Object.assign(this._defines, defineOverrides);
}
else {
Object.assign(defineOverrides, this._defines);
defines = defineOverrides;
}
}
const res = programLib.getGFXShader(this.device, this.program, defines, pipeline);
const res = programLib.getGFXShader(this.device, this.program, this._defines, pipeline);
if (!res.shader) {
console.warn(`create shader ${this.program} failed`);
return null;
}
if (saveOverrides) {
this._shader = res.shader;
this._bindings = res.bindings;
}
this._shader = res.shader;
this._bindings = res.bindings;
this._hash = generatePassPSOHash(this);
this._onPipelineStateChanged();
return res;
Expand Down
14 changes: 14 additions & 0 deletions cocos/core/renderer/core/pass-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,17 @@ export const type2default = {
[GFXType.SAMPLER2D]: 'default-texture',
[GFXType.SAMPLER_CUBE]: 'default-cube-texture',
};

export interface IDefineMap { [name: string]: number | boolean | string; }

export function assignDefines (target: IDefineMap, source: IDefineMap): boolean {
const entries = Object.entries(source);
let isDifferent: boolean = false;
for (let i = 0; i < entries.length; i++) {
if (target[entries[i][0]] !== entries[i][1]) {
target[entries[i][0]] = entries[i][1];
isDifferent = true;
}
}
return isDifferent;
}
11 changes: 7 additions & 4 deletions cocos/core/renderer/core/pass.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@ import { isBuiltinBinding, RenderPassStage, RenderPriority } from '../../pipelin
import { getPhaseID } from '../../pipeline/pass-phase';
import { Root } from '../../root';
import { generatePassPSOHash, IBlock, IPass, IPassDynamics, IPSOHashInfo } from '../../utils/pass-interface';
import { customizeType, getBindingFromHandle, getBindingTypeFromHandle, getOffsetFromHandle, getTypeFromHandle, type2default, type2reader, type2writer } from './pass-utils';
// tslint:disable-next-line: max-line-length
import { assignDefines, customizeType, getBindingFromHandle, getBindingTypeFromHandle, getOffsetFromHandle, getTypeFromHandle, IDefineMap, type2default, type2reader, type2writer } from './pass-utils';
import { IProgramInfo, IShaderResources, programLib } from './program-lib';
import { samplerLib } from './sampler-lib';

export interface IDefineMap { [name: string]: number | boolean | string; }
export interface IPassInfoFull extends IPassInfo {
// generated part
idxInTech: number;
Expand Down Expand Up @@ -500,15 +500,18 @@ export class Pass implements IPass {
*/
public tryCompile (
defineOverrides?: IDefineMap,
saveOverrides = true,
): IShaderResources | null /* TODO: Explicit since TS4053 bug , changes required once the issue is fixed. */ {
if (defineOverrides && !assignDefines(this._defines, defineOverrides)) {
return null;
}
const pipeline = (cc.director.root as Root).pipeline;
if (!pipeline) { return null; }
this._renderPass = pipeline.getRenderPass(this._stage);
if (!this._renderPass) { console.warn(`illegal pass stage.`); return null; }
const res = programLib.getGFXShader(this._device, this._programName, this._defines, pipeline);
if (!res.shader) { console.warn(`create shader ${this._programName} failed`); return null; }
if (saveOverrides) { this._shader = res.shader; this._bindings = res.bindings; }
this._shader = res.shader;
this._bindings = res.bindings;
this._hash = generatePassPSOHash(this);
return res;
}
Expand Down
3 changes: 1 addition & 2 deletions cocos/core/renderer/core/program-lib.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ import { GFXAPI, GFXDevice } from '../../gfx/device';
import { GFXShader, GFXUniformBlock } from '../../gfx/shader';
import { IInternalBindingDesc, localBindingsDesc } from '../../pipeline/define';
import { RenderPipeline } from '../../pipeline/render-pipeline';
import { IDefineMap } from './pass';
import { genHandle } from './pass-utils';
import { genHandle, IDefineMap } from './pass-utils';

interface IDefineRecord extends IDefineInfo {
_map: (value: any) => number;
Expand Down
4 changes: 2 additions & 2 deletions cocos/core/renderer/scene/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ import { Node } from '../../scene-graph';
import { Layers } from '../../scene-graph/layers';
import { IMaterial } from '../../utils/material-interface';
import { IPass } from '../../utils/pass-interface';
import { IDefineMap } from '../core/pass';
import { customizationManager } from './customization-manager';
import { RenderScene } from './render-scene';
import { SubModel } from './submodel';
import { IDefineMap } from '../core/pass-utils';

const m4_1 = new Mat4();

Expand Down Expand Up @@ -360,7 +360,7 @@ export class Model {
}
}

protected createPipelineState (pass: IPass, defineOverrides?: IDefineMap, stateOverrides?: IPassStates) {
protected createPipelineState (pass: IPass, defineOverrides?: IDefineMap) {
defineOverrides = defineOverrides || {};
if (pass.blendState.targets[0].blend) {
this._isDynamicBatching = false;
Expand Down
4 changes: 2 additions & 2 deletions cocos/core/utils/material-interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import { EffectAsset } from '../assets/effect-asset';
import { SpriteFrame } from '../assets/sprite-frame';
import { TextureBase } from '../assets/texture-base';
import { GFXBindingType, GFXTextureView } from '../gfx';
import { IDefineMap, PassOverrides } from '../renderer/core/pass';
import { getBindingFromHandle, getBindingTypeFromHandle } from '../renderer/core/pass-utils';
import { PassOverrides } from '../renderer/core/pass';
import { getBindingFromHandle, getBindingTypeFromHandle, IDefineMap } from '../renderer/core/pass-utils';
import { samplerLib } from '../renderer/core/sampler-lib';
import { murmurhash2_32_gc } from './murmurhash2_gc';
import { IPass } from './pass-interface';
Expand Down
5 changes: 3 additions & 2 deletions cocos/core/utils/pass-interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import { IGFXBinding } from '../gfx/binding-layout';
import { GFXBlendState, GFXDepthStencilState, GFXRasterizerState } from '../gfx/pipeline-state';
import { BatchedBuffer } from '../pipeline/batched-buffer';
import { RenderPassStage, RenderPriority } from '../pipeline/define';
import { IDefineMap, PassOverrides } from '../renderer/core/pass';
import { PassOverrides } from '../renderer/core/pass';
import { IDefineMap } from '../renderer/core/pass-utils';
import { murmurhash2_32_gc } from './murmurhash2_gc';

export interface IBlock {
Expand Down Expand Up @@ -211,7 +212,7 @@ export interface IPass {
* 尝试编译 shader 并获取相关资源引用。
* @param defineOverrides shader 预处理宏定义重载
*/
tryCompile (defineOverrides?: IDefineMap, saveOverrides?: boolean): any;
tryCompile (defineOverrides?: IDefineMap): any;

/**
* @zh
Expand Down
4 changes: 2 additions & 2 deletions cocos/particle/renderer/particle-system-renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import { GFXAttributeName, GFXFormat } from '../../core/gfx/define';
import { IGFXAttribute } from '../../core/gfx/input-assembler';
import { Mat4, Vec2, Vec3, Vec4 } from '../../core/math';
import { RecyclePool } from '../../core/memop';
import { MaterialInstance } from '../../core/renderer';
import { IDefineMap } from '../../core/renderer/core/pass';
import { MaterialInstance } from '../../core/renderer/core/material-instance';
import { IDefineMap } from '../../core/renderer/core/pass-utils';
import { IMaterial } from '../../core/utils/material-interface';
import { RenderMode, Space } from '../enum';
import ParticleBatchModel from '../models/particle-batch-model';
Expand Down
2 changes: 1 addition & 1 deletion cocos/terrain/terrain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { GFXAttributeName, GFXBufferUsageBit, GFXFormat, GFXMemoryUsageBit, GFXP
import { GFXDevice } from '../core/gfx/device';
import { IGFXAttribute } from '../core/gfx/input-assembler';
import { clamp, Rect, Size, Vec2, Vec3, Vec4 } from '../core/math';
import { IDefineMap } from '../core/renderer/core/pass';
import { IDefineMap } from '../core/renderer/core/pass-utils';
import { Model } from '../core/renderer/scene/model';
import { Root } from '../core/root';
import { PrivateNode } from '../core/scene-graph/private-node';
Expand Down

0 comments on commit 18301c4

Please sign in to comment.