12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969 |
- //
- // The graphics engine GXScene
- //
- unit Formatx.m3DS;
- (*
- Implementation of an universal 3DS file reader (and writer). This is the main file of the
- 3DS import library. Currently only loading of 3DS files (Mesh files * .3ds, Project files * .prj
- and Material files * .mli) is supported.
- Note: Be careful when using LoadFromStream, because chunk data (in opposition to the
- chunk structure) will be loaded on demand, i.e. when it is needed. Therefore the
- passed stream must be available during load.
- LoadFromStream does not make a copy of the passed stream, but keeps a reference
- which must stay valid either during the entire lifetime of TFile3DS or at least
- 'til all chunks have been read (by accessing them all once).
- *)
- interface
- {$I Stage.Defines.inc}
- {$ALIGN ON}
- {$MINENUMSIZE 4}
- {$RANGECHECKS OFF}
- uses
- System.Classes,
- System.SysUtils,
- Formatx.m3DSTypes;
- type
- TFile3DS = class;
- TLoadProgress = procedure(StreamPos, StreamMax: Longint) of object;
- // Progress : TProgressBar;
- //
- // This allows to use something like that:
- //
- // procedure TSomeForm.CreateForm(Sender: TObject);
- // begin
- // ....
- // 3DSReader.OnProgress := LoadProgress;
- // ....
- // end;
- // procedure TSomeForm.LoadProgress(StreamPos, StreamMax : Longint);
- // begin
- // if StreamMax <> 0 then
- // Progress.MaxValue := StreamMax;
- // Progress.Position := StreamPos;
- // end;
- // ----- support classes -----
- // All structure data of a 3DS file is actually held in TFile3DS.FDatabase as a
- // tree with lots of links across the various chunks.
- // For convinience and speed the data of the chunks is collected into some
- // special structures (FMaterialList etc.) and presented to the user
- // by the following helper classes:
- TMaterialList = class
- private
- FOwner: TFile3DS;
- FLocalList: TList;
- function GetCount: Integer;
- function GetMaterial(Index: Integer): PMaterial3DS;
- function GetMaterialByName(const Name: String): PMaterial3DS;
- public
- constructor Create(AOwner: TFile3DS); virtual;
- destructor Destroy; override;
- procedure ClearList;
- property Count: Integer read GetCount;
- property Material[Index: Integer]: PMaterial3DS read GetMaterial; default;
- property MaterialByName[const Name: String]: PMaterial3DS read GetMaterialByName;
- end;
- TObjectList = class
- private
- FOwner: TFile3DS;
- FMeshList,
- FOmniList,
- FSpotList,
- FCameraList: TList;
- function GetCamera(Index: Integer): PCamera3DS;
- function GetCamCount: Integer;
- function GetMeshObjectCount: Integer;
- function GetMesh(Index: Integer): PMesh3DS;
- function GetOmniCount: Integer;
- function GetOmniLight(Index: Integer): PLight3DS;
- function GetSpotCount: Integer;
- function GetSpotLight(Index: Integer): PLight3DS;
- public
- constructor Create(AOwner: TFile3DS); virtual;
- destructor Destroy; override;
- procedure ClearLists;
- property CameraCount: Integer read GetCamCount;
- property MeshCount: Integer read GetMeshObjectCount;
- property OmniLightCount: Integer read GetOmniCount;
- property SpotLightCount: Integer read GetSpotCount;
- property Mesh[Index: Integer]: PMesh3DS read GetMesh;
- property Camera[Index: Integer]: PCamera3DS read GetCamera;
- property OmniLight[Index: Integer]: PLight3DS read GetOmniLight;
- property SpotLight[Index: Integer]: PLight3DS read GetSpotLight;
- end;
- TKeyFramer = class
- private
- FOwner: TFile3DS;
- FMeshMotionList,
- FOmniMotionList,
- FSpotMotionList,
- FCameraMotionList: TList;
- FAmbientMotion: PKFAmbient3DS;
- function GetAmbientMotion: PKFAmbient3DS;
- function GetCameraMotion(Index: Integer): PKFCamera3DS;
- function GetCamMotionCount: Integer;
- function GetKFSets: TKFSets3DS;
- function GetMeshMotionCount: Integer;
- function GetMeshMotion(Index: Integer): PKFMesh3DS;
- function GetOmniMotionCount: Integer;
- function GetOmniLightMotion(Index: Integer): PKFOmni3DS;
- function GetSpotMotionCount: Integer;
- function GetSpotLightMotion(Index: Integer): PKFSpot3DS;
- public
- constructor Create(AOwner: TFile3DS); virtual;
- destructor Destroy; override;
- procedure ClearLists;
- property AmbientLightMotion: PKFAmbient3DS read GetAmbientMotion;
- property CameraMotionCount: Integer read GetCamMotionCount;
- property MeshMotionCount: Integer read GetMeshMotionCount;
- property OmniLightMotionCount: Integer read GetOmniMotionCount;
- property SpotLightMotionCount: Integer read GetSpotMotionCount;
- property MeshMotion[Index: Integer]: PKFMesh3DS read GetMeshMotion; default;
- property CameraMotion[Index: Integer]: PKFCamera3DS read GetCameraMotion;
- property OmniLightMotion[Index: Integer]: PKFOmni3DS read GetOmniLightMotion;
- property Settings: TKFSets3DS read GetKFSets;
- property SpotLightMotion[Index: Integer]: PKFSpot3DS read GetSpotLightMotion;
- end;
- (* The main class that supplies the user with all available data
- from a specific 3DS file. The data is currently read only, but the class might be
- finished sometime later... *)
- TFile3DS = class
- private
- FNodeList: PNodeList;
- FDatabase: TDatabase3DS;
- FStream: TStream;
- FOwnStream: Boolean;
- FMaterialList: TMaterialList;
- FObjectList: TObjectList;
- FKeyFramer: TKeyFramer;
- FFileName: String;
- FOnLoadProgress: TLoadProgress;
- function GetAtmosphereData: TAtmosphere3DS;
- function GetBackgroundData: TBackground3DS;
- function GetDatabaseType: TDBType3DS;
- function GetMeshSettings: TMeshSet3DS;
- function GetViewportData: TViewport3DS;
- function GetDatabaseRelease: TReleaseLevel;
- function GetMeshRelease: TReleaseLevel;
- protected
- procedure AddToNodeList(Chunk: PChunk3DS);
- procedure AssignParentNames;
- procedure CheckListNodeIDs;
- procedure CreateDatabase;
- function FindNodeByID(ID: SmallInt): PNodeList;
- function GetChunkNodeID(Chunk: PChunk3DS): SmallInt;
- procedure InitDatabase;
- function IsNode(Tag: Word): Boolean;
- procedure KFAddParentName(Chunk: PChunk3DS; const Name: String3DS);
- procedure MakeNode(var Node: PNodeList);
- procedure ParseDatabase;
- procedure ReadChildren(Parent: PChunk3DS);
- procedure ReadXDataEntryChildren(Parent: PChunk3DS);
- procedure ReleaseDatabase;
- procedure ReleaseNodeList;
- procedure ReleaseStream;
- public
- constructor Create; virtual;
- constructor CreateFromFile(const FileName: String); virtual;
- destructor Destroy; override;
- procedure ClearLists;
- // database methods
- procedure DumpDataBase(Strings: TStrings; DumpLevel: TDumpLevel);
- procedure LoadFromFile(const FileName: String);
- procedure LoadFromStream(const aStream: TStream);
- // basic access methods
- function ReadByte: Byte;
- function ReadCardinal: Cardinal;
- procedure ReadChunkData(Chunk: PChunk3DS);
- procedure ReadData(Size: Integer; Data: Pointer);
- function ReadDouble: Double;
- function ReadFace: TFace3DS;
- procedure ReadHeader(var ChunkType: Word; var ChunkSize: Cardinal);
- function ReadInteger: Integer;
- function ReadKeyHeader: TKeyHeader3DS;
- function ReadPoint: TPoint3DS;
- function ReadShort: SmallInt;
- function ReadSingle: Single;
- function ReadString: PChar3DS;
- function ReadTexVert: TTexVert3DS;
- function ReadTrackHeader: TTrackHeader3DS;
- function ReadWord: Word;
- procedure FinishHeader(StartPos, EndPos: Cardinal);
- function InitChunkData(Chunk: PChunk3DS): Pointer;
- procedure SeekChild(Chunk: PChunk3DS);
- procedure Skip(AValue: Integer);
- procedure WriteByte(AValue: Byte);
- procedure WriteCardinal(AValue: Cardinal);
- procedure WriteData(Size: Integer; Data: Pointer);
- procedure WriteDouble(AValue: Double);
- procedure WriteFace(const F: TFace3DS);
- procedure WriteFixedString(const AValue: String3DS; Len: Integer);
- procedure WriteHeader(ChunkType: Word; ChunkSize: Cardinal);
- procedure WriteInteger(AValue: Integer);
- procedure WriteKeyHeader(const K: TKeyHeader3DS);
- procedure WritePoint(const P: TPoint3DS);
- procedure WriteShort(AValue: SmallInt);
- procedure WriteSingle(AValue: Single);
- procedure WriteString(const AValue: String3DS);
- procedure WriteTexVertex(const T: TTexVert3DS);
- procedure WriteTrackHeader(const T: TTrackHeader3DS);
- procedure WriteWord(AValue: Word);
- property Atmosphere: TAtmosphere3DS read GetAtmosphereData;
- property Background: TBackground3DS read GetBackgroundData;
- property DatabaseRelease: TReleaseLevel read GetDatabaseRelease;
- property DatabaseType: TDBType3DS read GetDatabaseType;
- property FileName: String read FFileName;
- // this is only valid if loaded from a file
- property KeyFramer: TKeyFramer read FKeyFramer;
- property Materials: TMaterialList read FMaterialList;
- property MeshRelease: TReleaseLevel read GetMeshRelease;
- property MeshSettings: TMeshSet3DS read GetMeshSettings;
- property Objects: TObjectList read FObjectList;
- property Viewport: TViewport3DS read GetViewportData;
- property OnLoadProgress: TLoadProgress read FOnLoadProgress write FOnLoadProgress;
- end;
- implementation // -------------------------------------------------------------
- uses
- Formatx.m3DSConst,
- Formatx.m3DSUtils;
- function StrPasFree(P: PChar3DS): String;
- begin
- Result := string(StrPas(P));
- FreeMem(P);
- end;
- // ----------------- TMaterialList --------------------------------------------
- constructor TMaterialList.Create(AOwner: TFile3DS);
- begin
- FOwner := AOwner;
- FLocalList := TList.Create;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- destructor TMaterialList.Destroy;
- begin
- ClearList;
- FLocalList.Free;
- inherited Destroy;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TMaterialList.ClearList;
- var
- I: Integer;
- Mat: PMaterial3DS;
- begin
- for I := 0 to FLocalList.Count - 1 do
- if FLocalList[I] <> nil then
- begin
- Mat := FLocalList[I];
- // free structure data
- ReleaseMaterial(Mat);
- end;
- FLocalList.Count := 0;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TMaterialList.GetCount: Integer;
- begin
- if (FLocalList.Count = 0) and (FOwner.FDatabase.MatListDirty) then
- FLocalList.Count := GetMaterialCount(FOwner, FOwner.FDatabase);;
- Result := FLocalList.Count;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TMaterialList.GetMaterial(Index: Integer): PMaterial3DS;
- var
- NewEntry: PMaterial3DS;
- begin
- Result := nil;
- if Count = 0 then
- Exit; // force reading the list if it was modified
- if FLocalList[Index] = nil then
- begin
- New(NewEntry);
- FillChar(NewEntry^, SizeOf(NewEntry^), 0);
- NewEntry^ := GetMaterialByIndex(FOwner, FOwner.FDatabase, Index);
- FLocalList[Index] := NewEntry;
- end;
- Result := FLocalList[Index];
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TMaterialList.GetMaterialByName(const Name: String): PMaterial3DS;
- var
- Entry: PMaterial3DS;
- Index: Integer;
- begin
- Result := nil;
- for Index := 0 to Count - 1 do
- begin
- Entry := GetMaterial(Index);
- if Entry = nil then
- Continue;
- if CompareText(string(Entry.NameStr), Name) = 0 then
- begin
- Result := Entry;
- Break;
- end;
- end;
- end;
- // ----------------- TObjectList ---------------------------------------------------------------------------------------
- constructor TObjectList.Create(AOwner: TFile3DS);
- begin
- FOwner := AOwner;
- FMeshList := TList.Create;
- FOmniList := TList.Create;
- FSpotList := TList.Create;
- FCameraList := TList.Create;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- destructor TObjectList.Destroy;
- begin
- ClearLists;
- FMeshList.Free;
- FOmniList.Free;
- FSpotList.Free;
- FCameraList.Free;
- inherited Destroy;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TObjectList.ClearLists;
- var
- I: Integer;
- begin
- for I := 0 to FMeshList.Count - 1 do
- ReleaseMeshObj(FMeshList[I]);
- FMeshList.Clear;
- for I := 0 to FOmniList.Count - 1 do
- ReleaseLight(FOmniList[I]);
- FOmniList.Clear;
- for I := 0 to FSpotList.Count - 1 do
- ReleaseLight(FSpotList[I]);
- FSpotList.Clear;
- for I := 0 to FCameraList.Count - 1 do
- ReleaseCamera(FCameraList[I]);
- FCameraList.Clear;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TObjectList.GetCamera(Index: Integer): PCamera3DS;
- var
- NewEntry: PCamera3DS;
- begin
- Result := nil;
- if CameraCount = 0 then
- Exit; // force reading the list if it was modified
- if FCameraList[Index] = nil then
- begin
- New(NewEntry);
- FillChar(NewEntry^, SizeOf(NewEntry^), 0);
- NewEntry^ := GetCameraByIndex(FOwner, FOwner.FDatabase, Index);
- FCameraList[Index] := NewEntry;
- end;
- Result := FCameraList[Index];
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TObjectList.GetCamCount: Integer;
- begin
- if FCameraList.Count = 0 then
- FCameraList.Count := GetCameraCount(FOwner, FOwner.FDatabase);
- Result := FCameraList.Count;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TObjectList.GetMeshObjectCount: Integer;
- begin
- if FMeshList.Count = 0 then
- FMeshList.Count := GetMeshCount(FOwner, FOwner.FDatabase);
- Result := FMeshList.Count;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TObjectList.GetMesh(Index: Integer): PMesh3DS;
- var
- NewEntry: PMesh3DS;
- begin
- Result := nil;
- if MeshCount = 0 then
- Exit; // force reading the list if it was modified
- if FMeshList[Index] = nil then
- begin
- New(NewEntry);
- FillChar(NewEntry^, SizeOf(NewEntry^), 0);
- NewEntry^ := GetMeshByIndex(FOwner, FOwner.FDatabase, Index);
- FMeshList[Index] := NewEntry;
- end;
- Result := FMeshList[Index];
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TObjectList.GetOmniCount: Integer;
- begin
- if FOmniList.Count = 0 then
- FOmniList.Count := GetOmniLightCount(FOwner, FOwner.FDatabase);
- Result := FOmniList.Count;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TObjectList.GetOmniLight(Index: Integer): PLight3DS;
- var
- NewEntry: PLight3DS;
- begin
- Result := nil;
- if OmniLightCount = 0 then
- Exit; // force reading the list if it was modified
- if FOmniList[Index] = nil then
- begin
- New(NewEntry);
- FillChar(NewEntry^, SizeOf(NewEntry^), 0);
- NewEntry^ := GetOmniLightByIndex(FOwner, FOwner.FDatabase, Index);
- FOmniList[Index] := NewEntry;
- end;
- Result := FOmniList[Index];
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TObjectList.GetSpotCount: Integer;
- begin
- if FSpotList.Count = 0 then
- FSpotList.Count := GetSpotLightCount(FOwner, FOwner.FDatabase);
- Result := FSpotList.Count;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TObjectList.GetSpotLight(Index: Integer): PLight3DS;
- var
- NewEntry: PLight3DS;
- begin
- Result := nil;
- if SpotLightCount = 0 then
- Exit; // force reading the list if it was modified
- if FSpotList[Index] = nil then
- begin
- New(NewEntry);
- FillChar(NewEntry^, SizeOf(NewEntry^), 0);
- NewEntry^ := GetSpotLightByIndex(FOwner, FOwner.FDatabase, Index);
- FSpotList[Index] := NewEntry;
- end;
- Result := FSpotList[Index];
- end;
- // ----------------- TKeyFramer ----------------------------------------------------------------------------------------
- constructor TKeyFramer.Create(AOwner: TFile3DS);
- begin
- FOwner := AOwner;
- FMeshMotionList := TList.Create;
- FOmniMotionList := TList.Create;
- FSpotMotionList := TList.Create;
- FCameraMotionList := TList.Create;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- destructor TKeyFramer.Destroy;
- begin
- ClearLists;
- FMeshMotionList.Free;
- FOmniMotionList.Free;
- FSpotMotionList.Free;
- FCameraMotionList.Free;
- inherited;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TKeyFramer.GetAmbientMotion: PKFAmbient3DS;
- begin
- if FAmbientMotion = nil then
- begin
- New(FAmbientMotion);
- FillChar(FAmbientMotion^, SizeOf(FAmbientMotion^), 0);
- FAmbientMotion^ := GetAmbientLightMotion(FOwner, FOwner.FDatabase);
- end;
- Result := FAmbientMotion;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TKeyFramer.GetCameraMotion(Index: Integer): PKFCamera3DS;
- var
- NewEntry: PKFCamera3DS;
- begin
- Result := nil;
- if CameraMotionCount = 0 then
- Exit; // force reading the list if it was modified
- if FCameraMotionList[Index] = nil then
- begin
- New(NewEntry);
- FillChar(NewEntry^, SizeOf(NewEntry^), 0);
- NewEntry^ := GetCameraMotionByIndex(FOwner, FOwner.FDatabase, Index);
- FCameraMotionList[Index] := NewEntry;
- end;
- Result := FCameraMotionList[Index];
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TKeyFramer.GetCamMotionCount: Integer;
- begin
- if FCameraMotionList.Count = 0 then
- FCameraMotionList.Count := GetCameraNodeCount(FOwner, FOwner.FDatabase);
- Result := FCameraMotionList.Count;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TKeyFramer.GetKFSets: TKFSets3DS;
- begin
- Result := GetKFSettings(FOwner, FOwner.FDatabase);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TKeyFramer.GetMeshMotionCount: Integer;
- begin
- if FMeshMotionList.Count = 0 then
- FMeshMotionList.Count := GetObjectNodeCount(FOwner, FOwner.FDatabase);
- Result := FMeshMotionList.Count;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TKeyFramer.GetMeshMotion(Index: Integer): PKFMesh3DS;
- var
- NewEntry: PKFMesh3DS;
- begin
- Result := nil;
- if MeshMotionCount = 0 then
- Exit; // force reading the list if it was modified
- if FMeshMotionList[Index] = nil then
- begin
- New(NewEntry);
- FillChar(NewEntry^, SizeOf(NewEntry^), 0);
- NewEntry^ := GetObjectMotionByIndex(FOwner, FOwner.FDatabase, Index);
- FMeshMotionList[Index] := NewEntry;
- end;
- Result := FMeshMotionList[Index];
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TKeyFramer.GetOmniMotionCount: Integer;
- begin
- if FOmniMotionList.Count = 0 then
- FOmniMotionList.Count := GetOmniLightNodeCount(FOwner, FOwner.FDatabase);
- Result := FOmniMotionList.Count;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TKeyFramer.GetOmniLightMotion(Index: Integer): PKFOmni3DS;
- var
- NewEntry: PKFOmni3DS;
- begin
- Result := nil;
- if OmniLightMotionCount = 0 then
- Exit; // force reading the list if it was modified
- if FOmniMotionList[Index] = nil then
- begin
- New(NewEntry);
- FillChar(NewEntry^, SizeOf(NewEntry^), 0);
- NewEntry^ := GetOmniLightMotionByIndex(FOwner, FOwner.FDatabase, Index);
- FOmniMotionList[Index] := NewEntry;
- end;
- Result := FOmniMotionList[Index];
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TKeyFramer.GetSpotMotionCount: Integer;
- begin
- if FSpotMotionList.Count = 0 then
- FSpotMotionList.Count := GetSpotLightNodeCount(FOwner, FOwner.FDatabase);
- Result := FSpotMotionList.Count;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TKeyFramer.GetSpotLightMotion(Index: Integer): PKFSpot3DS;
- var
- NewEntry: PKFSpot3DS;
- begin
- Result := nil;
- if SpotLightMotionCount = 0 then
- Exit; // force reading the list if it was modified
- if FSpotMotionList[Index] = nil then
- begin
- New(NewEntry);
- FillChar(NewEntry^, SizeOf(NewEntry^), 0);
- NewEntry^ := GetSpotLightMotionByIndex(FOwner, FOwner.FDatabase, Index);
- FSpotMotionList[Index] := NewEntry;
- end;
- Result := FSpotMotionList[Index];
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TKeyFramer.ClearLists;
- var
- I: Integer;
- begin
- for I := 0 to FMeshMotionList.Count - 1 do
- ReleaseObjectMotion(FMeshMotionList[I]);
- FMeshMotionList.Clear;
- for I := 0 to FOmniMotionList.Count - 1 do
- ReleaseOmnilightMotion(FOmniMotionList[I]);
- FOmniMotionList.Clear;
- for I := 0 to FSpotMotionList.Count - 1 do
- ReleaseSpotlightMotion(FSpotMotionList[I]);
- FSpotMotionList.Clear;
- for I := 0 to FCameraMotionList.Count - 1 do
- ReleaseCameraMotion(FCameraMotionList[I]);
- FCameraMotionList.Clear;
- if assigned(FAmbientMotion) then
- ReleaseAmbientLightMotion(FAmbientMotion);
- FAmbientMotion := nil;
- end;
- // ----------------- TFile3DS ------------------------------------------------------------------------------------------
- constructor TFile3DS.Create;
- begin
- FMaterialList := TMaterialList.Create(Self);
- FObjectList := TObjectList.Create(Self);
- FKeyFramer := TKeyFramer.Create(Self);
- end;
- constructor TFile3DS.CreateFromFile(const FileName: String);
- begin
- Create;
- FFileName := FileName;
- FStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
- InitDatabase;
- CreateDatabase;
- end;
- destructor TFile3DS.Destroy;
- begin
- FKeyFramer.Free;
- FObjectList.Free;
- FMaterialList.Free;
- ReleaseDatabase;
- ReleaseStream;
- inherited Destroy;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.AddToNodeList(Chunk: PChunk3DS);
- // creates a node, put node in list and fill-in structure
- var
- NewNode: PNodeList;
- HdrChunk, InstChunk: PChunk3DS;
- begin
- MakeNode(NewNode);
- if NewNode = nil then
- Exit;
- HdrChunk := FindChunk(Chunk, NODE_HDR);
- if HdrChunk = nil then
- Exit;
- ReadChunkData(HdrChunk);
- if HdrChunk = nil then
- Exit;
- // fill in node Data
- NewNode.Name := HdrChunk.Data.NodeHdr.ObjNameStr;
- NewNode.ID := GetChunkNodeID(Chunk);
- NewNode.Tag := Chunk.Tag;
- NewNode.ParentID := HdrChunk.Data.NodeHdr.ParentIndex;
- NewNode.Next := nil;
- NewNode.InstStr := '';
- // check for instance
- if Chunk.Tag = OBJECT_NODE_TAG then
- begin
- InstChunk := FindChunk(Chunk, INSTANCE_NAME);
- if assigned(InstChunk) then
- begin
- ReadChunkData(InstChunk);
- NewNode.InstStr := string(StrPas(InstChunk.Data.InstanceName));
- FreeChunkData(InstChunk);
- end;
- end;
- HdrChunk.Data.NodeHdr.ObjNameStr := '';
- FreeChunkData(HdrChunk);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.AssignParentNames;
- // traverse keyframe data and assign parent names to its own chunk PARENT_NAME
- // which is a child of NODE_HDR
- var
- Chunk, KfDataChunk, HdrChunk, NameChunk, IdChunk: PChunk3DS;
- I: Integer;
- IDNode, IDParentNode: PNodeList;
- Name, Inst: String3DS;
- begin
- KfDataChunk := FindChunk(FDatabase.TopChunk, KFDATA);
- if KfDataChunk = nil then
- Exit;
- // Find chunks in KFRAMER
- for I := 1 to NodeTagCount do
- begin
- Chunk := FindChunk(KfDataChunk, NodeTags[I]);
- while assigned(Chunk) do
- begin
- HdrChunk := FindChunk(Chunk, NODE_HDR);
- if assigned(HdrChunk) then
- begin
- IdChunk := FindChunk(Chunk, NODE_ID);
- if assigned(IdChunk) then
- begin
- ReadChunkData(IdChunk);
- if assigned(IdChunk.Data.KFID) then
- begin
- // Find table entry for node of interest
- IDNode := FindNodeByID(IdChunk.Data.KFID^);
- // no ID (bad) or no parent (ok)
- if assigned(IDNode) and (IDNode.ParentID <> -1) then
- begin
- // find table entry for parent
- IDParentNode := FindNodeByID(IDNode.ParentID);
- if assigned(IDParentNode) then
- begin
- Name := UTF8String(IDParentNode.Name);
- Inst := UTF8String(IDParentNode.InstStr);
- end;
- if Length(Name) > 0 then
- begin
- // concatenate names if there is an inst name
- if Length(Inst) > 0 then
- Name := Name + '.' + Inst;
- // if PARENT chunk exists, copy into it
- NameChunk := FindChunk(HdrChunk, PARENT_NAME);
- if assigned(NameChunk) then
- begin
- ReadChunkData(NameChunk);
- if assigned(NameChunk.Data.InstanceName) then
- begin
- NameChunk.Data.InstanceName := AllocMem(Length(Name) + 1);
- Move(Name[1], NameChunk.Data.InstanceName^, Length(Name) + 1);
- end;
- end
- else
- KFAddParentName(HdrChunk, Name); // creates PARENT_NAME chunk
- end;
- end;
- end;
- end;
- end;
- Chunk := FindNextChunk(Chunk.Sibling, NodeTags[I]);
- end;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.CheckListNodeIDs;
- // Earlier versions (pre 3) of 3dStudio had no node ids, they simply used the order
- // in which they came along, if so put in NODE IDs. Assuming that if one node
- // has no ID the whole list get renumbered.
- var
- ID: PNodeList;
- Index: SmallInt;
- begin
- ID := FNodeList;
- while assigned(ID) do
- begin
- if (ID.ID = KNoID) then // if somebody has no ID renumber list
- begin
- Index := 0;
- ID := FNodeList;
- while assigned(ID) do
- begin
- ID.ID := Index;
- Inc(Index);
- ID := ID.Next;
- end;
- Break;
- end;
- ID := ID.Next;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.FindNodeByID(ID: SmallInt): PNodeList;
- begin
- Result := FNodeList;
- while assigned(Result) do
- begin
- if Result.ID = ID then
- Break;
- Result := Result.Next;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.DumpDataBase(Strings: TStrings; DumpLevel: TDumpLevel);
- // dumps entire database into the given string class
- var
- OldSeparator: Char;
- begin
- OldSeparator := FormatSettings.DecimalSeparator;
- FormatSettings.DecimalSeparator := '.';
- try
- if Assigned(FDatabase.TopChunk) then
- DumpChunk(Self, Strings, FDatabase.TopChunk, 0, DumpLevel);
- finally
- FormatSettings.DecimalSeparator := OldSeparator;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.GetChunkNodeID(Chunk: PChunk3DS): SmallInt;
- var
- IdChunk: PChunk3DS;
- begin
- Result := KNoID;
- IdChunk := FindChunk(Chunk, NODE_ID);
- if assigned(IdChunk) then
- begin
- ReadChunkData(IdChunk);
- if assigned(IdChunk.Data.KFID) then
- Result := IdChunk.Data.KFID^;
- FreeChunkData(IdChunk);
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.IsNode(Tag: Word): Boolean;
- var
- I: Integer;
- begin
- Result := False;
- for I := 1 to NodeTagCount do
- if Tag = NodeTags[I] then
- begin
- Result := True;
- Break;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.KFAddParentName(Chunk: PChunk3DS; const Name: String3DS);
- var
- Temp: PChunk3DS;
- begin
- InitChunk(Temp);
- Temp.Tag := PARENT_NAME;
- Temp.Data.Dummy := AllocMem(Length(Name) + 1);
- Move(Name[1], Temp.Data.Dummy^, Length(Name) + 1);
- AddChildOrdered(Chunk, Temp);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.MakeNode(var Node: PNodeList);
- // add node to linked list (uninitialized)
- var
- ID: PNodeList;
- begin
- ID := FNodeList;
- Node := AllocMem(SizeOf(TNodeList));
- if assigned(Node) then
- begin
- // first node ?
- if ID = nil then
- FNodeList := Node
- else // add to list
- begin
- while assigned(ID.Next) do
- ID := ID.Next;
- ID.Next := Node;
- end;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.ParseDatabase;
- var
- Chunk, KfDataChunk: PChunk3DS;
- begin
- KfDataChunk := FindChunk(FDatabase.TopChunk, KFDATA);
- if assigned(KfDataChunk) then
- begin
- Chunk := KfDataChunk.Children;
- while assigned(Chunk) do
- begin
- if IsNode(Chunk.Tag) then
- AddToNodeList(Chunk);
- Chunk := Chunk.Sibling;
- end;
- CheckListNodeIDs;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.ReadXDataEntryChildren(Parent: PChunk3DS);
- var
- ParentBody: Cardinal;
- Child: PChunk3DS;
- begin
- SeekChild(Parent);
- ParentBody := Parent.Position + Parent.Size;
- // satisfy the D4 compiler by castíng the (longint) position to a cardinal
- while Cardinal(FStream.Position) < ParentBody do
- begin
- Child := nil;
- InitChunk(Child);
- Child.Position := FStream.Position;
- ReadHeader(Child.Tag, Child.Size);
- // Validate the child chunk...
- // First, is it a valid header?
- case Child.Tag of
- XDATA_APPNAME,
- XDATA_STRING,
- XDATA_FLOAT,
- XDATA_DOUBLE,
- XDATA_SHORT,
- XDATA_LONG,
- XDATA_VOID,
- XDATA_GROUP,
- XDATA_RFU6,
- XDATA_RFU5,
- XDATA_RFU4,
- XDATA_RFU3,
- XDATA_RFU2,
- XDATA_RFU1:
- begin
- // second, does the size fit inside the XDATA_ENTRY chunk?
- if (Child.Position + Child.Size) <= ParentBody then
- begin
- // chances are its a good subchunk, so add it in
- AddChild(Parent, Child);
- ReadXDataEntryChildren(Child);
- end
- else
- ReleaseChunk(Child);
- end
- else // must not be a valid chunk, seek to the end of the parent then
- begin
- ReleaseChunk(Child);
- FStream.Position := ParentBody;
- end;
- end;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.ReleaseNodeList;
- var
- Next: PNodeList;
- begin
- while assigned(FNodeList) do
- begin
- Next := FNodeList.Next;
- Dispose(FNodeList);
- FNodeList := Next;
- end;
- end;
- procedure TFile3DS.ReleaseStream;
- begin
- if FOwnStream then
- FreeAndNil(FStream)
- else
- FStream := nil;
- FOwnStream := False;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.CreateDatabase;
- begin
- with FDatabase do
- begin
- InitChunk(TopChunk);
- FStream.Position := 0;
- ReadHeader(TopChunk.Tag, TopChunk.Size);
- // test header to determine whether it is a top level chunk type
- if (TopChunk.Tag = M3DMAGIC) or (TopChunk.Tag = CMAGIC) or
- (TopChunk.Tag = MLIBMAGIC) then
- begin
- // gw: set needed max value for ProgressBar
- if assigned(FOnLoadProgress) then
- FOnLoadProgress(0, FStream.Size);
- // read database structure
- ReadChildren(TopChunk);
- ParseDatabase;
- AssignParentNames;
- ReleaseNodeList;
- end;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.InitDatabase;
- begin
- with FDatabase do
- begin
- TopChunk := nil;
- ObjListDirty := True;
- MatListDirty := True;
- NodeListDirty := True;
- ObjList := nil;
- MatList := nil;
- NodeList := nil;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.ClearLists;
- begin
- FMaterialList.ClearList;
- FObjectList.ClearLists;
- FKeyFramer.ClearLists;
- ReleaseDatabase;
- end;
- procedure TFile3DS.LoadFromFile(const FileName: String);
- begin
- ClearLists;
- ReleaseStream;
- FFileName := FileName;
- FStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
- FOwnStream := True;
- InitDatabase;
- CreateDatabase;
- end;
- procedure TFile3DS.LoadFromStream(const aStream: TStream);
- begin
- ReleaseStream;
- ClearLists;
- FFileName := '';
- FStream := aStream;
- InitDatabase;
- CreateDatabase;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.GetAtmosphereData: TAtmosphere3DS;
- begin
- Result := GetAtmosphere(Self, FDatabase);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.GetBackgroundData: TBackground3DS;
- begin
- Result := GetBackground(Self, FDatabase);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.GetDatabaseType: TDBType3DS;
- begin
- case FDatabase.TopChunk.Tag of
- M3DMAGIC:
- Result := dbMeshFile;
- CMAGIC:
- Result := dbProjectFile;
- MLIBMAGIC:
- Result := dbMaterialFile;
- else
- Result := dbUnknown;
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.GetMeshSettings: TMeshSet3DS;
- begin
- Result := GetMeshSet(Self, FDatabase);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.GetViewportData: TViewport3DS;
- begin
- Result := GetViewport(Self, FDatabase);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.ReadChildren(Parent: PChunk3DS);
- var
- ParentBody: Integer;
- Child: PChunk3DS;
- begin
- SeekChild(Parent);
- ParentBody := Parent.Position + Parent.Size;
- while FStream.Position < ParentBody do
- begin
- Child := nil;
- InitChunk(Child);
- // gw: set ProgressBar current position
- if assigned(FOnLoadProgress) then
- FOnLoadProgress(FStream.Position, 0);
- Child.Position := FStream.Position;
- ReadHeader(Child.Tag, Child.Size);
- AddChild(Parent, Child);
- if Child.Tag = XDATA_ENTRY then
- ReadXDataEntryChildren(Child)
- else
- ReadChildren(Child);
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.ReleaseDatabase;
- begin
- with FDatabase do
- begin
- if assigned(TopChunk) then
- ReleaseChunk(TopChunk);
- if assigned(ObjList) then
- ReleaseChunkList(ObjList);
- if assigned(MatList) then
- ReleaseChunkList(MatList);
- if assigned(NodeList) then
- ReleaseChunkList(NodeList);
- end;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.InitChunkData(Chunk: PChunk3DS): Pointer;
- begin
- case Chunk.Tag of
- COLOR_F:
- Chunk.Data.ColorF := AllocMem(SizeOf(TColorF));
- LIN_COLOR_F:
- Chunk.Data.LinColorF := AllocMem(SizeOf(TLinColorF));
- COLOR_24:
- Chunk.Data.Color24 := AllocMem(SizeOf(TColor24));
- LIN_COLOR_24:
- Chunk.Data.LinColor24 := AllocMem(SizeOf(TLinColor24));
- INT_PERCENTAGE:
- Chunk.Data.IntPercentage := AllocMem(SizeOf(TIntPercentage));
- FLOAT_PERCENTAGE:
- Chunk.Data.FloatPercentage := AllocMem(SizeOf(TFloatPercentage));
- MAT_MAPNAME:
- Chunk.Data.MatMapname := nil; // AllocMem(SizeOf(TMatMapname));
- M3D_VERSION:
- Chunk.Data.M3dVersion := AllocMem(SizeOf(TM3dVersion));
- MESH_VERSION:
- Chunk.Data.MeshVersion := AllocMem(SizeOf(TMeshVersion));
- MASTER_SCALE:
- Chunk.Data.MasterScale := AllocMem(SizeOf(TMasterScale));
- LO_SHADOW_BIAS:
- Chunk.Data.LoShadowBias := AllocMem(SizeOf(TLoShadowBias));
- SHADOW_FILTER:
- Chunk.Data.ShadowFilter := AllocMem(SizeOf(TShadowFilter));
- SHADOW_RANGE:
- Chunk.Data.ShadowRange := AllocMem(SizeOf(TShadowRange));
- HI_SHADOW_BIAS:
- Chunk.Data.HiShadowBias := AllocMem(SizeOf(THiShadowBias));
- RAY_BIAS:
- Chunk.Data.RayBias := AllocMem(SizeOf(TRayBias));
- SHADOW_MAP_SIZE:
- Chunk.Data.ShadowMapSize := AllocMem(SizeOf(TShadowMapSize));
- SHADOW_SAMPLES:
- Chunk.Data.ShadowSamples := AllocMem(SizeOf(TShadowSamples));
- O_CONSTS:
- Chunk.Data.OConsts := AllocMem(SizeOf(TOConsts));
- BIT_MAP:
- Chunk.Data.BitMapName := nil; // AllocMem(SizeOf(TBitMapName));
- V_GRADIENT:
- Chunk.Data.VGradient := AllocMem(SizeOf(TVGradient));
- FOG:
- Chunk.Data.FOG := AllocMem(SizeOf(TFog));
- LAYER_FOG:
- Chunk.Data.LayerFog := AllocMem(SizeOf(TLayerFog));
- DISTANCE_CUE:
- Chunk.Data.DistanceCue := AllocMem(SizeOf(TDistanceCue));
- VIEW_TOP,
- VIEW_BOTTOM,
- VIEW_LEFT,
- VIEW_RIGHT,
- VIEW_FRONT,
- VIEW_BACK:
- Chunk.Data.ViewStandard := AllocMem(SizeOf(TViewStandard));
- VIEW_USER:
- Chunk.Data.ViewUser := AllocMem(SizeOf(TViewUser));
- VIEW_CAMERA:
- Chunk.Data.ViewCamera := nil; // AllocMem(SizeOf(TViewCamera));
- MAT_NAME:
- Chunk.Data.MatName := nil; // AllocMem(SizeOf(TMatName));
- MAT_SHADING:
- Chunk.Data.MatShading := AllocMem(SizeOf(TMatShading));
- MAT_ACUBIC:
- Chunk.Data.MatAcubic := AllocMem(SizeOf(TMatAcubic));
- MAT_SXP_TEXT_DATA,
- MAT_SXP_TEXT2_DATA,
- MAT_SXP_OPAC_DATA,
- MAT_SXP_BUMP_DATA,
- MAT_SXP_SPEC_DATA,
- MAT_SXP_SHIN_DATA,
- MAT_SXP_SELFI_DATA,
- MAT_SXP_TEXT_MASKDATA,
- MAT_SXP_TEXT2_MASKDATA,
- MAT_SXP_OPAC_MASKDATA,
- MAT_SXP_BUMP_MASKDATA,
- MAT_SXP_SPEC_MASKDATA,
- MAT_SXP_SHIN_MASKDATA,
- MAT_SXP_SELFI_MASKDATA,
- MAT_SXP_REFL_MASKDATA,
- PROC_DATA:
- Chunk.Data.IpasData := AllocMem(SizeOf(TIpasData));
- MAT_WIRESIZE:
- Chunk.Data.MatWireSize := AllocMem(SizeOf(TMatWireSize));
- MAT_MAP_TILING:
- Chunk.Data.MatMapTiling := AllocMem(SizeOf(TMatMapTiling));
- MAT_MAP_TEXBLUR:
- Chunk.Data.MatMapTexblur := AllocMem(SizeOf(TMatMapTexblur));
- MAT_MAP_USCALE:
- Chunk.Data.MatMapUScale := AllocMem(SizeOf(TMatMapUScale));
- MAT_MAP_VSCALE:
- Chunk.Data.MatMapVScale := AllocMem(SizeOf(TMatMapVScale));
- MAT_MAP_UOFFSET:
- Chunk.Data.MatMapUOffset := AllocMem(SizeOf(TMatMapUOffset));
- MAT_MAP_VOFFSET:
- Chunk.Data.MatMapVOffset := AllocMem(SizeOf(TMatMapVOffset));
- MAT_MAP_ANG:
- Chunk.Data.MatMapAng := AllocMem(SizeOf(TMatMapAng));
- MAT_MAP_COL1:
- Chunk.Data.MatMapCol1 := AllocMem(SizeOf(TMatMapCol1));
- MAT_MAP_COL2:
- Chunk.Data.MatMapCol2 := AllocMem(SizeOf(TMatMapCol2));
- MAT_MAP_RCOL:
- Chunk.Data.MatMapRCol := AllocMem(SizeOf(TMatMapRCol));
- MAT_MAP_GCOL:
- Chunk.Data.MatMapGCol := AllocMem(SizeOf(TMatMapGCol));
- MAT_MAP_BCOL:
- Chunk.Data.MatMapBCol := AllocMem(SizeOf(TMatMapBCol));
- MAT_BUMP_PERCENT:
- Chunk.Data.MatBumpPercent := AllocMem(SizeOf(TMatBumpPercent));
- NAMED_OBJECT:
- Chunk.Data.NamedObject := nil; // AllocMem(SizeOf(TNamedObject));
- POINT_ARRAY:
- Chunk.Data.PointArray := AllocMem(SizeOf(TPointArray));
- POINT_FLAG_ARRAY:
- Chunk.Data.PointFlagArray := AllocMem(SizeOf(TPointFlagArray));
- FACE_ARRAY:
- Chunk.Data.FaceArray := AllocMem(SizeOf(TFaceArray));
- MSH_MAT_GROUP:
- Chunk.Data.MshMatGroup := AllocMem(SizeOf(TMshMatGroup));
- MSH_BOXMAP:
- Chunk.Data.MshBoxmap := AllocMem(SizeOf(TMshBoxmap));
- SMOOTH_GROUP:
- Chunk.Data.SmoothGroup := AllocMem(SizeOf(TSmoothGroup));
- TEX_VERTS:
- Chunk.Data.TexVerts := AllocMem(SizeOf(TTexVerts));
- MESH_MATRIX:
- Chunk.Data.MeshMatrix := AllocMem(SizeOf(TMeshMatrix));
- MESH_COLOR:
- Chunk.Data.MeshColor := AllocMem(SizeOf(TMeshColor));
- MESH_TEXTURE_INFO:
- Chunk.Data.MeshTextureInfo := AllocMem(SizeOf(TMeshTextureInfo));
- PROC_NAME:
- Chunk.Data.ProcName := nil; // AllocMem(SizeOf(TProcName));
- N_DIRECT_LIGHT:
- Chunk.Data.NDirectLight := AllocMem(SizeOf(TNDirectLight));
- DL_EXCLUDE:
- Chunk.Data.DlExclude := nil; // AllocMem(SizeOf(TDlExclude));
- DL_INNER_RANGE:
- Chunk.Data.DlInnerRange := AllocMem(SizeOf(TDlInnerRange));
- DL_OUTER_RANGE:
- Chunk.Data.DlOuterRange := AllocMem(SizeOf(TDlOuterRange));
- DL_MULTIPLIER:
- Chunk.Data.DlMultiplier := AllocMem(SizeOf(TDlMultiplier));
- DL_SPOTLIGHT:
- Chunk.Data.DlSpotlight := AllocMem(SizeOf(TDlSpotlight));
- DL_LOCAL_SHADOW2:
- Chunk.Data.DlLocalShadow2 := AllocMem(SizeOf(TDlLocalShadow2));
- DL_SPOT_ROLL:
- Chunk.Data.DlSpotRoll := AllocMem(SizeOf(TDlSpotRoll));
- DL_SPOT_ASPECT:
- Chunk.Data.DlSpotAspect := AllocMem(SizeOf(TDlSpotAspect));
- DL_SPOT_PROJECTOR:
- Chunk.Data.DlSpotProjector := nil; // AllocMem(SizeOf(TDlSpotProjector));
- DL_RAY_BIAS:
- Chunk.Data.DlRayBias := AllocMem(SizeOf(TDlRayBias));
- N_CAMERA:
- Chunk.Data.NCamera := AllocMem(SizeOf(TNCamera));
- CAM_RANGES:
- Chunk.Data.CamRanges := AllocMem(SizeOf(TCamRanges));
- VIEWPORT_LAYOUT:
- Chunk.Data.ViewportLayout := AllocMem(SizeOf(TViewportLayout));
- VIEWPORT_SIZE:
- Chunk.Data.ViewportSize := AllocMem(SizeOf(TViewportSize));
- VIEWPORT_DATA_3,
- VIEWPORT_DATA:
- Chunk.Data.ViewportData := AllocMem(SizeOf(TViewportData));
- XDATA_ENTRY:
- Chunk.Data.XDataEntry := AllocMem(SizeOf(TXDataEntry));
- XDATA_APPNAME:
- Chunk.Data.XDataAppName := nil; // AllocMem(SizeOf(TXDataAppName));
- XDATA_STRING:
- Chunk.Data.XDataString := nil; // AllocMem(SizeOf(TXDataString));
- KFHDR:
- Chunk.Data.KFHDR := AllocMem(SizeOf(TKFHdr));
- KFSEG:
- Chunk.Data.KFSEG := AllocMem(SizeOf(TKFSeg));
- KFCURTIME:
- Chunk.Data.KFCURTIME := AllocMem(SizeOf(TKFCurtime));
- NODE_ID:
- Chunk.Data.KFID := AllocMem(SizeOf(TKFId));
- NODE_HDR:
- Chunk.Data.NodeHdr := AllocMem(SizeOf(TNodeHdr));
- PIVOT:
- Chunk.Data.PIVOT := AllocMem(SizeOf(TPivot));
- INSTANCE_NAME, PARENT_NAME:
- Chunk.Data.InstanceName := nil; // AllocMem(SizeOf(TInstanceName));
- MORPH_SMOOTH:
- Chunk.Data.MorphSmooth := AllocMem(SizeOf(TMorphSmooth));
- BOUNDBOX:
- Chunk.Data.BOUNDBOX := AllocMem(SizeOf(TBoundBox));
- POS_TRACK_TAG:
- Chunk.Data.PosTrackTag := AllocMem(SizeOf(TPosTrackTag));
- COL_TRACK_TAG:
- Chunk.Data.ColTrackTag := AllocMem(SizeOf(TColTrackTag));
- ROT_TRACK_TAG:
- Chunk.Data.RotTrackTag := AllocMem(SizeOf(TRotTrackTag));
- SCL_TRACK_TAG:
- Chunk.Data.ScaleTrackTag := AllocMem(SizeOf(TScaleTrackTag));
- MORPH_TRACK_TAG:
- Chunk.Data.MorphTrackTag := AllocMem(SizeOf(TMorphTrackTag));
- FOV_TRACK_TAG:
- Chunk.Data.FovTrackTag := AllocMem(SizeOf(TFovTrackTag));
- ROLL_TRACK_TAG:
- Chunk.Data.RollTrackTag := AllocMem(SizeOf(TRollTrackTag));
- HOT_TRACK_TAG:
- Chunk.Data.HotTrackTag := AllocMem(SizeOf(THotTrackTag));
- FALL_TRACK_TAG:
- Chunk.Data.FallTrackTag := AllocMem(SizeOf(TFallTrackTag));
- HIDE_TRACK_TAG:
- Chunk.Data.HideTrackTag := AllocMem(SizeOf(THideTrackTag));
- M3DMAGIC, // Chunks who consist entirely of children
- MLIBMAGIC,
- MDATA,
- AMBIENT_LIGHT,
- SOLID_BGND,
- DEFAULT_VIEW,
- MAT_ENTRY,
- MAT_AMBIENT,
- MAT_DIFFUSE,
- MAT_SPECULAR,
- MAT_SHININESS,
- MAT_SHIN2PCT,
- MAT_SHIN3PCT,
- MAT_TRANSPARENCY,
- MAT_XPFALL,
- MAT_REFBLUR,
- MAT_SELF_ILPCT,
- MAT_TEXMAP,
- MAT_TEXMASK,
- MAT_TEX2MAP,
- MAT_TEX2MASK,
- MAT_OPACMAP,
- MAT_OPACMASK,
- MAT_REFLMAP,
- MAT_REFLMASK,
- MAT_BUMPMAP,
- MAT_BUMPMASK,
- MAT_SPECMAP,
- MAT_SPECMASK,
- MAT_SHINMAP,
- MAT_SHINMASK,
- MAT_SELFIMAP,
- MAT_SELFIMASK,
- N_TRI_OBJECT,
- KFDATA,
- AMBIENT_NODE_TAG,
- OBJECT_NODE_TAG,
- CAMERA_NODE_TAG,
- TARGET_NODE_TAG,
- LIGHT_NODE_TAG,
- SPOTLIGHT_NODE_TAG,
- L_TARGET_NODE_TAG,
- CMAGIC,
- XDATA_SECTION,
- XDATA_GROUP:
- Chunk.Data.Dummy := nil;
- else // A truely hideous thing to do but it helps with unknown chunks
- // Don't mess with dataless chunks
- if Chunk.Size > 6 then
- Chunk.Data.Dummy := AllocMem(Chunk.Size - 6)
- else
- Chunk.Data.Dummy := nil;
- end; // end of case
- Result := Chunk.Data.Dummy; // returns the pointer should someone want it
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteByte(AValue: Byte);
- begin
- FStream.WriteBuffer(AValue, 1);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadByte: Byte;
- begin
- FStream.ReadBuffer(Result, 1);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteShort(AValue: SmallInt);
- begin
- FStream.WriteBuffer(AValue, SizeOf(AValue));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadShort: SmallInt;
- begin
- FStream.ReadBuffer(Result, SizeOf(Result));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadCardinal: Cardinal;
- begin
- FStream.ReadBuffer(Result, SizeOf(Result));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadDouble: Double;
- begin
- FStream.ReadBuffer(Result, SizeOf(Result));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadInteger: Integer;
- begin
- FStream.ReadBuffer(Result, SizeOf(Result));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadSingle: Single;
- begin
- FStream.ReadBuffer(Result, SizeOf(Result));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadWord: Word;
- begin
- FStream.ReadBuffer(Result, SizeOf(Result));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteCardinal(AValue: Cardinal);
- begin
- FStream.WriteBuffer(AValue, SizeOf(AValue));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteDouble(AValue: Double);
- begin
- FStream.WriteBuffer(AValue, SizeOf(AValue));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteInteger(AValue: Integer);
- begin
- FStream.WriteBuffer(AValue, SizeOf(AValue));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteSingle(AValue: Single);
- begin
- FStream.WriteBuffer(AValue, SizeOf(AValue));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteWord(AValue: Word);
- begin
- FStream.WriteBuffer(AValue, SizeOf(AValue));
- end;
- // WriteData
- //
- procedure TFile3DS.WriteData(Size: Integer; Data: Pointer);
- begin
- if assigned(Data) then
- FStream.WriteBuffer(Data^, Size);
- end;
- // ReadData
- //
- procedure TFile3DS.ReadData(Size: Integer; Data: Pointer);
- begin
- FStream.ReadBuffer(Data^, Size);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.Skip(AValue: Integer);
- begin
- FStream.Seek(soFromCurrent, AValue);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteString(const AValue: String3DS);
- begin
- WriteData(Length(AValue), @AValue[1]);
- WriteByte(0); // Write a null on the end of the string
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteFixedString(const AValue: String3DS; Len: Integer);
- var
- I: Integer;
- begin
- // len is the length of the target string space including null
- WriteString(AValue); // 1 null byte will also be written
- for I := 1 to Len - Length(AValue) - 1 do
- WriteByte(0); // fill the remaining space with nulls
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadString: PChar3DS;
- var
- Len, LB: Integer;
- Buffer: String3DS;
- begin
- Len := 0;
- LB := 0;
- repeat
- if Len >= LB then
- begin
- Inc(LB, 50);
- SetLength(Buffer, LB);
- end;
- Inc(Len);
- FStream.Read(Buffer[Len], 1);
- until Buffer[Len] = #0;
- Result := AllocMem(Len);
- Move(Buffer[1], Result^, Len);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteHeader(ChunkType: Word; ChunkSize: Cardinal);
- begin
- WriteWord(ChunkType);
- WriteCardinal(ChunkSize);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.ReadHeader(var ChunkType: Word; var ChunkSize: Cardinal);
- begin
- ChunkType := ReadWord;
- ChunkSize := ReadCardinal;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.FinishHeader(StartPos, EndPos: Cardinal);
- begin
- FStream.Position := StartPos + 2;
- WriteCardinal(EndPos - StartPos);
- FStream.Position := EndPos;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WritePoint(const P: TPoint3DS);
- begin
- WriteSingle(P.X);
- WriteSingle(P.Y);
- WriteSingle(P.Z);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadPoint: TPoint3DS;
- begin
- Result := DefPoint3DS;
- FStream.ReadBuffer(Result, SizeOf(Result));
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteTexVertex(const T: TTexVert3DS);
- begin
- WriteSingle(T.U);
- WriteSingle(T.V);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadTexVert: TTexVert3DS;
- begin
- Result := DefTextVert3DS;
- Result.U := ReadSingle;
- Result.V := ReadSingle;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteFace(const F: TFace3DS);
- begin
- WriteWord(F.v1);
- WriteWord(F.v2);
- WriteWord(F.v3);
- WriteWord(F.flag);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadFace: TFace3DS;
- begin
- Result := DefFace3DS;
- Result.v1 := ReadWord;
- Result.v2 := ReadWord;
- Result.v3 := ReadWord;
- Result.flag := ReadWord;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteTrackHeader(const T: TTrackHeader3DS);
- begin
- WriteWord(T.Flags);
- WriteCardinal(T.nu1);
- WriteCardinal(T.nu2);
- WriteCardinal(T.KeyCount);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadTrackHeader: TTrackHeader3DS;
- begin
- Result := DefTrackHeader3DS;
- Result.Flags := ReadWord;
- Result.nu1 := ReadCardinal;
- Result.nu2 := ReadCardinal;
- Result.KeyCount := ReadCardinal;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.WriteKeyHeader(const K: TKeyHeader3DS);
- begin
- WriteCardinal(K.time);
- WriteWord(K.rflags);
- if (K.rflags and KeyUsesTension3DS) > 0 then
- WriteSingle(K.tension);
- if (K.rflags and KeyUsesCont3DS) > 0 then
- WriteSingle(K.continuity);
- if (K.rflags and KeyUsesBias3DS) > 0 then
- WriteSingle(K.bias);
- if (K.rflags and KeyUsesEaseTo3DS) > 0 then
- WriteSingle(K.easeto);
- if (K.rflags and KeyUsesEaseFrom3DS) > 0 then
- WriteSingle(K.easefrom);
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.ReadKeyHeader: TKeyHeader3DS;
- begin
- Result := DefKeyHeader3DS;
- Result.time := ReadCardinal;
- Result.rflags := ReadWord;
- if (Result.rflags and KeyUsesTension3DS) > 0 then
- Result.tension := ReadSingle;
- if (Result.rflags and KeyUsesCont3DS) > 0 then
- Result.continuity := ReadSingle;
- if (Result.rflags and KeyUsesBias3DS) > 0 then
- Result.bias := ReadSingle;
- if (Result.rflags and KeyUsesEaseTo3DS) > 0 then
- Result.easeto := ReadSingle;
- if (Result.rflags and KeyUsesEaseFrom3DS) > 0 then
- Result.easefrom := ReadSingle;
- end;
- // ---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.ReadChunkData(Chunk: PChunk3DS);
- // Reads the data out of the chunk detailed in Chunk and places a pointer to
- // the data into the PChunk3DS structure, it will also return that pointer.
- var
- I: Integer;
- begin
- if Chunk.Data.Dummy = nil then // don't try to read the data if its already been read
- begin
- // seek to the beginning of the Chunk's data (harmless if the Chunk has no data)
- FStream.Position := Chunk.Position + 6;
- case Chunk.Tag of
- COLOR_F:
- begin
- Chunk.Data.ColorF := AllocMem(SizeOf(TColorF)); // allocate the memory to hold the data
- with Chunk.Data.ColorF^ do
- begin
- Red := ReadSingle; // Read the data out of the file
- Green := ReadSingle;
- Blue := ReadSingle;
- end;
- end;
- LIN_COLOR_F:
- begin
- Chunk.Data.LinColorF := AllocMem(SizeOf(TLinColorF));
- with Chunk.Data.LinColorF^ do
- begin
- Red := ReadSingle;
- Green := ReadSingle;
- Blue := ReadSingle;
- end;
- end;
- COLOR_24:
- begin
- Chunk.Data.Color24 := AllocMem(SizeOf(TColor24));
- with Chunk.Data.Color24^ do
- begin
- Red := ReadByte;
- Green := ReadByte;
- Blue := ReadByte;
- end;
- end;
- LIN_COLOR_24:
- begin
- Chunk.Data.LinColor24 := AllocMem(SizeOf(TLinColor24));
- with Chunk.Data.LinColor24^ do
- begin
- Red := ReadByte;
- Green := ReadByte;
- Blue := ReadByte;
- end;
- end;
- INT_PERCENTAGE:
- begin
- Chunk.Data.IntPercentage := AllocMem(SizeOf(TIntPercentage));
- Chunk.Data.IntPercentage^ := ReadShort;
- end;
- FLOAT_PERCENTAGE:
- begin
- Chunk.Data.FloatPercentage := AllocMem(SizeOf(TFloatPercentage));
- Chunk.Data.FloatPercentage^ := ReadSingle;
- end;
- MAT_MAPNAME:
- begin
- // Chunk.Data.MatMapname := AllocMem(SizeOf(TMatMapname));
- Chunk.Data.MatMapname := ReadString;
- end;
- M3D_VERSION:
- begin
- Chunk.Data.M3dVersion := AllocMem(SizeOf(TM3dVersion));
- Chunk.Data.M3dVersion^ := ReadInteger;
- end;
- MESH_VERSION:
- begin
- Chunk.Data.MeshVersion := AllocMem(SizeOf(TMeshVersion));
- Chunk.Data.MeshVersion^ := ReadInteger;
- end;
- MASTER_SCALE:
- begin
- Chunk.Data.MasterScale := AllocMem(SizeOf(TMasterScale));
- Chunk.Data.MasterScale^ := ReadSingle;
- end;
- LO_SHADOW_BIAS:
- begin
- Chunk.Data.LoShadowBias := AllocMem(SizeOf(TLoShadowBias));
- Chunk.Data.LoShadowBias^ := ReadSingle;
- end;
- SHADOW_FILTER:
- begin
- Chunk.Data.ShadowFilter := AllocMem(SizeOf(TShadowFilter));
- Chunk.Data.ShadowFilter^ := ReadSingle;
- end;
- SHADOW_RANGE:
- begin
- Chunk.Data.ShadowRange := AllocMem(SizeOf(TShadowRange));
- Chunk.Data.ShadowRange^ := ReadInteger;
- end;
- HI_SHADOW_BIAS:
- begin
- Chunk.Data.HiShadowBias := AllocMem(SizeOf(THiShadowBias));
- Chunk.Data.HiShadowBias^ := ReadSingle;
- end;
- RAY_BIAS:
- begin
- Chunk.Data.RayBias := AllocMem(SizeOf(TRayBias));
- Chunk.Data.RayBias^ := ReadSingle;
- end;
- SHADOW_MAP_SIZE:
- begin
- Chunk.Data.ShadowMapSize := AllocMem(SizeOf(TShadowMapSize));
- Chunk.Data.ShadowMapSize^ := ReadShort;
- end;
- SHADOW_SAMPLES:
- begin
- Chunk.Data.ShadowSamples := AllocMem(SizeOf(TShadowSamples));
- Chunk.Data.ShadowSamples^ := ReadShort;
- end;
- O_CONSTS:
- begin
- Chunk.Data.OConsts := AllocMem(SizeOf(TOConsts));
- Chunk.Data.OConsts^ := ReadPoint;
- end;
- BIT_MAP:
- begin
- // Chunk.Data.BitMapName := AllocMem(SizeOf(TBitMapName));
- Chunk.Data.BitMapName := ReadString;
- end;
- V_GRADIENT:
- begin
- Chunk.Data.VGradient := AllocMem(SizeOf(TVGradient));
- Chunk.Data.VGradient^ := ReadSingle;
- end;
- FOG:
- begin
- Chunk.Data.FOG := AllocMem(SizeOf(TFog));
- with Chunk.Data.FOG^ do
- begin
- NearPlaneDist := ReadSingle;
- NearPlaneDensity := ReadSingle;
- FarPlaneDist := ReadSingle;
- FarPlaneDensity := ReadSingle;
- end;
- end;
- LAYER_FOG:
- begin
- Chunk.Data.LayerFog := AllocMem(SizeOf(TLayerFog));
- with Chunk.Data.LayerFog^ do
- begin
- ZMin := ReadSingle;
- ZMax := ReadSingle;
- Density := ReadSingle;
- AType := ReadCardinal;
- end;
- end;
- DISTANCE_CUE:
- begin
- Chunk.Data.DistanceCue := AllocMem(SizeOf(TDistanceCue));
- with Chunk.Data.DistanceCue^ do
- begin
- NearPlaneDist := ReadSingle;
- NearPlaneDimming := ReadSingle;
- FarPlaneDist := ReadSingle;
- FarPlaneDimming := ReadSingle;
- end;
- end;
- VIEW_TOP,
- VIEW_BOTTOM,
- VIEW_LEFT,
- VIEW_RIGHT,
- VIEW_FRONT,
- VIEW_BACK:
- begin
- Chunk.Data.ViewStandard := AllocMem(SizeOf(TViewStandard));
- with Chunk.Data.ViewStandard^ do
- begin
- ViewWidth := ReadSingle;
- ViewTargetCoord := ReadPoint;
- end;
- end;
- VIEW_USER:
- begin
- Chunk.Data.ViewUser := AllocMem(SizeOf(TViewUser));
- with Chunk.Data.ViewUser^ do
- begin
- ViewWidth := ReadSingle;
- XYViewAngle := ReadSingle;
- YZViewAngle := ReadSingle;
- BankAngle := ReadSingle;
- ViewTargetCoord := ReadPoint;
- end;
- end;
- VIEW_CAMERA:
- begin
- // Chunk.Data.ViewCamera := AllocMem(SizeOf(TViewCamera));
- Chunk.Data.ViewCamera := ReadString;
- end;
- MAT_NAME:
- begin
- // Chunk.Data.MatName := AllocMem(SizeOf(TMatName));
- Chunk.Data.MatName := ReadString;
- end;
- MAT_SHADING:
- begin
- Chunk.Data.MatShading := AllocMem(SizeOf(TMatShading));
- FStream.Position := Chunk.Position + 6;
- Chunk.Data.MatShading^ := ReadShort;
- end;
- MAT_ACUBIC:
- begin
- Chunk.Data.MatAcubic := AllocMem(SizeOf(TMatAcubic));
- with Chunk.Data.MatAcubic^ do
- begin
- ShadeLevel := ReadByte;
- AntiAlias := ReadByte;
- Flags := ReadShort;
- MapSize := ReadCardinal;
- FrameInterval := ReadCardinal;
- end;
- end;
- MAT_SXP_TEXT_DATA,
- MAT_SXP_TEXT2_DATA,
- MAT_SXP_OPAC_DATA,
- MAT_SXP_BUMP_DATA,
- MAT_SXP_SPEC_DATA,
- MAT_SXP_SHIN_DATA,
- MAT_SXP_SELFI_DATA,
- MAT_SXP_TEXT_MASKDATA,
- MAT_SXP_TEXT2_MASKDATA,
- MAT_SXP_OPAC_MASKDATA,
- MAT_SXP_BUMP_MASKDATA,
- MAT_SXP_SPEC_MASKDATA,
- MAT_SXP_SHIN_MASKDATA,
- MAT_SXP_SELFI_MASKDATA,
- MAT_SXP_REFL_MASKDATA,
- PROC_DATA:
- begin
- Chunk.Data.IpasData := AllocMem(SizeOf(TIpasData));
- with Chunk.Data.IpasData^ do
- begin
- Size := Chunk.Size - 6;
- Data := AllocMem(Size);
- ReadData(Size, Data);
- end;
- end;
- MAT_WIRESIZE:
- begin
- Chunk.Data.MatWireSize := AllocMem(SizeOf(TMatWireSize));
- Chunk.Data.MatWireSize^ := ReadSingle;
- end;
- MAT_MAP_TILING:
- begin
- Chunk.Data.MatMapTiling := AllocMem(SizeOf(TMatMapTiling));
- Chunk.Data.MatMapTiling^ := ReadWord;
- end;
- MAT_MAP_TEXBLUR:
- begin
- Chunk.Data.MatMapTexblur := AllocMem(SizeOf(TMatMapTexblur));
- Chunk.Data.MatMapTexblur^ := ReadSingle;
- end;
- MAT_MAP_USCALE:
- begin
- Chunk.Data.MatMapUScale := AllocMem(SizeOf(TMatMapUScale));
- Chunk.Data.MatMapUScale^ := ReadSingle;
- end;
- MAT_MAP_VSCALE:
- begin
- Chunk.Data.MatMapVScale := AllocMem(SizeOf(TMatMapVScale));
- Chunk.Data.MatMapVScale^ := ReadSingle;
- end;
- MAT_MAP_UOFFSET:
- begin
- Chunk.Data.MatMapUOffset := AllocMem(SizeOf(TMatMapUOffset));
- Chunk.Data.MatMapUOffset^ := ReadSingle;
- end;
- MAT_MAP_VOFFSET:
- begin
- Chunk.Data.MatMapVOffset := AllocMem(SizeOf(TMatMapVOffset));
- Chunk.Data.MatMapVOffset^ := ReadSingle;
- end;
- MAT_MAP_ANG:
- begin
- Chunk.Data.MatMapAng := AllocMem(SizeOf(TMatMapAng));
- Chunk.Data.MatMapAng^ := ReadSingle;
- end;
- MAT_MAP_COL1:
- begin
- Chunk.Data.MatMapCol1 := AllocMem(SizeOf(TMatMapCol1));
- with Chunk.Data.MatMapCol1^ do
- begin
- Red := ReadByte;
- Green := ReadByte;
- Blue := ReadByte;
- end;
- end;
- MAT_MAP_COL2:
- begin
- Chunk.Data.MatMapCol2 := AllocMem(SizeOf(TMatMapCol2));
- with Chunk.Data.MatMapCol2^ do
- begin
- Red := ReadByte;
- Green := ReadByte;
- Blue := ReadByte;
- end;
- end;
- MAT_MAP_RCOL:
- begin
- Chunk.Data.MatMapRCol := AllocMem(SizeOf(TMatMapRCol));
- with Chunk.Data.MatMapRCol^ do
- begin
- Red := ReadByte;
- Green := ReadByte;
- Blue := ReadByte;
- end;
- end;
- MAT_MAP_GCOL:
- begin
- Chunk.Data.MatMapGCol := AllocMem(SizeOf(TMatMapGCol));
- with Chunk.Data.MatMapGCol^ do
- begin
- Red := ReadByte;
- Green := ReadByte;
- Blue := ReadByte;
- end;
- end;
- MAT_MAP_BCOL:
- begin
- Chunk.Data.MatMapBCol := AllocMem(SizeOf(TMatMapBCol));
- with Chunk.Data.MatMapBCol^ do
- begin
- Red := ReadByte;
- Green := ReadByte;
- Blue := ReadByte;
- end;
- end;
- MAT_BUMP_PERCENT:
- begin
- Chunk.Data.MatBumpPercent := AllocMem(SizeOf(TMatBumpPercent));
- Chunk.Data.MatBumpPercent^ := ReadShort;
- end;
- NAMED_OBJECT:
- begin
- // Chunk.Data.NamedObject := AllocMem(SizeOf(TNamedObject));
- Chunk.Data.NamedObject := ReadString;
- end;
- POINT_ARRAY:
- begin
- Chunk.Data.PointArray := AllocMem(SizeOf(TPointArray));
- with Chunk.Data.PointArray^ do
- begin
- Vertices := ReadWord;
- PointList := AllocMem(Vertices * SizeOf(TPoint3DS));
- // for I := 0 to Vertices - 1 do PointList[I] := ReadPoint;
- ReadData(Vertices * SizeOf(TPoint3DS), PointList);
- end;
- end;
- POINT_FLAG_ARRAY:
- begin
- Chunk.Data.PointFlagArray := AllocMem(SizeOf(TPointFlagArray));
- with Chunk.Data.PointFlagArray^ do
- begin
- Flags := ReadWord;
- FlagList := AllocMem(Flags * SizeOf(SmallInt));
- // for I := 0 to Flags - 1 do FlagList[I] := ReadShort;
- ReadData(Flags * SizeOf(SmallInt), FlagList);
- end;
- end;
- FACE_ARRAY:
- begin
- Chunk.Data.FaceArray := AllocMem(SizeOf(TFaceArray));
- with Chunk.Data.FaceArray^ do
- begin
- Faces := ReadWord;
- FaceList := AllocMem(Faces * SizeOf(TFace3DS));
- // for I := 0 to Faces - 1 do FaceList[I] := ReadFace;
- ReadData(Faces * SizeOf(TFace3DS), FaceList);
- end;
- end;
- MSH_MAT_GROUP:
- begin
- Chunk.Data.MshMatGroup := AllocMem(SizeOf(TMshMatGroup));
- with Chunk.Data.MshMatGroup^ do
- begin
- MatNameStr := AnsiString(StrPasFree(ReadString));
- Faces := ReadWord;
- if Faces > 0 then
- begin
- FaceList := AllocMem(Faces * SizeOf(Word));
- // for I := 0 to Faces - 1 do FaceList[I] := ReadWord;
- ReadData(Faces * SizeOf(Word), FaceList);
- end
- else
- FaceList := nil;
- end;
- end;
- MSH_BOXMAP:
- begin
- Chunk.Data.MshBoxmap := AllocMem(SizeOf(TMshBoxmap));
- for I := 0 to 5 do
- Chunk.Data.MshBoxmap[I] := ReadString;
- end;
- SMOOTH_GROUP:
- begin
- Chunk.Data.SmoothGroup := AllocMem(SizeOf(TSmoothGroup));
- with Chunk.Data.SmoothGroup^ do
- begin
- Groups := (Chunk.Size - 6) div 4;
- GroupList := AllocMem(Groups * SizeOf(Cardinal));
- // for I := 0 to Groups - 1 do GroupList[I] := ReadCardinal;
- ReadData(Groups * SizeOf(Cardinal), GroupList);
- end;
- end;
- TEX_VERTS:
- begin
- Chunk.Data.TexVerts := AllocMem(SizeOf(TTexVerts));
- with Chunk.Data.TexVerts^ do
- begin
- NumCoords := ReadWord;
- TextVertList := AllocMem(NumCoords * SizeOf(TTexVert3DS));
- // for I := 0 to NumCoords - 1 do TextVertList[I] := ReadTexVert;
- ReadData(NumCoords * SizeOf(TTexVert3DS), TextVertList);
- end;
- end;
- MESH_MATRIX:
- begin
- Chunk.Data.MeshMatrix := AllocMem(SizeOf(TMeshMatrix));
- for I := 0 to 11 do
- Chunk.Data.MeshMatrix[I] := ReadSingle;
- end;
- MESH_COLOR:
- begin
- Chunk.Data.MeshColor := AllocMem(SizeOf(TMeshColor));
- Chunk.Data.MeshColor^ := ReadByte;
- end;
- MESH_TEXTURE_INFO:
- begin
- Chunk.Data.MeshTextureInfo := AllocMem(SizeOf(TMeshTextureInfo));
- with Chunk.Data.MeshTextureInfo^ do
- begin
- MapType := ReadWord;
- XTiling := ReadSingle;
- YTiling := ReadSingle;
- IconPos := ReadPoint();
- IconScaling := ReadSingle;
- for I := 0 to 11 do
- XMatrix[I] := ReadSingle;
- IconWidth := ReadSingle;
- IconHeight := ReadSingle;
- CylIconHeight := ReadSingle;
- end;
- end;
- PROC_NAME:
- begin
- // Chunk.Data.ProcName := AllocMem(SizeOf(TProcName));
- Chunk.Data.ProcName := ReadString;
- end;
- N_DIRECT_LIGHT:
- begin
- Chunk.Data.NDirectLight := AllocMem(SizeOf(TNDirectLight));
- Chunk.Data.NDirectLight^ := ReadPoint;
- end;
- DL_EXCLUDE:
- begin
- // Chunk.Data.DlExclude := AllocMem(SizeOf(TDlExclude));
- Chunk.Data.DlExclude := ReadString;
- end;
- DL_INNER_RANGE:
- begin
- Chunk.Data.DlInnerRange := AllocMem(SizeOf(TDlInnerRange));
- Chunk.Data.DlInnerRange^ := ReadSingle;
- end;
- DL_OUTER_RANGE:
- begin
- Chunk.Data.DlOuterRange := AllocMem(SizeOf(TDlOuterRange));
- Chunk.Data.DlOuterRange^ := ReadSingle;
- end;
- DL_MULTIPLIER:
- begin
- Chunk.Data.DlMultiplier := AllocMem(SizeOf(TDlMultiplier));
- Chunk.Data.DlMultiplier^ := ReadSingle;
- end;
- DL_SPOTLIGHT:
- begin
- Chunk.Data.DlSpotlight := AllocMem(SizeOf(TDlSpotlight));
- with Chunk.Data.DlSpotlight^ do
- begin
- SpotlightTarg := ReadPoint;
- HotspotAngle := ReadSingle;
- FalloffAngle := ReadSingle;
- end;
- end;
- DL_LOCAL_SHADOW2:
- begin
- Chunk.Data.DlLocalShadow2 := AllocMem(SizeOf(TDlLocalShadow2));
- with Chunk.Data.DlLocalShadow2^ do
- begin
- LocalShadowBias := ReadSingle;
- LocalShadowFilter := ReadSingle;
- LocalShadowMapSize := ReadShort;
- end;
- end;
- DL_SPOT_ROLL:
- begin
- Chunk.Data.DlSpotRoll := AllocMem(SizeOf(TDlSpotRoll));
- Chunk.Data.DlSpotRoll^ := ReadSingle;
- end;
- DL_SPOT_ASPECT:
- begin
- Chunk.Data.DlSpotAspect := AllocMem(SizeOf(TDlSpotAspect));
- Chunk.Data.DlSpotAspect^ := ReadSingle;
- end;
- DL_SPOT_PROJECTOR:
- begin
- // Chunk.Data.DlSpotProjector := AllocMem(SizeOf(TDlSpotProjector));
- Chunk.Data.DlSpotProjector := ReadString;
- end;
- DL_RAY_BIAS:
- begin
- Chunk.Data.DlRayBias := AllocMem(SizeOf(TDlRayBias));
- Chunk.Data.DlRayBias^ := ReadSingle;
- end;
- N_CAMERA:
- begin
- Chunk.Data.NCamera := AllocMem(SizeOf(TNCamera));
- with Chunk.Data.NCamera^ do
- begin
- CameraPos := ReadPoint;
- TargetPos := ReadPoint;
- CameraBank := ReadSingle;
- CameraFocalLength := ReadSingle;
- end;
- end;
- CAM_RANGES:
- begin
- Chunk.Data.CamRanges := AllocMem(SizeOf(TCamRanges));
- with Chunk.Data.CamRanges^ do
- begin
- NearPlane := ReadSingle;
- FarPlane := ReadSingle;
- end;
- end;
- VIEWPORT_LAYOUT:
- begin
- Chunk.Data.ViewportLayout := AllocMem(SizeOf(TViewportLayout));
- with Chunk.Data.ViewportLayout^ do
- begin
- Form := ReadShort;
- Top := ReadShort;
- Ready := ReadShort;
- WState := ReadShort;
- SwapWS := ReadShort;
- SwapPort := ReadShort;
- SwapCur := ReadShort;
- end;
- end;
- VIEWPORT_SIZE:
- begin
- Chunk.Data.ViewportSize := AllocMem(SizeOf(TViewportSize));
- with Chunk.Data.ViewportSize^ do
- begin
- XPos := ReadWord;
- YPos := ReadWord;
- Width := ReadWord;
- Height := ReadWord;
- end;
- end;
- VIEWPORT_DATA_3,
- VIEWPORT_DATA:
- begin
- Chunk.Data.ViewportData := AllocMem(SizeOf(TViewportData));
- with Chunk.Data.ViewportData^ do
- begin
- Flags := ReadShort;
- AxisLockout := ReadShort;
- WinXPos := ReadShort;
- WinYPos := ReadShort;
- WinWidth := ReadShort;
- WinHeight := ReadShort;
- View := ReadShort;
- ZoomFactor := ReadSingle;
- Center := ReadPoint;
- HorizAng := ReadSingle;
- VertAng := ReadSingle;
- CamNameStr := AnsiString(StrPasFree(ReadString));
- end;
- end;
- XDATA_ENTRY:
- begin
- InitChunkData(Chunk);
- with Chunk.Data.XDataEntry^ do
- begin
- Size := (Chunk.Size) - 6;
- Data := AllocMem(Size);
- ReadData(Size, Data);
- end;
- end;
- XDATA_APPNAME:
- begin
- Chunk.Data.XDataAppName := ReadString;
- end;
- XDATA_STRING:
- begin
- Chunk.Data.XDataString := ReadString;
- end;
- KFHDR:
- begin
- Chunk.Data.KFHDR := AllocMem(SizeOf(TKFHdr));
- with Chunk.Data.KFHDR^ do
- begin
- Revision := ReadShort;
- FileName := StrPasFree(ReadString);
- AnimLength := ReadInteger;
- end;
- end;
- KFSEG:
- begin
- Chunk.Data.KFSEG := AllocMem(SizeOf(TKFSeg));
- with Chunk.Data.KFSEG^ do
- begin
- First := ReadInteger;
- Last := ReadInteger;
- end;
- end;
- KFCURTIME:
- begin
- Chunk.Data.KFCURTIME := AllocMem(SizeOf(TKFCurtime));
- Chunk.Data.KFCURTIME^ := ReadInteger;
- end;
- NODE_ID:
- begin
- Chunk.Data.KFID := AllocMem(SizeOf(TKFId));
- Chunk.Data.KFID^ := ReadShort;
- end;
- NODE_HDR:
- begin
- Chunk.Data.NodeHdr := AllocMem(SizeOf(TNodeHdr));
- with Chunk.Data.NodeHdr^ do
- begin
- ObjNameStr := StrPasFree(ReadString);
- Flags1 := ReadWord;
- Flags2 := ReadWord;
- ParentIndex := ReadShort;
- end;
- end;
- PIVOT:
- begin
- Chunk.Data.PIVOT := AllocMem(SizeOf(TPivot));
- Chunk.Data.PIVOT^ := ReadPoint;
- end;
- INSTANCE_NAME:
- begin
- Chunk.Data.InstanceName := ReadString;
- end;
- PARENT_NAME:
- ; // do nothing
- MORPH_SMOOTH:
- begin
- Chunk.Data.MorphSmooth := AllocMem(SizeOf(TMorphSmooth));
- Chunk.Data.MorphSmooth^ := ReadSingle;
- end;
- BOUNDBOX:
- begin
- Chunk.Data.BOUNDBOX := AllocMem(SizeOf(TBoundBox));
- with Chunk.Data.BOUNDBOX^ do
- begin
- Min := ReadPoint;
- Max := ReadPoint;
- end;
- end;
- POS_TRACK_TAG:
- begin
- Chunk.Data.PosTrackTag := AllocMem(SizeOf(TPosTrackTag));
- with Chunk.Data.PosTrackTag^ do
- begin
- TrackHdr := ReadTrackHeader;
- KeyHdrList := AllocMem(TrackHdr.KeyCount * SizeOf(TKeyHeader3DS));
- PositionList := AllocMem(TrackHdr.KeyCount * SizeOf(TPoint3DS));
- for I := 0 to TrackHdr.KeyCount - 1 do
- begin
- KeyHdrList[I] := ReadKeyHeader;
- PositionList[I] := ReadPoint;
- end;
- end;
- end;
- COL_TRACK_TAG:
- begin
- Chunk.Data.ColTrackTag := AllocMem(SizeOf(TColTrackTag));
- with Chunk.Data.ColTrackTag^ do
- begin
- TrackHdr := ReadTrackHeader;
- ColorList := AllocMem(TrackHdr.KeyCount * SizeOf(TFColor3DS));
- KeyHdrList := AllocMem(TrackHdr.KeyCount * SizeOf(TKeyHeader3DS));
- for I := 0 to TrackHdr.KeyCount - 1 do
- begin
- KeyHdrList[I] := ReadKeyHeader;
- ColorList[I].R := ReadSingle;
- ColorList[I].G := ReadSingle;
- ColorList[I].B := ReadSingle;
- end;
- end;
- end;
- ROT_TRACK_TAG:
- begin
- Chunk.Data.RotTrackTag := AllocMem(SizeOf(TRotTrackTag));
- with Chunk.Data.RotTrackTag^ do
- begin
- TrackHdr := ReadTrackHeader;
- KeyHdrList := AllocMem(TrackHdr.KeyCount * SizeOf(TKeyHeader3DS));
- RotationList := AllocMem(TrackHdr.KeyCount * SizeOf(TKFrotkey3DS));
- for I := 0 to TrackHdr.KeyCount - 1 do
- begin
- KeyHdrList[I] := ReadKeyHeader;
- RotationList[I].Angle := ReadSingle;
- RotationList[I].X := ReadSingle;
- RotationList[I].Y := ReadSingle;
- RotationList[I].Z := ReadSingle;
- end;
- end;
- end;
- SCL_TRACK_TAG:
- begin
- Chunk.Data.ScaleTrackTag := AllocMem(SizeOf(TScaleTrackTag));
- with Chunk.Data.ScaleTrackTag^ do
- begin
- TrackHdr := ReadTrackHeader;
- KeyHdrList := AllocMem(TrackHdr.KeyCount * SizeOf(TKeyHeader3DS));
- ScaleList := AllocMem(TrackHdr.KeyCount * SizeOf(TPoint3DS));
- for I := 0 to TrackHdr.KeyCount - 1 do
- begin
- KeyHdrList[I] := ReadKeyHeader;
- ScaleList[I].X := ReadSingle;
- ScaleList[I].Y := ReadSingle;
- ScaleList[I].Z := ReadSingle;
- end;
- end;
- end;
- MORPH_TRACK_TAG:
- begin
- Chunk.Data.MorphTrackTag := AllocMem(SizeOf(TMorphTrackTag));
- with Chunk.Data.MorphTrackTag^ do
- begin
- TrackHdr := ReadTrackHeader;
- KeyHdrList := AllocMem(TrackHdr.KeyCount * SizeOf(TKeyHeader3DS));
- MorphList := AllocMem(TrackHdr.KeyCount * SizeOf(TKFmorphKey3DS));
- for I := 0 to TrackHdr.KeyCount - 1 do
- begin
- KeyHdrList[I] := ReadKeyHeader;
- MorphList[I] := StrPasFree(ReadString);
- end;
- end;
- end;
- FOV_TRACK_TAG:
- begin
- Chunk.Data.FovTrackTag := AllocMem(SizeOf(TFovTrackTag));
- with Chunk.Data.FovTrackTag^ do
- begin
- TrackHdr := ReadTrackHeader;
- KeyHdrList := AllocMem(TrackHdr.KeyCount * SizeOf(TKeyHeader3DS));
- FOVAngleList := AllocMem(TrackHdr.KeyCount * SizeOf(Single));
- for I := 0 to TrackHdr.KeyCount - 1 do
- begin
- KeyHdrList[I] := ReadKeyHeader;
- FOVAngleList[I] := ReadSingle;
- end;
- end;
- end;
- ROLL_TRACK_TAG:
- begin
- Chunk.Data.RollTrackTag := AllocMem(SizeOf(TRollTrackTag));
- with Chunk.Data.RollTrackTag^ do
- begin
- TrackHdr := ReadTrackHeader;
- KeyHdrList := AllocMem(TrackHdr.KeyCount * SizeOf(TKeyHeader3DS));
- RollAngleList := AllocMem(TrackHdr.KeyCount * SizeOf(Single));
- for I := 0 to TrackHdr.KeyCount - 1 do
- begin
- KeyHdrList[I] := ReadKeyHeader;
- RollAngleList[I] := ReadSingle;
- end;
- end;
- end;
- HOT_TRACK_TAG:
- begin
- Chunk.Data.HotTrackTag := AllocMem(SizeOf(THotTrackTag));
- with Chunk.Data.HotTrackTag^ do
- begin
- TrackHdr := ReadTrackHeader;
- KeyHdrList := AllocMem(TrackHdr.KeyCount * SizeOf(TKeyHeader3DS));
- HotspotAngleList := AllocMem(TrackHdr.KeyCount * SizeOf(Single));
- for I := 0 to TrackHdr.KeyCount - 1 do
- begin
- KeyHdrList[I] := ReadKeyHeader;
- HotspotAngleList[I] := ReadSingle;
- end;
- end;
- end;
- FALL_TRACK_TAG:
- begin
- Chunk.Data.FallTrackTag := AllocMem(SizeOf(TFallTrackTag));
- with Chunk.Data.FallTrackTag^ do
- begin
- TrackHdr := ReadTrackHeader;
- KeyHdrList := AllocMem(TrackHdr.KeyCount * SizeOf(TKeyHeader3DS));
- FalloffAngleList := AllocMem(TrackHdr.KeyCount * SizeOf(Single));
- for I := 0 to TrackHdr.KeyCount - 1 do
- begin
- KeyHdrList[I] := ReadKeyHeader;
- FalloffAngleList[I] := ReadSingle;
- end;
- end;
- end;
- HIDE_TRACK_TAG:
- begin
- Chunk.Data.HideTrackTag := AllocMem(SizeOf(THideTrackTag));
- with Chunk.Data.HideTrackTag^ do
- begin
- TrackHdr := ReadTrackHeader;
- KeyHdrList := AllocMem(TrackHdr.KeyCount * SizeOf(TKeyHeader3DS));
- for I := 0 to TrackHdr.KeyCount - 1 do
- KeyHdrList[I] := ReadKeyHeader;
- end;
- end;
- M3DMAGIC, // Chunks that do not contain data, or only contain children
- MLIBMAGIC,
- MDATA,
- AMBIENT_LIGHT,
- SOLID_BGND,
- DEFAULT_VIEW,
- MAT_ENTRY,
- MAT_AMBIENT,
- MAT_DIFFUSE,
- MAT_SPECULAR,
- MAT_SHININESS,
- MAT_SHIN2PCT,
- MAT_SHIN3PCT,
- MAT_TRANSPARENCY,
- MAT_XPFALL,
- MAT_REFBLUR,
- MAT_SELF_ILPCT,
- MAT_TEXMAP,
- MAT_TEXMASK,
- MAT_TEX2MAP,
- MAT_TEX2MASK,
- MAT_OPACMAP,
- MAT_OPACMASK,
- MAT_REFLMAP,
- MAT_REFLMASK,
- MAT_BUMPMAP,
- MAT_BUMPMASK,
- MAT_SPECMAP,
- MAT_SPECMASK,
- MAT_SHINMAP,
- MAT_SHINMASK,
- MAT_SELFIMAP,
- MAT_SELFIMASK,
- N_TRI_OBJECT,
- KFDATA,
- AMBIENT_NODE_TAG,
- OBJECT_NODE_TAG,
- CAMERA_NODE_TAG,
- TARGET_NODE_TAG,
- LIGHT_NODE_TAG,
- SPOTLIGHT_NODE_TAG,
- L_TARGET_NODE_TAG,
- CMAGIC,
- XDATA_SECTION,
- XDATA_GROUP:
- ; // do nothing
- else // a truely hideous thing to do, but it helps with unknown chunks
- if Chunk.Size > 6 then // don't mess with dataless chunks
- begin
- Chunk.Data.Dummy := AllocMem(Chunk.Size - 6);
- ReadData(Chunk.Size - 6, Chunk.Data.Dummy);
- end;
- end; // end of case
- end;
- end;
- //---------------------------------------------------------------------------------------------------------------------
- procedure TFile3DS.SeekChild(Chunk: PChunk3DS);
- // Function skips to next Chunk on disk by seeking the next file position
- var
- Offset: Integer;
- begin
- Offset := 0;
- case Chunk.Tag of
- M3DMAGIC,
- SMAGIC,
- LMAGIC,
- MATMAGIC,
- MLIBMAGIC,
- MDATA,
- AMBIENT_LIGHT,
- SOLID_BGND,
- DEFAULT_VIEW,
- MAT_ENTRY,
- MAT_AMBIENT,
- MAT_DIFFUSE,
- MAT_SPECULAR,
- MAT_SHININESS,
- MAT_SHIN2PCT,
- MAT_SHIN3PCT,
- MAT_TRANSPARENCY,
- MAT_XPFALL,
- MAT_REFBLUR,
- MAT_SELF_ILPCT,
- MAT_TEXMAP,
- MAT_TEXMASK,
- MAT_TEX2MAP,
- MAT_TEX2MASK,
- MAT_OPACMAP,
- MAT_OPACMASK,
- MAT_REFLMAP,
- MAT_REFLMASK,
- MAT_BUMPMAP,
- MAT_BUMPMASK,
- MAT_SPECMAP,
- MAT_SPECMASK,
- MAT_SHINMAP,
- MAT_SHINMASK,
- MAT_SELFIMAP,
- MAT_SELFIMASK,
- N_TRI_OBJECT,
- XDATA_SECTION,
- XDATA_ENTRY,
- KFDATA,
- OBJECT_NODE_TAG,
- CAMERA_NODE_TAG,
- TARGET_NODE_TAG,
- LIGHT_NODE_TAG,
- SPOTLIGHT_NODE_TAG,
- L_TARGET_NODE_TAG,
- AMBIENT_NODE_TAG,
- CMAGIC :
- ; // do nothing
- M3D_VERSION:
- Offset := SizeOf(Integer);
- COLOR_F:
- Offset := 3 * SizeOf(Single);
- COLOR_24:
- Offset := 3 * SizeOf(Byte);
- INT_PERCENTAGE:
- Offset := SizeOf(SmallInt);
- FLOAT_PERCENTAGE:
- Offset := SizeOf(Single);
- MAT_MAPNAME:
- FreeMem(ReadString);
- MESH_VERSION:
- Offset := SizeOf(Integer);
- MASTER_SCALE:
- Offset := SizeOf(Single);
- LO_SHADOW_BIAS:
- Offset := SizeOf(Single);
- HI_SHADOW_BIAS:
- Offset := SizeOf(Single);
- SHADOW_MAP_SIZE:
- Offset := SizeOf(SmallInt);
- SHADOW_SAMPLES:
- Offset := SizeOf(SmallInt);
- O_CONSTS:
- Offset := 12;
- V_GRADIENT:
- Offset := SizeOf(Single);
- NAMED_OBJECT:
- FreeMem(ReadString);
- BIT_MAP:
- FreeMem(ReadString);
- FOG:
- Offset := 4 * SizeOf(Single);
- LAYER_FOG:
- Offset := 3 * SizeOf(Single) + SizeOf(Integer);
- DISTANCE_CUE:
- Offset := 4 * SizeOf(Single);
- N_DIRECT_LIGHT:
- Offset := 12;
- DL_SPOTLIGHT:
- Offset := 12 + 2 * SizeOf(Single);
- N_CAMERA:
- Offset := 24 + 2 * SizeOf(Single);
- VIEWPORT_LAYOUT:
- Offset := 7 * SizeOf(SmallInt);
- VIEW_TOP,
- VIEW_BOTTOM,
- VIEW_LEFT,
- VIEW_RIGHT,
- VIEW_FRONT,
- VIEW_BACK:
- Offset := 12 + SizeOf(Single);
- VIEW_USER:
- Offset := 12 + 4 * SizeOf(Single);
- VIEW_CAMERA:
- FreeMem(ReadString);
- MAT_NAME:
- FreeMem(ReadString);
- MAT_ACUBIC:
- Offset := 2 * SizeOf(Byte) + 2 * SizeOf(Integer) + SizeOf(SmallInt);
- POINT_ARRAY,
- POINT_FLAG_ARRAY:
- Offset := Chunk.Size - 6;
- FACE_ARRAY:
- Offset := ReadWord * SizeOf(SmallInt) * 4;
- MSH_MAT_GROUP:
- Offset := Chunk.Size - 6;
- SMOOTH_GROUP:
- Offset := Chunk.Size - 6;
- TEX_VERTS:
- Offset := Chunk.Size - 6;
- MESH_MATRIX:
- Offset := 12 * SizeOf(Single);
- MESH_TEXTURE_INFO:
- Offset := Chunk.Size - 6;
- PROC_NAME:
- FreeMem(ReadString);
- DL_LOCAL_SHADOW2:
- Offset := 2 * SizeOf(Single) + SizeOf(SmallInt);
- KFHDR:
- begin
- ReadShort;
- FreeMem(ReadString);
- ReadInteger;
- end;
- KFSEG:
- Offset := 2 * SizeOf(Integer);
- KFCURTIME:
- Offset := SizeOf(Integer);
- NODE_HDR:
- begin
- FreeMem(ReadString);
- Offset := 2 * SizeOf(SmallInt) + SizeOf(SmallInt);
- end;
- NODE_ID:
- Offset := SizeOf(SmallInt);
- PIVOT:
- Offset := 12;
- INSTANCE_NAME:
- FreeMem(ReadString);
- MORPH_SMOOTH:
- Offset := SizeOf(Single);
- BOUNDBOX:
- Offset := 24;
- VPDATA:
- Offset := SizeOf(Integer);
- else
- Offset := Chunk.Size - 6;
- end;
- FStream.Seek(Offset, soFromCurrent);
- end;
- //---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.GetDatabaseRelease: TReleaseLevel;
- begin
- Result := Formatx.m3DSUtils.GetDatabaseRelease(Self, FDatabase);
- end;
- //---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.GetMeshRelease: TReleaseLevel;
- begin
- Result := Formatx.m3DSUtils.GetMeshRelease(Self, FDatabase);
- end;
- //---------------------------------------------------------------------------------------------------------------------
- end.
|