Skip to content
Snippets Groups Projects
Commit 2285653c authored by Alexander Rose's avatar Alexander Rose
Browse files

tweak renderItem value changes handling

parent 6fd00e31
No related branches found
No related tags found
No related merge requests found
...@@ -41,8 +41,8 @@ export function createRenderable<T extends Values<RenderableSchema> & BaseValues ...@@ -41,8 +41,8 @@ export function createRenderable<T extends Values<RenderableSchema> & BaseValues
render: (variant: RenderVariant) => renderItem.render(variant), render: (variant: RenderVariant) => renderItem.render(variant),
getProgram: (variant: RenderVariant) => renderItem.getProgram(variant), getProgram: (variant: RenderVariant) => renderItem.getProgram(variant),
update: () => { update: () => {
renderItem.update() const valueChanges = renderItem.update()
boundingSphere = undefined if (valueChanges.attributes) boundingSphere = undefined
}, },
dispose: () => renderItem.destroy() dispose: () => renderItem.destroy()
} }
......
...@@ -37,7 +37,7 @@ export interface RenderItem { ...@@ -37,7 +37,7 @@ export interface RenderItem {
getProgram: (variant: RenderVariant) => Program getProgram: (variant: RenderVariant) => Program
render: (variant: RenderVariant) => void render: (variant: RenderVariant) => void
update: () => void update: () => Readonly<ValueChanges>
destroy: () => void destroy: () => void
} }
...@@ -52,6 +52,14 @@ export type RenderVariant = keyof typeof RenderVariantDefines ...@@ -52,6 +52,14 @@ export type RenderVariant = keyof typeof RenderVariantDefines
type ProgramVariants = { [k: string]: ReferenceItem<Program> } type ProgramVariants = { [k: string]: ReferenceItem<Program> }
type VertexArrayVariants = { [k: string]: WebGLVertexArrayObjectOES | undefined } type VertexArrayVariants = { [k: string]: WebGLVertexArrayObjectOES | undefined }
interface ValueChanges {
attributes: boolean
defines: boolean
elements: boolean
textures: boolean
uniforms: boolean
}
export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: ShaderCode, schema: RenderableSchema, values: RenderableValues): RenderItem { export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: ShaderCode, schema: RenderableSchema, values: RenderableValues): RenderItem {
const id = getNextRenderItemId() const id = getNextRenderItemId()
const { programCache } = ctx const { programCache } = ctx
...@@ -88,6 +96,14 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S ...@@ -88,6 +96,14 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S
let drawCount = values.drawCount.ref.value let drawCount = values.drawCount.ref.value
let instanceCount = values.instanceCount.ref.value let instanceCount = values.instanceCount.ref.value
const valueChanges: ValueChanges = {
attributes: false,
defines: false,
elements: false,
textures: false,
uniforms: false
}
let destroyed = false let destroyed = false
return { return {
...@@ -112,17 +128,17 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S ...@@ -112,17 +128,17 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S
} }
}, },
update: () => { update: () => {
let defineChange = false valueChanges.defines = false
Object.keys(defineValues).forEach(k => { Object.keys(defineValues).forEach(k => {
const value = defineValues[k] const value = defineValues[k]
if (value.ref.version !== versions[k]) { if (value.ref.version !== versions[k]) {
// console.log('define version changed', k) // console.log('define version changed', k)
defineChange = true valueChanges.defines = true
versions[k] = value.ref.version versions[k] = value.ref.version
} }
}) })
if (defineChange) { if (valueChanges.defines) {
// console.log('some defines changed, need to rebuild programs') // console.log('some defines changed, need to rebuild programs')
Object.keys(RenderVariantDefines).forEach(k => { Object.keys(RenderVariantDefines).forEach(k => {
const variantDefineValues: Values<RenderableSchema> = (RenderVariantDefines as any)[k] const variantDefineValues: Values<RenderableSchema> = (RenderVariantDefines as any)[k]
...@@ -145,8 +161,7 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S ...@@ -145,8 +161,7 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S
versions.instanceCount = values.instanceCount.ref.version versions.instanceCount = values.instanceCount.ref.version
} }
let bufferChange = false valueChanges.attributes = false
Object.keys(attributeValues).forEach(k => { Object.keys(attributeValues).forEach(k => {
const value = attributeValues[k] const value = attributeValues[k]
if (value.ref.version !== versions[k]) { if (value.ref.version !== versions[k]) {
...@@ -159,12 +174,13 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S ...@@ -159,12 +174,13 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S
attributeBuffers[k].destroy() attributeBuffers[k].destroy()
const spec = schema[k] as AttributeSpec<ArrayKind> const spec = schema[k] as AttributeSpec<ArrayKind>
attributeBuffers[k] = createAttributeBuffer(ctx, value.ref.value, spec.itemSize, spec.divisor) attributeBuffers[k] = createAttributeBuffer(ctx, value.ref.value, spec.itemSize, spec.divisor)
bufferChange = true valueChanges.attributes = true
} }
versions[k] = value.ref.version versions[k] = value.ref.version
} }
}) })
valueChanges.elements = false
if (elementsBuffer && values.elements.ref.version !== versions.elements) { if (elementsBuffer && values.elements.ref.version !== versions.elements) {
if (elementsBuffer.length >= values.elements.ref.value.length) { if (elementsBuffer.length >= values.elements.ref.value.length) {
// console.log('elements array large enough to update') // console.log('elements array large enough to update')
...@@ -173,12 +189,12 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S ...@@ -173,12 +189,12 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S
// console.log('elements array to small, need to create new elements') // console.log('elements array to small, need to create new elements')
elementsBuffer.destroy() elementsBuffer.destroy()
elementsBuffer = createElementsBuffer(ctx, values.elements.ref.value) elementsBuffer = createElementsBuffer(ctx, values.elements.ref.value)
bufferChange = true valueChanges.elements = true
} }
versions.elements = values.elements.ref.version versions.elements = values.elements.ref.version
} }
if (defineChange || bufferChange) { if (valueChanges.attributes || valueChanges.defines || valueChanges.elements) {
// console.log('program/defines or buffers changed, rebuild vaos') // console.log('program/defines or buffers changed, rebuild vaos')
Object.keys(RenderVariantDefines).forEach(k => { Object.keys(RenderVariantDefines).forEach(k => {
deleteVertexArray(ctx, vertexArrays[k]) deleteVertexArray(ctx, vertexArrays[k])
...@@ -186,14 +202,18 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S ...@@ -186,14 +202,18 @@ export function createRenderItem(ctx: Context, drawMode: DrawMode, shaderCode: S
}) })
} }
valueChanges.textures = false
Object.keys(textureValues).forEach(k => { Object.keys(textureValues).forEach(k => {
const value = textureValues[k] const value = textureValues[k]
if (value.ref.version !== versions[k]) { if (value.ref.version !== versions[k]) {
// console.log('texture version changed, uploading image', k) // console.log('texture version changed, uploading image', k)
textures[k].load(value.ref.value) textures[k].load(value.ref.value)
versions[k] = value.ref.version versions[k] = value.ref.version
valueChanges.textures = true
} }
}) })
return valueChanges
}, },
destroy: () => { destroy: () => {
if (!destroyed) { if (!destroyed) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment