From b15ce90fbb55ac79036e35e9ab7a7fde4cfb298f Mon Sep 17 00:00:00 2001 From: Jan Date: Fri, 15 Nov 2019 14:47:45 +0100 Subject: [PATCH] ZoneCodeGenerator: Add reusable statement for commands to be able to tell the generator that a member can be a fastfile offset and not nessecarly a following pointer --- src/ZoneCode/Game/T6/T6_Commands.txt | 37 +++++++++-- .../Domain/Information/MemberInformation.cs | 2 + .../CommandFile/Impl/CommandParserState.cs | 1 + .../Parsing/CommandFile/Tests/TestReusable.cs | 63 +++++++++++++++++++ 4 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestReusable.cs diff --git a/src/ZoneCode/Game/T6/T6_Commands.txt b/src/ZoneCode/Game/T6/T6_Commands.txt index 0b06b60b..e148b099 100644 --- a/src/ZoneCode/Game/T6/T6_Commands.txt +++ b/src/ZoneCode/Game/T6/T6_Commands.txt @@ -177,11 +177,17 @@ set count u::frames::frames size + 1; use XModel; set string name; set scriptstring boneNames; +set reusable boneNames; set count boneNames numBones; +set reusable parentList; set count parentList numBones - numRootBones; +set reusable quats; set count quats numBones - numRootBones; +set reusable trans; set count trans numBones - numRootBones; +set reusable partClassification; set count partClassification numBones; +set reusable baseMat; set count baseMat numBones; set count surfs numsurfs; set count materialHandles numsurfs; @@ -193,9 +199,12 @@ set count collmaps numCollmaps; // XSurface use XSurface; set condition verts0 !(flags & 1); +set reusable verts0; set count verts0 vertCount; set count vb0 0; +set reusable vertList; set count vertList vertListCount; +set reusable triIndices; set count triIndices triCount; set count indexBuffer 0; reorder: @@ -206,10 +215,12 @@ reorder: // XSurfaceVertexInfo use XSurfaceVertexInfo; +set reusable vertsBlend; set count vertsBlend vertCount[0] + 3 * vertCount[1] + 5 * vertCount[2] + 7 * vertCount[3]; +set reusable tensionData; set count tensionData vertCount[0] + 3 * vertCount[1] + 5 * vertCount[2] @@ -233,24 +244,33 @@ set count Collmap::geomList 1; set count PhysGeomList::geoms count; // PhysGeomInfo -set count PhysGeomInfo::brush 1; +use PhysGeomInfo; +set reusable brush; +set count brush 1; // BrushWrapper use BrushWrapper; set count sides numsides; +set reusable verts; set count verts numverts; +set reusable planes; set count planes numsides; // cbrushside_t -set count cbrushside_t::plane 1; +use cbrushside_t; +set reusable plane; +set count plane 1; // ========================================= // Material // ========================================= use Material; set string info::name; +set reusable textureTable; set count textureTable textureCount; +set reusable constantTable; set count constantTable constantCount; +set reusable stateBitsTable; set count stateBitsTable stateBitsCount; // GfxStateBits @@ -262,7 +282,9 @@ set count rasterizerState 0; // ========================================= // MaterialTechniqueSet // ========================================= -set string MaterialTechniqueSet::name; +use MaterialTechniqueSet; +set string name; +set reusable techniques; // MaterialTechnique use MaterialTechnique; @@ -275,6 +297,9 @@ reorder: // MaterialPass use MaterialPass; set count args perPrimArgCount + perObjArgCount + stableArgCount; +set reusable vertexShader; +set reusable vertexDecl; +set reusable pixelShader; reorder: vertexShader vertexDecl @@ -306,6 +331,7 @@ set count GfxPixelShaderLoadDef::program programSize; use MaterialShaderArgument; //set condition u::literalConst type == MTL_ARG_LITERAL_VERTEX_CONST || type == MTL_ARG_LITERAL_PIXEL_CONST; //set condition u::literalConst type == 1 || type == 7; +set reusable u::literalConst; set count u::literalConst 1; // ========================================= @@ -318,7 +344,9 @@ reorder: texture; // GfxTexture -set condition GfxTexture::loadDef always; +use GfxTexture; +set reusable loadDef; +set condition loadDef always; // GfxImageLoadDef set arraysize GfxImageLoadDef::data resourceSize; @@ -337,6 +365,7 @@ set count scriptIdLookups scriptIdLookupCount; // SndAliasList use SndAliasList; set string name; +set reusable head; set count head count; // SndAlias diff --git a/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs b/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs index 2801cae6..dd3f6414 100644 --- a/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs +++ b/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs @@ -11,6 +11,7 @@ namespace ZoneCodeGenerator.Domain.Information public Variable Member { get; set; } public bool IsString { get; set; } public bool IsScriptString { get; set; } + public bool IsReusable { get; set; } public IEvaluation Condition { get; set; } public MemberComputations Computations => new MemberComputations(this); @@ -21,6 +22,7 @@ namespace ZoneCodeGenerator.Domain.Information StructureType = structureType; IsString = false; IsScriptString = false; + IsReusable = false; Condition = null; } diff --git a/src/ZoneCodeGenerator/Parsing/CommandFile/Impl/CommandParserState.cs b/src/ZoneCodeGenerator/Parsing/CommandFile/Impl/CommandParserState.cs index b56fb4ec..ec3a4b58 100644 --- a/src/ZoneCodeGenerator/Parsing/CommandFile/Impl/CommandParserState.cs +++ b/src/ZoneCodeGenerator/Parsing/CommandFile/Impl/CommandParserState.cs @@ -21,6 +21,7 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.Impl new TestCount(), new TestGame(), new TestReorder(), + new TestReusable(), new TestScriptString(), new TestString(), new TestUse() diff --git a/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestReusable.cs b/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestReusable.cs new file mode 100644 index 00000000..9cb0534b --- /dev/null +++ b/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestReusable.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ZoneCodeGenerator.Domain; +using ZoneCodeGenerator.Parsing.Matching; +using ZoneCodeGenerator.Parsing.Matching.Matchers; +using ZoneCodeGenerator.Parsing.Testing; + +namespace ZoneCodeGenerator.Parsing.CommandFile.Tests +{ + class TestReusable : AbstractTokenTest + { + private const string MemberTypeNameToken = "name"; + + private static readonly TokenMatcher[] matchers = { + new MatcherLiteral("set"), + new MatcherLiteral("reusable"), + new MatcherTypename().WithName(MemberTypeNameToken), + new MatcherLiteral(";") + }; + + public TestReusable() : base(matchers) + { + + } + + protected override void ProcessMatch(ICommandParserState state) + { + var typeName = NextMatch(MemberTypeNameToken); + var typeNameParts = typeName.Split(new[] { "::" }, StringSplitOptions.None); + + if (state.DataTypeInUse != null && + state.GetMembersFromParts(typeNameParts, state.DataTypeInUse, out var memberList)) + { + // Do nothing + } + else if (state.GetTypenameAndMembersFromParts(typeNameParts, out _, out memberList)) + { + // Do nothing + } + else + { + throw new TestFailedException($"Could not find type '{typeName}'."); + } + + if (memberList == null || !memberList.Any()) + { + throw new TestFailedException("Need to specify a member when trying to set to a string."); + } + + var lastMember = memberList.Last(); + + if (!lastMember.Computations.IsNonEmbeddedReference) + { + throw new TestFailedException($"Specified member '{lastMember.Member.Name}' is not a pointer reference and therefore cannot be reusable."); + } + + lastMember.IsReusable = true; + } + } +}