16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 19:49:19 +02:00

Usunięte out_of_range z zapisu e3d i szukania eventow skanowanych

This commit is contained in:
firleju
2017-01-26 06:14:45 +01:00
parent 4ad5ac1b51
commit 0900d93227
2 changed files with 210 additions and 208 deletions

View File

@@ -2234,8 +2234,7 @@ TEvent * TGround::FindEventScan(const string &asEventName)
TEvent *e = (TEvent *)sTracks->Find(0, asEventName.c_str()); // wyszukiwanie w drzewie eventów TEvent *e = (TEvent *)sTracks->Find(0, asEventName.c_str()); // wyszukiwanie w drzewie eventów
if (e) if (e)
return e; // jak istnieje, to w porządku return e; // jak istnieje, to w porządku
if (asEventName.substr(asEventName.length() - 4, 5) == if (asEventName.rfind(":scan") != std::string::npos) // jeszcze może być event niejawny
":scan") // jeszcze może być event niejawny
{ // no to szukamy komórki pamięci o nazwie zawartej w evencie { // no to szukamy komórki pamięci o nazwie zawartej w evencie
string n = asEventName.substr(0, asEventName.length() - 5); // do dwukropka string n = asEventName.substr(0, asEventName.length() - 5); // do dwukropka
if (sTracks->Find(TP_MEMCELL, n.c_str())) // jeśli jest takowa komórka pamięci if (sTracks->Find(TP_MEMCELL, n.c_str())) // jeśli jest takowa komórka pamięci

View File

@@ -183,7 +183,8 @@ void TSubModel::NameSet(const char *n)
// int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 // int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3
// *pt,GLVERTEX // *pt,GLVERTEX
// *Vertices) // *Vertices)
int TSubModel::SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, float3 *pt, float8 *Vertices) int TSubModel::SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, float3 *pt,
float8 *Vertices)
{ // szukanie punktu stycznego { // szukanie punktu stycznego
// do (pt), zwraca numer // do (pt), zwraca numer
// wierzchołka, a nie trójkąta // wierzchołka, a nie trójkąta
@@ -217,22 +218,14 @@ template <typename ColorT> inline void readColor(cParser &parser, ColorT *color)
{ {
double discard; double discard;
parser.getTokens(4, false); parser.getTokens(4, false);
parser parser >> discard >> color[0] >> color[1] >> color[2];
>> discard
>> color[ 0 ]
>> color[ 1 ]
>> color[ 2 ];
}; };
inline void readColor(cParser &parser, int &color) inline void readColor(cParser &parser, int &color)
{ {
int r, g, b, discard; int r, g, b, discard;
parser.getTokens(4, false); parser.getTokens(4, false);
parser parser >> discard >> r >> g >> b;
>> discard
>> r
>> g
>> b;
color = r + (g << 8) + (b << 16); color = r + (g << 8) + (b << 16);
}; };
/* /*
@@ -352,23 +345,16 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
}; };
if (eType == TP_FREESPOTLIGHT) if (eType == TP_FREESPOTLIGHT)
{ {
if( !parser.expectToken( "nearattenstart:" ) ) { Error( "Model light parse failure!" ); } if (!parser.expectToken("nearattenstart:"))
{
Error("Model light parse failure!");
}
std::string discard; std::string discard;
parser.getTokens(13, false); parser.getTokens(13, false);
parser parser >> fNearAttenStart >> discard >> fNearAttenEnd >> discard >> bUseNearAtten >>
>> fNearAttenStart discard >> iFarAttenDecay >> discard >> fFarDecayRadius >> discard >>
>> discard fCosFalloffAngle // kąt liczony dla średnicy, a nie promienia
>> fNearAttenEnd >> discard >> fCosHotspotAngle; // kąt liczony dla średnicy, a nie promienia
>> discard
>> bUseNearAtten
>> discard
>> iFarAttenDecay
>> discard
>> fFarDecayRadius
>> discard
>> fCosFalloffAngle // kąt liczony dla średnicy, a nie promienia
>> discard
>> fCosHotspotAngle; // kąt liczony dla średnicy, a nie promienia
fCosFalloffAngle = cos(DegToRad(0.5 * fCosFalloffAngle)); fCosFalloffAngle = cos(DegToRad(0.5 * fCosFalloffAngle));
fCosHotspotAngle = cos(DegToRad(0.5 * fCosHotspotAngle)); fCosHotspotAngle = cos(DegToRad(0.5 * fCosHotspotAngle));
iNumVerts = 1; iNumVerts = 1;
@@ -379,13 +365,9 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
{ {
std::string discard; std::string discard;
parser.getTokens(5, false); parser.getTokens(5, false);
parser parser >> discard >> bWire >> discard >> fWireSize >> discard;
>> discard Opacity = readIntAsDouble(parser,
>> bWire 100.0f); // wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste
>> discard
>> fWireSize
>> discard;
Opacity = readIntAsDouble(parser, 100.0f); // wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste
if (Opacity > 1.0) if (Opacity > 1.0)
Opacity *= 0.01; // w 2013 był błąd i aby go obejść, trzeba było wpisać 10000.0 Opacity *= 0.01; // w 2013 był błąd i aby go obejść, trzeba było wpisać 10000.0
if ((Global::iConvertModels & 1) == 0) // dla zgodności wstecz if ((Global::iConvertModels & 1) == 0) // dla zgodności wstecz
@@ -450,15 +432,16 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
std::string discard; std::string discard;
parser.getTokens(5, false); parser.getTokens(5, false);
parser parser >> discard >> fSquareMaxDist >> discard >> fSquareMinDist >> discard;
>> discard
>> fSquareMaxDist
>> discard
>> fSquareMinDist
>> discard;
if( fSquareMaxDist >= 0.0 ) { fSquareMaxDist *= fSquareMaxDist; } if (fSquareMaxDist >= 0.0)
else { fSquareMaxDist = 15000 * 15000; }// 15km to więcej, niż się obecnie wyświetla {
fSquareMaxDist *= fSquareMaxDist;
}
else
{
fSquareMaxDist = 15000 * 15000;
} // 15km to więcej, niż się obecnie wyświetla
fSquareMinDist *= fSquareMinDist; fSquareMinDist *= fSquareMinDist;
fMatrix = new float4x4(); fMatrix = new float4x4();
readMatrix(parser, *fMatrix); // wczytanie transform readMatrix(parser, *fMatrix); // wczytanie transform
@@ -469,9 +452,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
if (eType < TP_ROTATOR) if (eType < TP_ROTATOR)
{ // wczytywanie wierzchołków { // wczytywanie wierzchołków
parser.getTokens(2, false); parser.getTokens(2, false);
parser parser >> discard >> token;
>> discard
>> token;
// Ra 15-01: to wczytać jako tekst - jeśli pierwszy znak zawiera "*", to // Ra 15-01: to wczytać jako tekst - jeśli pierwszy znak zawiera "*", to
// dalej będzie nazwa wcześniejszego submodelu, z którego należy wziąć // dalej będzie nazwa wcześniejszego submodelu, z którego należy wziąć
// wierzchołki // wierzchołki
@@ -517,23 +498,16 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
// wektorów normalnych // wektorów normalnych
} }
parser.getTokens(3, false); parser.getTokens(3, false);
parser parser >> Vertices[i].Point.x >> Vertices[i].Point.y >> Vertices[i].Point.z;
>> Vertices[i].Point.x
>> Vertices[i].Point.y
>> Vertices[i].Point.z;
if (maska == -1) if (maska == -1)
{ // jeśli wektory normalne podane jawnie { // jeśli wektory normalne podane jawnie
parser.getTokens(3, false); parser.getTokens(3, false);
parser parser >> Vertices[i].Normal.x >> Vertices[i].Normal.y >>
>> Vertices[i].Normal.x Vertices[i].Normal.z;
>> Vertices[i].Normal.y
>> Vertices[i].Normal.z;
wsp[i] = i; // wektory normalne "są już policzone" wsp[i] = i; // wektory normalne "są już policzone"
} }
parser.getTokens(2, false); parser.getTokens(2, false);
parser parser >> Vertices[i].tu >> Vertices[i].tv;
>> Vertices[i].tu
>> Vertices[i].tv;
if (i % 3 == 2) // jeżeli wczytano 3 punkty if (i % 3 == 2) // jeżeli wczytano 3 punkty
{ {
if (Vertices[i].Point == Vertices[i - 1].Point || if (Vertices[i].Point == Vertices[i - 1].Point ||
@@ -543,7 +517,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
--iNumFaces; // o jeden trójkąt mniej --iNumFaces; // o jeden trójkąt mniej
iNumVerts -= 3; // czyli o 3 wierzchołki iNumVerts -= 3; // czyli o 3 wierzchołki
i -= 3; // wczytanie kolejnego w to miejsce i -= 3; // wczytanie kolejnego w to miejsce
WriteLog(std::string("Degenerated triangle ignored in: \"") + pName + "\", verticle " + std::to_string(i)); WriteLog(std::string("Degenerated triangle ignored in: \"") + pName +
"\", verticle " + std::to_string(i));
} }
if (i > 0) // jeśli pierwszy trójkąt będzie zdegenerowany, to if (i > 0) // jeśli pierwszy trójkąt będzie zdegenerowany, to
// zostanie usunięty i nie ma co sprawdzać // zostanie usunięty i nie ma co sprawdzać
@@ -557,7 +532,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
--iNumFaces; // o jeden trójkąt mniej --iNumFaces; // o jeden trójkąt mniej
iNumVerts -= 3; // czyli o 3 wierzchołki iNumVerts -= 3; // czyli o 3 wierzchołki
i -= 3; // wczytanie kolejnego w to miejsce i -= 3; // wczytanie kolejnego w to miejsce
WriteLog( std::string("Too large triangle ignored in: \"") + pName + "\""); WriteLog(std::string("Too large triangle ignored in: \"") + pName +
"\"");
} }
} }
} }
@@ -614,23 +590,19 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
// dla smt_Mesh // dla smt_Mesh
std::string discard; std::string discard;
parser.getTokens(2, false); parser.getTokens(2, false);
parser parser >> discard >> iNumVerts;
>> discard
>> iNumVerts;
// Vertices=new GLVERTEX[iNumVerts]; // Vertices=new GLVERTEX[iNumVerts];
Vertices = new float8[iNumVerts]; Vertices = new float8[iNumVerts];
int i, j; int i, j;
for (i = 0; i < iNumVerts; i++) for (i = 0; i < iNumVerts; i++)
{ {
if( i % 3 == 0 ) { if (i % 3 == 0)
{
parser.ignoreToken(); // maska powierzchni trójkąta parser.ignoreToken(); // maska powierzchni trójkąta
} }
parser.getTokens(5, false); parser.getTokens(5, false);
parser parser >> Vertices[i].Point.x >> Vertices[i].Point.y >> Vertices[i].Point.z >>
>> Vertices[ i ].Point.x j // zakodowany kolor
>> Vertices[ i ].Point.y
>> Vertices[ i ].Point.z
>> j // zakodowany kolor
>> discard; >> discard;
Vertices[i].Normal.x = ((j)&0xFF) / 255.0; // R Vertices[i].Normal.x = ((j)&0xFF) / 255.0; // R
Vertices[i].Normal.y = ((j >> 8) & 0xFF) / 255.0; // G Vertices[i].Normal.y = ((j >> 8) & 0xFF) / 255.0; // G
@@ -1560,8 +1532,12 @@ void TSubModel::Info()
// w pliku (od 1) // w pliku (od 1)
std::string t(pTexture); std::string t(pTexture);
// trim extension // trim extension
if( t.substr( t.rfind( '.' ) ) == ".tga" ) { t.erase( t.rfind( '.' ) ); } size_t kropka = t.rfind('.');
else if( t.substr( t.rfind( '.' ) ) == ".dds" ) { t.erase( t.rfind( '.' ) ); } if (kropka != std::string::npos &&
(t.substr(kropka) == ".tga" || t.substr(kropka) == ".dds"))
{
t.erase(t.rfind('.'));
}
if (t != std::string(pTexture)) if (t != std::string(pTexture))
{ // jeśli się zmieniło { // jeśli się zmieniło
// pName=new char[token.length()+1]; //nie ma sensu skracać tabeli // pName=new char[token.length()+1]; //nie ma sensu skracać tabeli
@@ -1624,12 +1600,15 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS
if (false == name.empty()) if (false == name.empty())
{ // jeśli dany submodel jest zgaszonym światłem, to { // jeśli dany submodel jest zgaszonym światłem, to
// domyślnie go ukrywamy // domyślnie go ukrywamy
if( (name.size() >= 8) && (name.substr( 0, 8 ) == "Light_On") ) {// jeśli jest światłem numerowanym if ((name.size() >= 8) && (name.substr(0, 8) == "Light_On"))
{ // jeśli jest światłem numerowanym
iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z
} }
// obiektem "Light_Off" // obiektem "Light_Off"
else if( dynamic ) {// inaczej wyłączało smugę w latarniach else if (dynamic)
if( (name.size() >= 3) && (name.substr( name.size() - 3, 3 ) == "_on") ) {// jeśli jest kontrolką w stanie zapalonym { // inaczej wyłączało smugę w latarniach
if ((name.size() >= 3) && (name.substr(name.size() - 3, 3) == "_on"))
{ // jeśli jest kontrolką w stanie zapalonym
iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z
} }
} }
@@ -1721,7 +1700,8 @@ float TSubModel::MaxY(const float4x4 &m)
return 0; return 0;
if (!Vertices) if (!Vertices)
return 0; return 0;
float y, my = m[0][1] * Vertices[0].Point.x + m[1][1] * Vertices[0].Point.y + float y,
my = m[0][1] * Vertices[0].Point.x + m[1][1] * Vertices[0].Point.y +
m[2][1] * Vertices[0].Point.z + m[3][1]; m[2][1] * Vertices[0].Point.z + m[3][1];
for (int i = 1; i < iNumVerts; ++i) for (int i = 1; i < iNumVerts; ++i)
{ {
@@ -1822,11 +1802,15 @@ TMaterial* TModel3d::GetMaterialFromName(char *sName)
} }
*/ */
bool TModel3d::LoadFromFile(std::string const &FileName, bool dynamic) { bool TModel3d::LoadFromFile(std::string const &FileName, bool dynamic)
{
// wczytanie modelu z pliku // wczytanie modelu z pliku
std::string name = ToLower(FileName); std::string name = ToLower(FileName);
// trim extension if needed // trim extension if needed
if( name.substr( name.rfind( '.' ) ) == ".t3d" ) { name.erase( name.rfind( '.' ) ); } if (name.substr(name.rfind('.')) == ".t3d")
{
name.erase(name.rfind('.'));
}
asBinary = name + ".e3d"; asBinary = name + ".e3d";
if (FileExists(asBinary)) if (FileExists(asBinary))
@@ -1844,8 +1828,10 @@ bool TModel3d::LoadFromFile(std::string const &FileName, bool dynamic) {
Init(); // generowanie siatek i zapis E3D Init(); // generowanie siatek i zapis E3D
} }
} }
bool const result = Root ? (iSubModelsCount > 0) : false; // brak pliku albo problem z wczytaniem bool const result =
if( false == result ) { Root ? (iSubModelsCount > 0) : false; // brak pliku albo problem z wczytaniem
if (false == result)
{
ErrorLog("Failed to load 3d model \"" + FileName + "\""); ErrorLog("Failed to load 3d model \"" + FileName + "\"");
} }
return result; return result;
@@ -1862,7 +1848,8 @@ void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic)
fs->Read(iModel, fs->Size); // wczytanie pliku fs->Read(iModel, fs->Size); // wczytanie pliku
delete fs; delete fs;
*/ { */ {
std::ifstream file( FileName, std::ios::binary | std::ios::ate ); file.unsetf( std::ios::skipws ); std::ifstream file(FileName, std::ios::binary | std::ios::ate);
file.unsetf(std::ios::skipws);
size = file.tellg(); // ios::ate already positioned us at the end of the file size = file.tellg(); // ios::ate already positioned us at the end of the file
iModel = new int[size >> 2]; // ten wskaźnik musi być w modelu, aby zwolnić pamięć iModel = new int[size >> 2]; // ten wskaźnik musi być w modelu, aby zwolnić pamięć
file.seekg(0, std::ios::beg); // rewind the caret afterwards file.seekg(0, std::ios::beg); // rewind the caret afterwards
@@ -1883,9 +1870,11 @@ void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic)
k = (iModel[i + 1] >> 2); // długość aktualnej kromki k = (iModel[i + 1] >> 2); // długość aktualnej kromki
switch (ch) switch (ch)
{ {
case MAKE_ID4('M','D','L','0'): // zmienne modelu: 'E3D0',len,(informacje o modelu) case MAKE_ID4('M', 'D', 'L',
'0'): // zmienne modelu: 'E3D0',len,(informacje o modelu)
break; break;
case MAKE_ID4('V','N','T','0'): // wierzchołki: 'VNT0',len,(32 bajty na wierzchołek) case MAKE_ID4('V', 'N', 'T',
'0'): // wierzchołki: 'VNT0',len,(32 bajty na wierzchołek)
iNumVerts = (k - 2) >> 3; iNumVerts = (k - 2) >> 3;
m_nVertexCount = iNumVerts; m_nVertexCount = iNumVerts;
m_pVNT = (CVertNormTex *)(iModel + i + 2); m_pVNT = (CVertNormTex *)(iModel + i + 2);
@@ -1906,25 +1895,31 @@ void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic)
case MAKE_ID4('T', 'R', 'A', '0'): // transformy: 'TRA0',len,(64 bajty na transform) case MAKE_ID4('T', 'R', 'A', '0'): // transformy: 'TRA0',len,(64 bajty na transform)
m = (float4x4 *)(iModel + i + 2); // tabela transformów m = (float4x4 *)(iModel + i + 2); // tabela transformów
break; break;
case MAKE_ID4('T','R','A','1'): // transformy: 'TRA1',len,(128 bajtów na transform) case MAKE_ID4('T', 'R', 'A',
'1'): // transformy: 'TRA1',len,(128 bajtów na transform)
m = (float4x4 *)(iModel + i + 2); // tabela transformów m = (float4x4 *)(iModel + i + 2); // tabela transformów
for (ch = 0; ch < ((k - 2) >> 1); ++ch) for (ch = 0; ch < ((k - 2) >> 1); ++ch)
*(((float *)m) + ch) = *(((double *)m) + ch); // przepisanie double do float *(((float *)m) + ch) = *(((double *)m) + ch); // przepisanie double do float
break; break;
case MAKE_ID4('I','D','X','1'): // indeksy 1B: 'IDX2',len,(po bajcie na numer wierzchołka) case MAKE_ID4('I', 'D', 'X',
'1'): // indeksy 1B: 'IDX2',len,(po bajcie na numer wierzchołka)
break; break;
case MAKE_ID4('I','D','X','2'): // indeksy 2B: 'IDX2',len,(po 2 bajty na numer wierzchołka) case MAKE_ID4('I', 'D', 'X',
'2'): // indeksy 2B: 'IDX2',len,(po 2 bajty na numer wierzchołka)
break; break;
case MAKE_ID4('I','D','X','4'): // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzchołka) case MAKE_ID4('I', 'D', 'X',
'4'): // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzchołka)
break; break;
case MAKE_ID4('T','E','X','0'): // tekstury: 'TEX0',len,(łańcuchy zakończone zerem - pliki case MAKE_ID4('T', 'E', 'X',
'0'): // tekstury: 'TEX0',len,(łańcuchy zakończone zerem - pliki
// tekstur) // tekstur)
Textures.Init((char *)(iModel + i)); //łącznie z nagłówkiem Textures.Init((char *)(iModel + i)); //łącznie z nagłówkiem
break; break;
case MAKE_ID4('T', 'I', 'X', '0'): // indeks nazw tekstur case MAKE_ID4('T', 'I', 'X', '0'): // indeks nazw tekstur
Textures.InitIndex((int *)(iModel + i)); //łącznie z nagłówkiem Textures.InitIndex((int *)(iModel + i)); //łącznie z nagłówkiem
break; break;
case MAKE_ID4('N','A','M','0'): // nazwy: 'NAM0',len,(łańcuchy zakończone zerem - nazwy case MAKE_ID4('N', 'A', 'M',
'0'): // nazwy: 'NAM0',len,(łańcuchy zakończone zerem - nazwy
// submodeli) // submodeli)
Names.Init((char *)(iModel + i)); //łącznie z nagłówkiem Names.Init((char *)(iModel + i)); //łącznie z nagłówkiem
break; break;
@@ -1968,10 +1963,11 @@ void TModel3d::LoadFromTextFile(std::string const &FileName, bool dynamic)
break; break;
SubModel = new TSubModel(); SubModel = new TSubModel();
iNumVerts += SubModel->Load(parser, this, iNumVerts, dynamic); iNumVerts += SubModel->Load(parser, this, iNumVerts, dynamic);
SubModel->Parent = SubModel->Parent = AddToNamed(
AddToNamed(parent.c_str(), SubModel); // będzie potrzebne do wyliczenia pozycji, np. pantografu parent.c_str(), SubModel); // będzie potrzebne do wyliczenia pozycji, np. pantografu
// iSubModelsCount++; // iSubModelsCount++;
parser.getTokens(); parser >> token; parser.getTokens();
parser >> token;
} }
// Ra: od wersji 334 przechylany jest cały model, a nie tylko pierwszy // Ra: od wersji 334 przechylany jest cały model, a nie tylko pierwszy
// submodel // submodel
@@ -2080,17 +2076,21 @@ void TModel3d::SaveToBinFile(char const *FileName)
// roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno // roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno
/* TFileStream *fs = new TFileStream(AnsiString(FileName), fmCreate); /* TFileStream *fs = new TFileStream(AnsiString(FileName), fmCreate);
*/ { */ {
std::ofstream file( FileName, std::ios::binary ); file.unsetf( std::ios::skipws ); std::ofstream file(FileName, std::ios::binary);
file.unsetf(std::ios::skipws);
file.write("E3D0", 4); // kromka główna file.write("E3D0", 4); // kromka główna
file.write(reinterpret_cast<char *>(&len), 4); file.write(reinterpret_cast<char *>(&len), 4);
file.write("SUB0", 4); // dane submodeli file.write("SUB0", 4); // dane submodeli
file.write(reinterpret_cast<char *>(&sub), 4); file.write(reinterpret_cast<char *>(&sub), 4);
for( i = 0; i < iSubModelsCount; ++i ) { for (i = 0; i < iSubModelsCount; ++i)
{
roboczy->InfoSet(info + i); roboczy->InfoSet(info + i);
file.write( reinterpret_cast<char *>( roboczy ), sizeof( TSubModel ) ); // zapis jednego submodelu file.write(reinterpret_cast<char *>(roboczy),
sizeof(TSubModel)); // zapis jednego submodelu
} }
if( tra ) { // zapis transformów if (tra)
{ // zapis transformów
file.write("TRA0", 4); // transformy file.write("TRA0", 4); // transformy
file.write(reinterpret_cast<char *>(&tra), 4); file.write(reinterpret_cast<char *>(&tra), 4);
for (i = 0; i < iSubModelsCount; ++i) for (i = 0; i < iSubModelsCount; ++i)
@@ -2109,12 +2109,14 @@ void TModel3d::SaveToBinFile(char const *FileName)
file.write("TEX0", 4); // nazwy tekstur file.write("TEX0", 4); // nazwy tekstur
i = (tex + 3) & ~3; // zaokrąglenie w górę i = (tex + 3) & ~3; // zaokrąglenie w górę
file.write(reinterpret_cast<char *>(&i), 4); file.write(reinterpret_cast<char *>(&i), 4);
file.write( reinterpret_cast<char *>( &zero ), 1 ); // ciąg o numerze zero nie jest używany, ma tylko znacznik końca file.write(reinterpret_cast<char *>(&zero),
1); // ciąg o numerze zero nie jest używany, ma tylko znacznik końca
for (i = 0; i < iSubModelsCount; ++i) for (i = 0; i < iSubModelsCount; ++i)
if (info[i].iTextureLen) if (info[i].iTextureLen)
file.write(info[i].pSubModel->pTexture, info[i].iTextureLen); file.write(info[i].pSubModel->pTexture, info[i].iTextureLen);
if ((-tex) & 3) if ((-tex) & 3)
file.write( reinterpret_cast<char *>( &zero ), ( ( -tex ) & 3 ) ); // wyrównanie do wielokrotności 4 bajtów file.write(reinterpret_cast<char *>(&zero),
((-tex) & 3)); // wyrównanie do wielokrotności 4 bajtów
} }
if (nam) // może być jeden anonimowy submodel w modelu if (nam) // może być jeden anonimowy submodel w modelu
{ // zapis nazw submodeli { // zapis nazw submodeli
@@ -2125,7 +2127,8 @@ void TModel3d::SaveToBinFile(char const *FileName)
if (info[i].iNameLen) if (info[i].iNameLen)
file.write(info[i].pSubModel->pName, info[i].iNameLen); file.write(info[i].pSubModel->pName, info[i].iNameLen);
if ((-nam) & 3) if ((-nam) & 3)
file.write( reinterpret_cast<char *>( &zero ), ( ( -nam ) & 3 ) ); // wyrównanie do wielokrotności 4 bajtów file.write(reinterpret_cast<char *>(&zero),
((-nam) & 3)); // wyrównanie do wielokrotności 4 bajtów
} }
} // file autocloses on getting out of scope } // file autocloses on getting out of scope
// roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno // roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno