3412 |
} |
} |
3413 |
|
|
3414 |
File* pFile = (File*) GetParent()->GetParent(); |
File* pFile = (File*) GetParent()->GetParent(); |
3415 |
bool versiongt2 = pFile->pVersion && pFile->pVersion->major > 2; |
const bool versiongt2 = pFile->pVersion && pFile->pVersion->major > 2; |
3416 |
const int iMaxDimensions = versiongt2 ? 8 : 5; |
const int iMaxDimensions = versiongt2 ? 8 : 5; |
3417 |
const int iMaxDimensionRegions = versiongt2 ? 256 : 32; |
const int iMaxDimensionRegions = versiongt2 ? 256 : 32; |
3418 |
|
|
3459 |
} |
} |
3460 |
store32(&pData[iWavePoolOffset + i * 4], iWaveIndex); |
store32(&pData[iWavePoolOffset + i * 4], iWaveIndex); |
3461 |
} |
} |
3462 |
|
|
3463 |
|
if (versiongt2) { |
3464 |
|
// add 3dnm list which always seems to be empty |
3465 |
|
RIFF::List* _3dnm = pCkRegion->GetSubList(LIST_TYPE_3DNM); |
3466 |
|
if (!_3dnm) _3dnm = pCkRegion->AddSubList(LIST_TYPE_3DNM); |
3467 |
|
|
3468 |
|
// add 3ddp chunk which always seems to have 16 bytes of 0xFF |
3469 |
|
RIFF::Chunk* _3ddp = pCkRegion->GetSubChunk(CHUNK_ID_3DDP); |
3470 |
|
if (!_3ddp) _3ddp = pCkRegion->AddSubChunk(CHUNK_ID_3DDP, 16); |
3471 |
|
uint8_t* pData = (uint8_t*) _3ddp->LoadChunkData(); |
3472 |
|
for (int i = 0; i < 16; i += 4) { |
3473 |
|
store32(&pData[i], 0xFFFFFFFF); |
3474 |
|
} |
3475 |
|
|
3476 |
|
// move 3dnm and 3ddp to the end of the region list |
3477 |
|
pCkRegion->MoveSubChunk(pCkRegion->GetSubList(LIST_TYPE_3DNM), (RIFF::Chunk*)NULL); |
3478 |
|
pCkRegion->MoveSubChunk(pCkRegion->GetSubChunk(CHUNK_ID_3DDP), (RIFF::Chunk*)NULL); |
3479 |
|
} else { |
3480 |
|
// this is intended for the user switching from GSt >= 3 version |
3481 |
|
// back to an older format version, delete GSt3 chunks ... |
3482 |
|
RIFF::List* _3dnm = pCkRegion->GetSubList(LIST_TYPE_3DNM); |
3483 |
|
if (_3dnm) pCkRegion->DeleteSubChunk(_3dnm); |
3484 |
|
|
3485 |
|
RIFF::Chunk* _3ddp = pCkRegion->GetSubChunk(CHUNK_ID_3DDP); |
3486 |
|
if (_3ddp) pCkRegion->DeleteSubChunk(_3ddp); |
3487 |
|
} |
3488 |
} |
} |
3489 |
|
|
3490 |
void Region::LoadDimensionRegions(RIFF::List* rgn) { |
void Region::LoadDimensionRegions(RIFF::List* rgn) { |
4023 |
// now tempRegion's dimensions and DimensionRegions basically reflect |
// now tempRegion's dimensions and DimensionRegions basically reflect |
4024 |
// what we wanted to get for this actual Region here, so we now just |
// what we wanted to get for this actual Region here, so we now just |
4025 |
// delete and recreate the dimension in question with the new amount |
// delete and recreate the dimension in question with the new amount |
4026 |
// zones and then copy back from tempRegion |
// zones and then copy back from tempRegion. we're actually deleting and |
4027 |
DeleteDimension(oldDef); |
// recreating all dimensions here, to avoid altering the precise order |
4028 |
AddDimension(&newDef); |
// of the dimensions (which would not be an error per so, but it would |
4029 |
|
// cause usability issues with instrument editors) |
4030 |
|
{ |
4031 |
|
std::vector<dimension_def_t> oldDefs; |
4032 |
|
for (int i = 0; i < Dimensions; ++i) |
4033 |
|
oldDefs.push_back(pDimensionDefinitions[i]); // copy, don't reference |
4034 |
|
for (int i = Dimensions - 1; i >= 0; --i) |
4035 |
|
DeleteDimension(&pDimensionDefinitions[i]); |
4036 |
|
for (int i = 0; i < oldDefs.size(); ++i) { |
4037 |
|
dimension_def_t& def = oldDefs[i]; |
4038 |
|
AddDimension( |
4039 |
|
(def.dimension == newDef.dimension) ? &newDef : &def |
4040 |
|
); |
4041 |
|
} |
4042 |
|
} |
4043 |
for (int iSrc = 0; iSrc < 256; ++iSrc) { |
for (int iSrc = 0; iSrc < 256; ++iSrc) { |
4044 |
DimensionRegion* srcDimRgn = tempRgn->pDimensionRegions[iSrc]; |
DimensionRegion* srcDimRgn = tempRgn->pDimensionRegions[iSrc]; |
4045 |
if (!srcDimRgn) continue; |
if (!srcDimRgn) continue; |
6665 |
if (pVersion && pVersion->major > 2) { |
if (pVersion && pVersion->major > 2) { |
6666 |
RIFF::Chunk* _3gnm = _3gnl->GetFirstSubChunk(); |
RIFF::Chunk* _3gnm = _3gnl->GetFirstSubChunk(); |
6667 |
for (int i = 0 ; i < 128 ; i++) { |
for (int i = 0 ; i < 128 ; i++) { |
6668 |
if (i >= pGroups->size()) ::SaveString(CHUNK_ID_3GNM, _3gnm, _3gnl, "", "", true, 64); |
// create 128 empty placeholder strings which will either |
6669 |
|
// be filled by Group::UpdateChunks below or left empty. |
6670 |
|
::SaveString(CHUNK_ID_3GNM, _3gnm, _3gnl, "", "", true, 64); |
6671 |
if (_3gnm) _3gnm = _3gnl->GetNextSubChunk(); |
if (_3gnm) _3gnm = _3gnl->GetNextSubChunk(); |
6672 |
} |
} |
6673 |
} |
} |