Skip to content

Commit

Permalink
More cleanups and fixes for attachmentState
Browse files Browse the repository at this point in the history
  • Loading branch information
magcius committed Nov 5, 2019
1 parent 7e9c053 commit f3c3632
Show file tree
Hide file tree
Showing 34 changed files with 396 additions and 251 deletions.
9 changes: 7 additions & 2 deletions src/BanjoKazooie/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import * as Viewer from '../viewer';
import { DeviceProgram } from "../Program";
import { Texture, getImageFormatString, Vertex, DrawCall, GeometryMode, OtherModeH_CycleType, getTextFiltFromOtherModeH } from "./f3dex";
import { GfxDevice, GfxTextureDimension, GfxFormat, GfxTexture, GfxSampler, GfxWrapMode, GfxTexFilterMode, GfxMipFilterMode, GfxBuffer, GfxBufferUsage, GfxInputLayout, GfxInputState, GfxVertexAttributeDescriptor, GfxVertexBufferFrequency, GfxBindingLayoutDescriptor, GfxBlendMode, GfxBlendFactor, GfxCullMode, GfxMegaStateDescriptor, GfxProgram, GfxBufferFrequencyHint } from "../gfx/platform/GfxPlatform";
import { GfxDevice, GfxTextureDimension, GfxFormat, GfxTexture, GfxSampler, GfxWrapMode, GfxTexFilterMode, GfxMipFilterMode, GfxBuffer, GfxBufferUsage, GfxInputLayout, GfxInputState, GfxVertexAttributeDescriptor, GfxVertexBufferFrequency, GfxBindingLayoutDescriptor, GfxBlendMode, GfxBlendFactor, GfxCullMode, GfxMegaStateDescriptor, GfxProgram, GfxBufferFrequencyHint, GfxInputLayoutBufferDescriptor } from "../gfx/platform/GfxPlatform";
import { makeStaticDataBuffer } from '../gfx/helpers/BufferHelpers';
import { assert, nArray, align } from '../util';
import { fillMatrix4x4, fillMatrix4x3, fillMatrix4x2 } from '../gfx/helpers/UniformBufferHelpers';
Expand Down Expand Up @@ -349,13 +349,18 @@ export class N64Data {
{ location: F3DEX_Program.a_Color , bufferIndex: 0, format: GfxFormat.F32_RGBA, bufferByteOffset: 6*0x04, },
];

const vertexBufferDescriptors: GfxInputLayoutBufferDescriptor[] = [
{ byteStride: 10*0x04, frequency: GfxVertexBufferFrequency.PER_VERTEX, },
];

this.inputLayout = device.createInputLayout({
indexBufferFormat: GfxFormat.U32_R,
vertexBufferDescriptors,
vertexAttributeDescriptors,
});

this.inputState = device.createInputState(this.inputLayout, [
{ buffer: this.vertexBuffer, byteOffset: 0, byteStride: 10*0x04, frequency: GfxVertexBufferFrequency.PER_VERTEX, },
{ buffer: this.vertexBuffer, byteOffset: 0, },
], { buffer: this.indexBuffer, byteOffset: 0 });
}

Expand Down
173 changes: 85 additions & 88 deletions src/DarkSouls/render.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

import { FLVER, VertexInputSemantic, Material, Primitive, Batch, VertexAttribute } from "./flver";
import { GfxDevice, GfxInputState, GfxInputLayout, GfxFormat, GfxVertexAttributeDescriptor, GfxVertexBufferFrequency, GfxBufferUsage, GfxBuffer, GfxVertexBufferDescriptor, GfxBindingLayoutDescriptor, GfxBlendMode, GfxBlendFactor, GfxCullMode, GfxMegaStateDescriptor, GfxProgram, GfxSampler, GfxTexFilterMode, GfxMipFilterMode, GfxWrapMode, GfxIndexBufferDescriptor } from "../gfx/platform/GfxPlatform";
import { GfxDevice, GfxInputState, GfxInputLayout, GfxFormat, GfxVertexAttributeDescriptor, GfxVertexBufferFrequency, GfxBufferUsage, GfxBuffer, GfxVertexBufferDescriptor, GfxBindingLayoutDescriptor, GfxBlendMode, GfxBlendFactor, GfxCullMode, GfxMegaStateDescriptor, GfxProgram, GfxSampler, GfxTexFilterMode, GfxMipFilterMode, GfxWrapMode, GfxIndexBufferDescriptor, GfxInputLayoutBufferDescriptor } from "../gfx/platform/GfxPlatform";
import ArrayBufferSlice from "../ArrayBufferSlice";
import { coalesceBuffer, GfxCoalescedBuffer } from "../gfx/helpers/BufferHelpers";
import { convertToTriangleIndexBuffer, GfxTopology, getTriangleIndexCountForTopologyIndexCount } from "../gfx/helpers/TopologyHelpers";
Expand All @@ -20,6 +20,7 @@ import { MathConstants } from "../MathHelpers";
import { MTD, MTDTexture } from './mtd';
import { interactiveVizSliderSelect } from '../DebugJunk';
import { setAttachmentStateSimple } from "../gfx/helpers/GfxMegaStateDescriptorHelpers";
import { GfxRenderCache } from "../gfx/render/GfxRenderCache";

