@awayjs/renderer
Version:
Renderer for AwayJS
102 lines (80 loc) • 2.43 kB
text/typescript
import { AbstractMethodError, AbstractionBase } from '@awayjs/core';
import {
Stage,
ShaderRegisterCache,
ShaderRegisterData,
ShaderRegisterElement,
} from '@awayjs/stage';
import { _Render_RenderableBase } from './_Render_RenderableBase';
import { ShaderBase } from './ShaderBase';
import { ITexture } from '../base/ITexture';
import { ChunkVO } from '../base/ChunkVO';
/**
*
* @class away.pool._Shader_TextureBaseBase
*/
export class _Shader_TextureBase extends AbstractionBase {
protected _shader: ShaderBase;
protected _stage: Stage;
public get texture(): ITexture {
return this._useWeak ? (<WeakRef<ITexture>> this._asset).deref() : <ITexture> this._asset;
}
public init(texture: ITexture, shader: ShaderBase): void {
super.init(texture, shader, true);
this._shader = shader;
this._stage = shader._stage;
}
/**
*
*/
public onClear(): void {
super.onClear();
this._shader = null;
this._stage = null;
}
/**
* Initializes the properties for a MethodVO, including register and texture indices.
*
* @param methodVO The MethodVO object linking this method with the pass currently being compiled.
*
* @internal
*/
public _initVO(chunkVO: ChunkVO): void {
}
/**
* Initializes unchanging shader constants using the data from a MethodVO.
*
* @param methodVO The MethodVO object linking this method with the pass currently being compiled.
*
* @internal
*/
public _initConstants(): void {
}
public _getFragmentCode(
targetReg: ShaderRegisterElement,
regCache: ShaderRegisterCache,
sharedReg: ShaderRegisterData,
inputReg: ShaderRegisterElement = null): string {
throw new AbstractMethodError();
}
public _setRenderState(renderState: _Render_RenderableBase): void {
//overidden for state logic
}
public activate(): void {
//overridden for activation logic
}
public getTextureReg(
imageIndex: number,
regCache: ShaderRegisterCache,
sharedReg: ShaderRegisterData): ShaderRegisterElement {
//todo: collapse the index based on duplicate image objects to save registrations
const index: number = this._shader.imageIndices.indexOf(imageIndex);
if (index == -1) {
const textureReg: ShaderRegisterElement = regCache.getFreeTextureReg();
sharedReg.textures.push(textureReg);
this._shader.imageIndices.push(imageIndex);
return textureReg;
}
return sharedReg.textures[index];
}
}