1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971 |
- //
- // The graphics engine GLScene
- //
- unit Formats.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,
- Formats.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
- Formats.m3DSConst,
- Formats.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 := Formats.m3DSUtils.GetDatabaseRelease(Self, FDatabase);
- end;
- //---------------------------------------------------------------------------------------------------------------------
- function TFile3DS.GetMeshRelease: TReleaseLevel;
- begin
- Result := Formats.m3DSUtils.GetMeshRelease(Self, FDatabase);
- end;
- //---------------------------------------------------------------------------------------------------------------------
- end.
|