mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	
		
			Some checks failed
		
		
	
	Build coop / build-linux (push) Has been cancelled
				
			Build coop / build-steamos (push) Has been cancelled
				
			Build coop / build-windows-opengl (push) Has been cancelled
				
			Build coop / build-windows-directx (push) Has been cancelled
				
			Build coop / build-macos-arm (push) Has been cancelled
				
			Build coop / build-macos-intel (push) Has been cancelled
				
			geo layouts -> geo_* functions only behaviors -> bhv_* functions only level scripts -> lvl_* functions only other -> no function allowed thanks maniscat for reporting the issue
		
			
				
	
	
		
			97 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "dynos.cpp.h"
 | |
| 
 | |
| extern "C" {
 | |
| #include "include/level_misc_macros.h"
 | |
| #include "game/moving_texture.h"
 | |
| }
 | |
| 
 | |
| #pragma GCC diagnostic push
 | |
| #pragma GCC diagnostic ignored "-Wnarrowing"
 | |
| 
 | |
|   /////////////
 | |
|  // Parsing //
 | |
| /////////////
 | |
| 
 | |
| #define movtexqc_constant(x) if (_Arg == #x) { return (Movtex*) (x); }
 | |
| static Movtex* ParseMovtexQCSymbolArg(GfxData* aGfxData, DataNode<MovtexQC>* aNode, u64 aTokenIndex) {
 | |
|     const String& _Arg = aNode->mTokens[aTokenIndex];
 | |
| 
 | |
|     // Other constants
 | |
|     movtexqc_constant(NULL);
 | |
| 
 | |
|     // Movtexs
 | |
|     for (auto& _Node : aGfxData->mMovtexs) {
 | |
|         if (_Arg == _Node->mName) {
 | |
|             return DynOS_Movtex_Parse(aGfxData, _Node, false)->mData;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Unknown
 | |
|     PrintDataError("  ERROR: Unknown movtexqc arg: %s", _Arg.begin());
 | |
|     return NULL;
 | |
| }
 | |
| 
 | |
| DataNode<MovtexQC>* DynOS_MovtexQC_Parse(GfxData* aGfxData, DataNode<MovtexQC>* aNode) {
 | |
|     if (aNode->mData) return aNode;
 | |
| 
 | |
|     // MovtexQC data
 | |
|     aNode->mSize = (u32) (aNode->mTokens.Count() / 2);
 | |
|     aNode->mData = New<MovtexQC>(aNode->mSize);
 | |
|     for (u32 i = 0; i != aNode->mSize; ++i) {
 | |
|         s16 id = (s16) aNode->mTokens[2 * i + 0].ParseInt();
 | |
|         Movtex* quadArraySegmented = ParseMovtexQCSymbolArg(aGfxData, aNode, 2 * i + 1);
 | |
|         aNode->mData[i] = { id, quadArraySegmented };
 | |
|         aGfxData->mPointerList.Add(aNode->mData[i].quadArraySegmented);
 | |
|     }
 | |
|     aNode->mLoadIndex = aGfxData->mLoadIndex++;
 | |
|     return aNode;
 | |
| }
 | |
| 
 | |
| #pragma GCC diagnostic pop
 | |
| 
 | |
|   /////////////
 | |
|  // Writing //
 | |
| /////////////
 | |
| 
 | |
| void DynOS_MovtexQC_Write(BinFile* aFile, GfxData* aGfxData, DataNode<MovtexQC> *aNode) {
 | |
|     if (!aNode->mData) return;
 | |
| 
 | |
|     // Name
 | |
|     aFile->Write<u8>(DATA_TYPE_MOVTEXQC);
 | |
|     aNode->mName.Write(aFile);
 | |
| 
 | |
|     // Data
 | |
|     aFile->Write<u32>(aNode->mSize);
 | |
|     for (u32 i = 0; i != aNode->mSize; ++i) {
 | |
|         aFile->Write<s16>(aNode->mData[i].id);
 | |
|         DynOS_Pointer_Write(aFile, (const void *) (aNode->mData[i].quadArraySegmented), aGfxData, 0);
 | |
|     }
 | |
| }
 | |
| 
 | |
|   /////////////
 | |
|  // Reading //
 | |
| /////////////
 | |
| 
 | |
| DataNode<MovtexQC>* DynOS_MovtexQC_Load(BinFile *aFile, GfxData *aGfxData) {
 | |
|     DataNode<MovtexQC> *_Node = New<DataNode<MovtexQC>>();
 | |
| 
 | |
|     // Name
 | |
|     _Node->mName.Read(aFile);
 | |
| 
 | |
|     // Data
 | |
|     _Node->mSize = aFile->Read<u32>();
 | |
|     _Node->mData = New<MovtexQC>(_Node->mSize);
 | |
|     for (u32 i = 0; i != _Node->mSize; ++i) {
 | |
|         _Node->mData[i].id = aFile->Read<s16>();
 | |
|         u32 _Value = aFile->Read<u32>();
 | |
|         void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value, 0, &_Node->mFlags);
 | |
|         _Node->mData[i].quadArraySegmented = (Movtex*)_Ptr;
 | |
|     }
 | |
| 
 | |
|     // Add it
 | |
|     if (aGfxData != NULL) {
 | |
|         aGfxData->mMovtexQCs.Add(_Node);
 | |
|     }
 | |
| 
 | |
|     return _Node;
 | |
| }
 |