function shouldRenderPrimitive(primitive: Primitive): boolean {
return primitive.flags === 0;
Expand Down Expand Up @@ -49,17 +50,94 @@ function isLODModel(name: string): boolean {
return lodModels.includes(name);
}

function translateLocation(attr: VertexAttribute): number {
switch (attr.semantic) {
case VertexInputSemantic.Position: return DKSProgram.a_Position;
case VertexInputSemantic.Color: return DKSProgram.a_Color;
case VertexInputSemantic.UV: {
if (attr.index === 0)
return DKSProgram.a_TexCoord0;
else if (attr.index === 1)
return DKSProgram.a_TexCoord1;
else
throw "whoops";
}
case VertexInputSemantic.Normal: return DKSProgram.a_Normal;
case VertexInputSemantic.Tangent: return DKSProgram.a_Tangent;
case VertexInputSemantic.Bitangent: return DKSProgram.a_Bitangent;
default: return -1;
}
}

function translateDataType(dataType: number): GfxFormat {
switch (dataType) {
case 17:
// Bone indices -- four bytes.
return GfxFormat.U8_RGBA_NORM;
case 19:
// Colors and normals -- four bytes.
return GfxFormat.U8_RGBA_NORM;
case 21:
// One set of UVs -- two shorts.
return GfxFormat.S16_RG;
case 22:
// Two sets of UVs -- four shorts.
return GfxFormat.S16_RGBA;
case 26:
// Bone weight -- four shorts.
return GfxFormat.S16_RGBA_NORM;
case 2:
case 18:
case 20:
case 23:
case 24:
case 25:
// Everything else -- three floats.
return GfxFormat.F32_RGBA;
default:
throw "whoops";
}
}

class BatchData {
public inputLayout: GfxInputLayout;
public inputStates: GfxInputState[] = [];

constructor(device: GfxDevice, flverData: FLVERData, public batch: Batch, vertexBuffer: GfxCoalescedBuffer, indexBuffers: GfxCoalescedBuffer[]) {
constructor(device: GfxDevice, cache: GfxRenderCache, flverData: FLVERData, public batch: Batch, vertexBuffer: GfxCoalescedBuffer, indexBuffers: GfxCoalescedBuffer[]) {
const flverInputState = flverData.flver.inputStates[batch.inputStateIndex];
const buffers: GfxVertexBufferDescriptor[] = [{ buffer: vertexBuffer.buffer, byteOffset: vertexBuffer.wordOffset * 0x04, byteStride: flverInputState.vertexSize, frequency: GfxVertexBufferFrequency.PER_VERTEX, }];
const flverInputLayout = flverData.flver.inputLayouts[flverInputState.inputLayoutIndex];
const buffers: GfxVertexBufferDescriptor[] = [{ buffer: vertexBuffer.buffer, byteOffset: vertexBuffer.wordOffset * 0x04 }];

const vertexAttributeDescriptors: GfxVertexAttributeDescriptor[] = [];

for (let j = 0; j < flverInputLayout.vertexAttributes.length; j++) {
const vertexAttributes = flverInputLayout.vertexAttributes[j];
const location = translateLocation(vertexAttributes);
if (location < 0)
continue;

vertexAttributeDescriptors.push({
location,
format: translateDataType(vertexAttributes.dataType),
bufferByteOffset: vertexAttributes.offset,
bufferIndex: 0,
});
}

const vertexBufferDescriptors: GfxInputLayoutBufferDescriptor[] = [
{ byteStride: flverInputState.vertexSize, frequency: GfxVertexBufferFrequency.PER_VERTEX, },
];

this.inputLayout = cache.createInputLayout(device, {
indexBufferFormat: GfxFormat.U16_R,
vertexAttributeDescriptors,
vertexBufferDescriptors,
});

for (let j = 0; j < batch.primitiveIndexes.length; j++) {
const coaIndexBuffer = assertExists(indexBuffers.shift());
const indexBuffer: GfxIndexBufferDescriptor = { buffer: coaIndexBuffer.buffer, byteOffset: coaIndexBuffer.wordOffset * 0x04 };
const inputState = device.createInputState(flverData.inputLayouts[flverInputState.inputLayoutIndex], buffers, indexBuffer);
const inputState = device.createInputState(this.inputLayout, buffers, indexBuffer);
this.inputStates.push(inputState);
}
}
Expand All @@ -71,38 +149,12 @@ class BatchData {
}

export class FLVERData {
public inputLayouts: GfxInputLayout[] = [];
public batchData: BatchData[] = [];
public gfxSampler: GfxSampler;
private indexBuffer: GfxBuffer;
private vertexBuffer: GfxBuffer;

constructor(device: GfxDevice, public flver: FLVER) {
for (let i = 0; i < flver.inputLayouts.length; i++) {
const inputLayout = flver.inputLayouts[i];

const vertexAttributeDescriptors: GfxVertexAttributeDescriptor[] = [];

for (let j = 0; j < inputLayout.vertexAttributes.length; j++) {
const vertexAttributes = inputLayout.vertexAttributes[j];
const location = this.translateLocation(vertexAttributes);
if (location < 0)
continue;

vertexAttributeDescriptors.push({
location,
format: this.translateDataType(vertexAttributes.dataType),
bufferByteOffset: vertexAttributes.offset,
bufferIndex: 0,
});
}

this.inputLayouts[i] = device.createInputLayout({
indexBufferFormat: GfxFormat.U16_R,
vertexAttributeDescriptors,
});
}

constructor(device: GfxDevice, cache: GfxRenderCache, public flver: FLVER) {
const vertexBufferDatas: ArrayBufferSlice[] = [];
const indexBufferDatas: ArrayBufferSlice[] = [];
for (let i = 0; i < flver.inputStates.length; i++) {
Expand All @@ -128,7 +180,7 @@ export class FLVERData {
for (let i = 0; i < flver.batches.length; i++) {
const batch = flver.batches[i];
const coaVertexBuffer = vertexBuffers[batch.inputStateIndex];
const batchData = new BatchData(device, this, batch, coaVertexBuffer, indexBuffers);
const batchData = new BatchData(device, cache, this, batch, coaVertexBuffer, indexBuffers);
this.batchData.push(batchData);
}

Expand All @@ -143,62 +195,11 @@ export class FLVERData {
});
}

private translateLocation(attr: VertexAttribute): number {
switch (attr.semantic) {
case VertexInputSemantic.Position: return DKSProgram.a_Position;
case VertexInputSemantic.Color: return DKSProgram.a_Color;
case VertexInputSemantic.UV: {
if (attr.index === 0)
return DKSProgram.a_TexCoord0;
else if (attr.index === 1)
return DKSProgram.a_TexCoord1;
else
throw "whoops";
}
case VertexInputSemantic.Normal: return DKSProgram.a_Normal;
case VertexInputSemantic.Tangent: return DKSProgram.a_Tangent;
case VertexInputSemantic.Bitangent: return DKSProgram.a_Bitangent;
default: return -1;
}
}

private translateDataType(dataType: number): GfxFormat {
switch (dataType) {
case 17:
// Bone indices -- four bytes.
return GfxFormat.U8_RGBA_NORM;
case 19:
// Colors and normals -- four bytes.
return GfxFormat.U8_RGBA_NORM;
case 21:
// One set of UVs -- two shorts.
return GfxFormat.S16_RG;
case 22:
// Two sets of UVs -- four shorts.
return GfxFormat.S16_RGBA;
case 26:
// Bone weight -- four shorts.
return GfxFormat.S16_RGBA_NORM;
case 2:
case 18:
case 20:
case 23:
case 24:
case 25:
// Everything else -- three floats.
return GfxFormat.F32_RGBA;
default:
throw "whoops";
}
}

public destroy(device: GfxDevice): void {
device.destroyBuffer(this.vertexBuffer);
device.destroyBuffer(this.indexBuffer);
device.destroySampler(this.gfxSampler);

for (let i = 0; i < this.inputLayouts.length; i++)
device.destroyInputLayout(this.inputLayouts[i]);
for (let i = 0; i < this.batchData.length; i++)
this.batchData[i].destroy(device);
}
Expand Down Expand Up @@ -704,12 +705,8 @@ class BatchInstance {
if (!shouldRenderPrimitive(primitive))
continue;

const inputState = this.flverData.flver.inputStates[this.batchData.batch.inputStateIndex];
const gfxInputState = this.batchData.inputStates[j];
const gfxInputLayout = this.flverData.inputLayouts[inputState.inputLayoutIndex];

const renderInst = renderInstManager.pushRenderInst();
renderInst.setInputLayoutAndState(gfxInputLayout, gfxInputState);
renderInst.setInputLayoutAndState(this.batchData.inputLayout, this.batchData.inputStates[j]);
renderInst.setMegaStateFlags(this.megaState);
if (primitive.cullMode)
renderInst.getMegaStateFlags().cullMode = GfxCullMode.BACK;
Expand Down
14 changes: 10 additions & 4 deletions src/DarkSouls/scenes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import * as MTD from "./mtd";
import { GfxRenderInstManager } from "../gfx/render/GfxRenderer";
import { GfxRenderDynamicUniformBuffer } from "../gfx/render/GfxRenderDynamicUniformBuffer";
import { BasicRenderTarget, standardFullClearRenderPassDescriptor } from "../gfx/helpers/RenderTargetHelpers";
import { GfxRenderCache } from "../gfx/render/GfxRenderCache";

interface CRG1Arc {
Files: { [filename: string]: ArrayBufferSlice };
Expand Down Expand Up @@ -60,6 +61,10 @@ class DKSRenderer implements Viewer.SceneGfx {
this.uniformBuffer = new GfxRenderDynamicUniformBuffer(device);
}

public getCache(): GfxRenderCache {
return this.renderInstManager.gfxRenderCache;
}

public createPanels(): Panel[] {
const layerPanel = new LayerPanel(this.msbRenderers[0].flverInstances);
return [layerPanel];
Expand Down Expand Up @@ -102,10 +107,10 @@ class DKSRenderer implements Viewer.SceneGfx {
export class ModelHolder {
public flverData: (FLVERData | undefined)[] = [];

constructor(device: GfxDevice, flver: (FLVER.FLVER | undefined)[]) {
constructor(device: GfxDevice, cache: GfxRenderCache, flver: (FLVER.FLVER | undefined)[]) {
for (let i = 0; i < flver.length; i++)
if (flver[i] !== undefined)
this.flverData[i] = new FLVERData(device, flver[i]!);
this.flverData[i] = new FLVERData(device, cache, flver[i]!);
}

public destroy(device: GfxDevice): void {
Expand Down Expand Up @@ -203,7 +208,7 @@ class DKSSceneDesc implements Viewer.SceneDesc {
}
}

const modelHolder = new ModelHolder(device, flver);
const modelHolder = new ModelHolder(device, renderer.getCache(), flver);

const mapKey = this.id.slice(0, 3); // "m10"
this.loadTextureBHD(device, textureHolder, resourceSystem, `/map/${mapKey}/${mapKey}_0000`);
Expand Down Expand Up @@ -305,7 +310,8 @@ class DKSEverySceneDesc implements Viewer.SceneDesc {
}
}

const modelHolder = new ModelHolder(device, flver);
const cache = renderer.getCache();
const modelHolder = new ModelHolder(device, cache, flver);

const mapKey = mapID.slice(0, 3); // "m10"
this.loadTextureBHD(device, textureHolder, resourceSystem, `/map/${mapKey}/${mapKey}_0000`);
Expand Down
12 changes: 8 additions & 4 deletions src/DarkSoulsCollisionData/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import * as Viewer from '../viewer';
import * as UI from '../ui';

import * as IV from './iv';
import { GfxDevice, GfxBufferUsage, GfxBuffer, GfxInputState, GfxFormat, GfxInputLayout, GfxProgram, GfxBindingLayoutDescriptor, GfxRenderPass, GfxBindings, GfxHostAccessPass, GfxVertexBufferFrequency, GfxVertexAttributeDescriptor } from '../gfx/platform/GfxPlatform';
import { GfxDevice, GfxBufferUsage, GfxBuffer, GfxInputState, GfxFormat, GfxInputLayout, GfxProgram, GfxBindingLayoutDescriptor, GfxRenderPass, GfxBindings, GfxHostAccessPass, GfxVertexBufferFrequency, GfxVertexAttributeDescriptor, GfxInputLayoutBufferDescriptor } from '../gfx/platform/GfxPlatform';
import { fillColor, fillMatrix4x4 } from '../gfx/helpers/UniformBufferHelpers';
import { BasicRenderTarget, standardFullClearRenderPassDescriptor } from '../gfx/helpers/RenderTargetHelpers';
import { makeStaticDataBuffer } from '../gfx/helpers/BufferHelpers';
Expand Down Expand Up @@ -114,8 +114,8 @@ class Chunk {
this.nrmBuffer = makeStaticDataBuffer(device, GfxBufferUsage.VERTEX, nrmData.buffer);

this.inputState = device.createInputState(inputLayout, [
{ buffer: this.posBuffer, byteOffset: 0, byteStride: 0, frequency: GfxVertexBufferFrequency.PER_VERTEX, },
{ buffer: this.nrmBuffer, byteOffset: 0, byteStride: 0, frequency: GfxVertexBufferFrequency.PER_VERTEX, },
{ buffer: this.posBuffer, byteOffset: 0, },
{ buffer: this.nrmBuffer, byteOffset: 0, },
], null);

this.numVertices = chunk.indexData.length;
Expand Down Expand Up @@ -190,8 +190,12 @@ export class Scene implements Viewer.SceneGfx {
{ location: IVProgram.a_Position, bufferIndex: 0, bufferByteOffset: 0, format: GfxFormat.F32_RGB, },
{ location: IVProgram.a_Normal, bufferIndex: 1, bufferByteOffset: 0, format: GfxFormat.F32_RGB, },
];
const vertexBufferDescriptors: GfxInputLayoutBufferDescriptor[] = [
{ byteStride: 0, frequency: GfxVertexBufferFrequency.PER_VERTEX, },
{ byteStride: 0, frequency: GfxVertexBufferFrequency.PER_VERTEX, },
];
const indexBufferFormat: GfxFormat | null = null;
this.inputLayout = device.createInputLayout({ vertexAttributeDescriptors, indexBufferFormat });
this.inputLayout = device.createInputLayout({ vertexAttributeDescriptors, vertexBufferDescriptors, indexBufferFormat });

this.ivRenderers = this.ivs.map((iv) => {
return new IVRenderer(device, iv, this.inputLayout);
Expand Down
13 changes: 9 additions & 4 deletions src/Fez/ArtObjectData.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

import { GfxTexture, GfxDevice, GfxFormat, GfxInputLayout, GfxInputState, GfxBuffer, GfxBufferUsage, GfxVertexAttributeDescriptor, GfxVertexBufferFrequency, GfxSampler, GfxWrapMode, GfxTexFilterMode, GfxMipFilterMode } from "../gfx/platform/GfxPlatform";
import { GfxTexture, GfxDevice, GfxFormat, GfxInputLayout, GfxInputState, GfxBuffer, GfxBufferUsage, GfxVertexAttributeDescriptor, GfxVertexBufferFrequency, GfxSampler, GfxWrapMode, GfxTexFilterMode, GfxMipFilterMode, GfxInputLayoutBufferDescriptor } from "../gfx/platform/GfxPlatform";
import { vec3, vec2 } from "gl-matrix";
import { makeStaticDataBuffer } from "../gfx/helpers/BufferHelpers";
import { makeTextureFromImageData } from "./Texture";
Expand Down Expand Up @@ -60,14 +60,19 @@ export class ArtObjectData {
{ location: 0, bufferIndex: 0, format: GfxFormat.F32_RGB, bufferByteOffset: 0, }, // Position
{ location: 1, bufferIndex: 1, format: GfxFormat.F32_RG, bufferByteOffset: 0, }, // TexCoord
];
const vertexBufferDescriptors: GfxInputLayoutBufferDescriptor[] = [
{ byteStride: 3*0x04, frequency: GfxVertexBufferFrequency.PER_VERTEX, },
{ byteStride: 2*0x04, frequency: GfxVertexBufferFrequency.PER_VERTEX, },
];
this.inputLayout = device.createInputLayout({
indexBufferFormat: GfxFormat.U32_R,
vertexAttributeDescriptors,
vertexBufferDescriptors,
});
this.inputState = device.createInputState(this.inputLayout, [
{ buffer: this.vertexBuffer, byteOffset: 0, byteStride: 3*0x04, frequency: GfxVertexBufferFrequency.PER_VERTEX, },
{ buffer: this.texcoordBuffer, byteOffset: 0, byteStride: 2*0x04, frequency: GfxVertexBufferFrequency.PER_VERTEX, }],
{ buffer: this.indexBuffer, byteOffset: 0 });
{ buffer: this.vertexBuffer, byteOffset: 0, },
{ buffer: this.texcoordBuffer, byteOffset: 0 }],
{ buffer: this.indexBuffer, byteOffset: 0 });

this.texture = makeTextureFromImageData(device, texImageData);
this.sampler = device.createSampler({
Expand Down
Loading

0 comments on commit f3c3632

Please sign in to comment.