mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 13:59:19 +02:00
serializacja e3d
This commit is contained in:
@@ -25,6 +25,12 @@ void float4x4::deserialize_float64(std::istream &s)
|
|||||||
e[i] = (float)sn_utils::ld_float64(s);
|
e[i] = (float)sn_utils::ld_float64(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void float4x4::serialize_float32(std::ostream &s)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < 16; i++)
|
||||||
|
sn_utils::ls_float32(s, e[i]);
|
||||||
|
}
|
||||||
|
|
||||||
void float4x4::Quaternion(float4 *q)
|
void float4x4::Quaternion(float4 *q)
|
||||||
{ // konwersja kwaternionu obrotu na macierz obrotu
|
{ // konwersja kwaternionu obrotu na macierz obrotu
|
||||||
float xx = q->x * q->x, yy = q->y * q->y, zz = q->z * q->z;
|
float xx = q->x * q->x, yy = q->y * q->y, zz = q->z * q->z;
|
||||||
|
|||||||
17
Float3d.h
17
Float3d.h
@@ -184,11 +184,12 @@ struct float8
|
|||||||
|
|
||||||
class float4x4
|
class float4x4
|
||||||
{ // macierz transformacji pojedynczej precyzji
|
{ // macierz transformacji pojedynczej precyzji
|
||||||
|
public:
|
||||||
float e[16];
|
float e[16];
|
||||||
|
|
||||||
public:
|
void deserialize_float32(std::istream&);
|
||||||
void deserialize_float32(std::istream &s);
|
void deserialize_float64(std::istream&);
|
||||||
void deserialize_float64(std::istream &s);
|
void serialize_float32(std::ostream&);
|
||||||
float4x4(void){};
|
float4x4(void){};
|
||||||
float4x4(float f[16])
|
float4x4(float f[16])
|
||||||
{
|
{
|
||||||
@@ -282,6 +283,16 @@ inline float4x4 &float4x4::Rotation(double angle, float3 axis)
|
|||||||
return *this;
|
return *this;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline bool operator==(const float4x4& v1, const float4x4& v2)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
if (v1.e[i] != v2.e[i])
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
inline float4x4 operator*(const float4x4 &m1, const float4x4 &m2)
|
inline float4x4 operator*(const float4x4 &m1, const float4x4 &m2)
|
||||||
{ // iloczyn macierzy
|
{ // iloczyn macierzy
|
||||||
float4x4 retVal;
|
float4x4 retVal;
|
||||||
|
|||||||
350
Model3d.cpp
350
Model3d.cpp
@@ -42,12 +42,6 @@ std::string *TSubModel::pasText;
|
|||||||
// 0x3F3F003F - wszystkie wymienne tekstury używane w danym cyklu
|
// 0x3F3F003F - wszystkie wymienne tekstury używane w danym cyklu
|
||||||
// Ale w TModel3d okerśla przezroczystość tekstur wymiennych!
|
// Ale w TModel3d okerśla przezroczystość tekstur wymiennych!
|
||||||
|
|
||||||
int TSubModelInfo::iTotalTransforms = 0; // ilość transformów
|
|
||||||
int TSubModelInfo::iTotalNames = 0; // długość obszaru nazw
|
|
||||||
int TSubModelInfo::iTotalTextures = 0; // długość obszaru tekstur
|
|
||||||
int TSubModelInfo::iCurrent = 0; // aktualny obiekt
|
|
||||||
TSubModelInfo *TSubModelInfo::pTable = NULL; // tabele obiektów pomocniczych
|
|
||||||
|
|
||||||
TSubModel::TSubModel()
|
TSubModel::TSubModel()
|
||||||
{
|
{
|
||||||
ZeroMemory(this, sizeof(TSubModel)); // istotne przy zapisywaniu wersji binarnej
|
ZeroMemory(this, sizeof(TSubModel)); // istotne przy zapisywaniu wersji binarnej
|
||||||
@@ -1477,82 +1471,6 @@ void TSubModel::RaArrayFill(CVertNormTex *Vert)
|
|||||||
Next->RaArrayFill(Vert);
|
Next->RaArrayFill(Vert);
|
||||||
};
|
};
|
||||||
|
|
||||||
void TSubModel::Info()
|
|
||||||
{ // zapisanie informacji o submodelu do obiektu
|
|
||||||
// pomocniczego
|
|
||||||
TSubModelInfo *info = TSubModelInfo::pTable + TSubModelInfo::iCurrent;
|
|
||||||
info->pSubModel = this;
|
|
||||||
if (fMatrix && (iFlags & 0x8000)) // ma matrycę i jest ona niejednostkowa
|
|
||||||
info->iTransform = info->iTotalTransforms++;
|
|
||||||
if (TextureID > 0)
|
|
||||||
{ // jeśli ma teksturę niewymienną
|
|
||||||
for (int i = 0; i < info->iCurrent; ++i)
|
|
||||||
if (TextureID == info->pTable[i].pSubModel->TextureID) // porównanie z wcześniejszym
|
|
||||||
{
|
|
||||||
info->iTexture = info->pTable[i].iTexture; // taki jaki już był
|
|
||||||
break; // koniec sprawdzania
|
|
||||||
}
|
|
||||||
if (info->iTexture < 0) // jeśli nie znaleziono we wcześniejszych
|
|
||||||
{
|
|
||||||
info->iTexture = ++info->iTotalTextures; // przydzielenie numeru tekstury
|
|
||||||
// w pliku (od 1)
|
|
||||||
std::string t(pTexture);
|
|
||||||
// trim extension
|
|
||||||
size_t kropka = t.rfind('.');
|
|
||||||
if (kropka != std::string::npos &&
|
|
||||||
(t.substr(kropka) == ".tga" || t.substr(kropka) == ".dds"))
|
|
||||||
{
|
|
||||||
t.erase(t.rfind('.'));
|
|
||||||
}
|
|
||||||
if (t != std::string(pTexture))
|
|
||||||
{ // jeśli się zmieniło
|
|
||||||
// pName=new char[token.length()+1]; //nie ma sensu skracać tabeli
|
|
||||||
pTexture = t;
|
|
||||||
}
|
|
||||||
info->iTextureLen = (int)t.size() + 1; // przygotowanie do zapisania, z zerem na końcu
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
info->iTexture = TextureID; // nie ma albo wymienna
|
|
||||||
// if (asName.Length())
|
|
||||||
if (pName.size())
|
|
||||||
{
|
|
||||||
info->iName = info->iTotalNames++; // przydzielenie numeru nazwy w pliku (od 0)
|
|
||||||
info->iNameLen = (int)pName.size() + 1; // z zerem na końcu
|
|
||||||
}
|
|
||||||
++info->iCurrent; // przejście do kolejnego obiektu pomocniczego
|
|
||||||
if (Child)
|
|
||||||
{
|
|
||||||
info->iChild = info->iCurrent;
|
|
||||||
Child->Info();
|
|
||||||
}
|
|
||||||
if (Next)
|
|
||||||
{
|
|
||||||
info->iNext = info->iCurrent;
|
|
||||||
Next->Info();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void TSubModel::InfoSet(TSubModelInfo *info)
|
|
||||||
{ // ustawienie danych wg obiektu
|
|
||||||
// pomocniczego do zapisania w
|
|
||||||
// pliku
|
|
||||||
int ile = (char *)&uiDisplayList - (char *)&eType; // ilość bajtów pomiędzy tymi zmiennymi
|
|
||||||
ZeroMemory(this, sizeof(TSubModel)); // zerowaie całości
|
|
||||||
CopyMemory(this, info->pSubModel, ile); // skopiowanie pamięci 1:1
|
|
||||||
tVboPtr = (int)info->pSubModel->iVboPtr;
|
|
||||||
iTexture = info->iTexture; // numer nazwy tekstury, a nie numer w OpenGL
|
|
||||||
TextureID = info->iTexture; // numer tekstury w OpenGL
|
|
||||||
iName = info->iName; // numer nazwy w obszarze nazw
|
|
||||||
iMatrix = info->iTransform; // numer macierzy
|
|
||||||
iNext = info->iNext; // numer następnego
|
|
||||||
iChild = info->iChild; // numer potomnego
|
|
||||||
iFlags &= ~0x200; // nie jest wczytany z tekstowego
|
|
||||||
// asTexture=asName="";
|
|
||||||
pTexture = "";
|
|
||||||
pName = "";
|
|
||||||
};
|
|
||||||
|
|
||||||
void TSubModel::AdjustDist()
|
void TSubModel::AdjustDist()
|
||||||
{ // aktualizacja odległości faz LoD, zależna od
|
{ // aktualizacja odległości faz LoD, zależna od
|
||||||
// rozdzielczości pionowej oraz multisamplingu
|
// rozdzielczości pionowej oraz multisamplingu
|
||||||
@@ -1744,9 +1662,173 @@ bool TModel3d::LoadFromFile(std::string const &FileName, bool dynamic)
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
// E3D deserialization
|
// E3D serialization
|
||||||
// http://rainsted.com/pl/Format_binarny_modeli_-_E3D
|
// http://rainsted.com/pl/Format_binarny_modeli_-_E3D
|
||||||
|
|
||||||
|
|
||||||
|
//m7todo: wymyślić lepszą nazwę
|
||||||
|
template <typename L, typename T>
|
||||||
|
size_t get_container_pos(L &list, T o)
|
||||||
|
{
|
||||||
|
auto i = std::find(list.begin(), list.end(), o);
|
||||||
|
if (i == list.end())
|
||||||
|
{
|
||||||
|
list.push_back(o);
|
||||||
|
return list.size() - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return std::distance(list.begin(), i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//m7todo: za dużo argumentów, może przenieść do osobnej
|
||||||
|
//klasy serializera mającej własny stan, albo zrobić
|
||||||
|
//strukturę TModel3d::SerializerContext?
|
||||||
|
void TSubModel::serialize(std::ostream &s,
|
||||||
|
std::vector<TSubModel*> &models,
|
||||||
|
std::vector<std::string> &names,
|
||||||
|
std::vector<std::string> &textures,
|
||||||
|
std::vector<float4x4> &transforms)
|
||||||
|
{
|
||||||
|
size_t end = (size_t)s.tellp() + 256;
|
||||||
|
|
||||||
|
if (!Next)
|
||||||
|
sn_utils::ls_int32(s, -1);
|
||||||
|
else
|
||||||
|
sn_utils::ls_int32(s, (int32_t)get_container_pos(models, Next));
|
||||||
|
if (!Child)
|
||||||
|
sn_utils::ls_int32(s, -1);
|
||||||
|
else
|
||||||
|
sn_utils::ls_int32(s, (int32_t)get_container_pos(models, Child));
|
||||||
|
|
||||||
|
sn_utils::ls_int32(s, eType);
|
||||||
|
if (pName.size() == 0)
|
||||||
|
sn_utils::ls_int32(s, -1);
|
||||||
|
else
|
||||||
|
sn_utils::ls_int32(s, (int32_t)get_container_pos(names, pName));
|
||||||
|
sn_utils::ls_int32(s, (int)b_Anim);
|
||||||
|
|
||||||
|
sn_utils::ls_int32(s, iFlags);
|
||||||
|
sn_utils::ls_int32(s, (int32_t)get_container_pos(transforms, *fMatrix));
|
||||||
|
|
||||||
|
sn_utils::ls_int32(s, iNumVerts);
|
||||||
|
sn_utils::ls_int32(s, (int)iVboPtr);
|
||||||
|
if (TextureID <= 0)
|
||||||
|
sn_utils::ls_int32(s, TextureID);
|
||||||
|
else
|
||||||
|
sn_utils::ls_int32(s, (int32_t)get_container_pos(textures, pTexture));
|
||||||
|
|
||||||
|
sn_utils::ls_float32(s, fVisible);
|
||||||
|
sn_utils::ls_float32(s, fLight);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < 4; i++)
|
||||||
|
sn_utils::ls_float32(s, f4Ambient[i]);
|
||||||
|
for (size_t i = 0; i < 4; i++)
|
||||||
|
sn_utils::ls_float32(s, f4Diffuse[i]);
|
||||||
|
for (size_t i = 0; i < 4; i++)
|
||||||
|
sn_utils::ls_float32(s, f4Specular[i]);
|
||||||
|
for (size_t i = 0; i < 4; i++)
|
||||||
|
sn_utils::ls_float32(s, f4Emision[i]);
|
||||||
|
|
||||||
|
sn_utils::ls_float32(s, fWireSize);
|
||||||
|
sn_utils::ls_float32(s, fSquareMaxDist);
|
||||||
|
sn_utils::ls_float32(s, fSquareMinDist);
|
||||||
|
|
||||||
|
sn_utils::ls_float32(s, fNearAttenStart);
|
||||||
|
sn_utils::ls_float32(s, fNearAttenEnd);
|
||||||
|
sn_utils::ls_uint32(s, bUseNearAtten ? 1 : 0);
|
||||||
|
|
||||||
|
sn_utils::ls_int32(s, iFarAttenDecay);
|
||||||
|
sn_utils::ls_float32(s, fFarDecayRadius);
|
||||||
|
sn_utils::ls_float32(s, fCosFalloffAngle);
|
||||||
|
sn_utils::ls_float32(s, fCosHotspotAngle);
|
||||||
|
sn_utils::ls_float32(s, fCosViewAngle);
|
||||||
|
|
||||||
|
size_t fill = end - s.tellp();
|
||||||
|
for (size_t i = 0; i < fill; i++)
|
||||||
|
s.put(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TModel3d::SaveToBinFile(char const *FileName)
|
||||||
|
{
|
||||||
|
WriteLog("saving e3d model..");
|
||||||
|
|
||||||
|
//m7todo: można by zoptymalizować robiąc unordered_map
|
||||||
|
//na wyszukiwanie numerów już dodanych stringów i osobno
|
||||||
|
//vector na wskaźniki do stringów w kolejności numeracji
|
||||||
|
//tylko czy potrzeba?
|
||||||
|
std::vector<TSubModel*> models;
|
||||||
|
models.push_back(Root);
|
||||||
|
std::vector<std::string> names;
|
||||||
|
std::vector<std::string> textures;
|
||||||
|
textures.push_back("");
|
||||||
|
std::vector<float4x4> transforms;
|
||||||
|
|
||||||
|
std::ofstream s(FileName, std::ios::binary);
|
||||||
|
|
||||||
|
sn_utils::ls_uint32(s, MAKE_ID4('E', '3', 'D', '0'));
|
||||||
|
size_t e3d_spos = s.tellp();
|
||||||
|
sn_utils::ls_uint32(s, 0);
|
||||||
|
|
||||||
|
{
|
||||||
|
sn_utils::ls_uint32(s, MAKE_ID4('S', 'U', 'B', '0'));
|
||||||
|
size_t sub_spos = s.tellp();
|
||||||
|
sn_utils::ls_uint32(s, 0);
|
||||||
|
for (size_t i = 0; i < models.size(); i++)
|
||||||
|
models[i]->serialize(s, models, names, textures, transforms);
|
||||||
|
size_t pos = s.tellp();
|
||||||
|
s.seekp(sub_spos);
|
||||||
|
sn_utils::ls_uint32(s, (uint32_t)(4 + pos - sub_spos));
|
||||||
|
s.seekp(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
sn_utils::ls_uint32(s, MAKE_ID4('T', 'R', 'A', '0'));
|
||||||
|
sn_utils::ls_uint32(s, 8 + (uint32_t)transforms.size() * 64);
|
||||||
|
for (size_t i = 0; i < transforms.size(); i++)
|
||||||
|
transforms[i].serialize_float32(s);
|
||||||
|
|
||||||
|
MakeArray(iNumVerts);
|
||||||
|
Root->RaArrayFill(m_pVNT);
|
||||||
|
sn_utils::ls_uint32(s, MAKE_ID4('V', 'N', 'T', '0'));
|
||||||
|
sn_utils::ls_uint32(s, 8 + iNumVerts * 32);
|
||||||
|
for (size_t i = 0; i < iNumVerts; i++)
|
||||||
|
m_pVNT[i].serialize(s);
|
||||||
|
|
||||||
|
if (textures.size())
|
||||||
|
{
|
||||||
|
sn_utils::ls_uint32(s, MAKE_ID4('T', 'E', 'X', '0'));
|
||||||
|
size_t tex_spos = s.tellp();
|
||||||
|
sn_utils::ls_uint32(s, 0);
|
||||||
|
for (size_t i = 0; i < textures.size(); i++)
|
||||||
|
sn_utils::s_str(s, textures[i]);
|
||||||
|
size_t pos = s.tellp();
|
||||||
|
s.seekp(tex_spos);
|
||||||
|
sn_utils::ls_uint32(s, (uint32_t)(4 + pos - tex_spos));
|
||||||
|
s.seekp(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (names.size())
|
||||||
|
{
|
||||||
|
sn_utils::ls_uint32(s, MAKE_ID4('N', 'A', 'M', '0'));
|
||||||
|
size_t nam_spos = s.tellp();
|
||||||
|
sn_utils::ls_uint32(s, 0);
|
||||||
|
for (size_t i = 0; i < names.size(); i++)
|
||||||
|
sn_utils::s_str(s, names[i]);
|
||||||
|
size_t pos = s.tellp();
|
||||||
|
s.seekp(nam_spos);
|
||||||
|
sn_utils::ls_uint32(s, (uint32_t)(4 + pos - nam_spos));
|
||||||
|
s.seekp(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t end = s.tellp();
|
||||||
|
s.seekp(e3d_spos);
|
||||||
|
sn_utils::ls_uint32(s, (uint32_t)(4 + end - e3d_spos));
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
WriteLog("..done.");
|
||||||
|
}
|
||||||
|
|
||||||
void TSubModel::deserialize(std::istream &s)
|
void TSubModel::deserialize(std::istream &s)
|
||||||
{
|
{
|
||||||
iNext = sn_utils::ld_int32(s);
|
iNext = sn_utils::ld_int32(s);
|
||||||
@@ -1769,13 +1851,10 @@ void TSubModel::deserialize(std::istream &s)
|
|||||||
|
|
||||||
for (size_t i = 0; i < 4; i++)
|
for (size_t i = 0; i < 4; i++)
|
||||||
f4Ambient[i] = sn_utils::ld_float32(s);
|
f4Ambient[i] = sn_utils::ld_float32(s);
|
||||||
|
|
||||||
for (size_t i = 0; i < 4; i++)
|
for (size_t i = 0; i < 4; i++)
|
||||||
f4Diffuse[i] = sn_utils::ld_float32(s);
|
f4Diffuse[i] = sn_utils::ld_float32(s);
|
||||||
|
|
||||||
for (size_t i = 0; i < 4; i++)
|
for (size_t i = 0; i < 4; i++)
|
||||||
f4Specular[i] = sn_utils::ld_float32(s);
|
f4Specular[i] = sn_utils::ld_float32(s);
|
||||||
|
|
||||||
for (size_t i = 0; i < 4; i++)
|
for (size_t i = 0; i < 4; i++)
|
||||||
f4Emision[i] = sn_utils::ld_float32(s);
|
f4Emision[i] = sn_utils::ld_float32(s);
|
||||||
|
|
||||||
@@ -1893,6 +1972,7 @@ void TModel3d::deserialize(std::istream &s, size_t size, bool dynamic)
|
|||||||
void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v,
|
void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v,
|
||||||
std::vector<std::string> *t, std::vector<std::string> *n, bool dynamic)
|
std::vector<std::string> *t, std::vector<std::string> *n, bool dynamic)
|
||||||
{ // ustawienie wskaźników w submodelu
|
{ // ustawienie wskaźników w submodelu
|
||||||
|
//m7todo: brzydko
|
||||||
iVisible = 1; // tymczasowo używane
|
iVisible = 1; // tymczasowo używane
|
||||||
Child = (iChild > 0) ? s + iChild : nullptr; // zerowy nie może być potomnym
|
Child = (iChild > 0) ? s + iChild : nullptr; // zerowy nie może być potomnym
|
||||||
Next = (iNext > 0) ? s + iNext : nullptr; // zerowy nie może być następnym
|
Next = (iNext > 0) ? s + iNext : nullptr; // zerowy nie może być następnym
|
||||||
@@ -1953,7 +2033,7 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v,
|
|||||||
|
|
||||||
void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic)
|
void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic)
|
||||||
{ // wczytanie modelu z pliku binarnego
|
{ // wczytanie modelu z pliku binarnego
|
||||||
WriteLog("Loading - binary model: " + FileName);
|
WriteLog("loading e3d model " + FileName + " ..");
|
||||||
|
|
||||||
std::ifstream file(FileName, std::ios::binary);
|
std::ifstream file(FileName, std::ios::binary);
|
||||||
|
|
||||||
@@ -1965,6 +2045,8 @@ void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic)
|
|||||||
|
|
||||||
deserialize(file, size, dynamic);
|
deserialize(file, size, dynamic);
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
|
WriteLog("..done.");
|
||||||
};
|
};
|
||||||
|
|
||||||
void TModel3d::LoadFromTextFile(std::string const &FileName, bool dynamic)
|
void TModel3d::LoadFromTextFile(std::string const &FileName, bool dynamic)
|
||||||
@@ -2067,100 +2149,6 @@ void TModel3d::Init()
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void TModel3d::SaveToBinFile(char const *FileName)
|
|
||||||
{ // zapis modelu binarnego
|
|
||||||
WriteLog("Saving E3D binary model.");
|
|
||||||
int i, zero = 0;
|
|
||||||
TSubModelInfo *info = new TSubModelInfo[iSubModelsCount];
|
|
||||||
info->Reset();
|
|
||||||
Root->Info(); // zebranie informacji o submodelach
|
|
||||||
int len; //łączna długość pliku
|
|
||||||
int sub; // ilość submodeli (w bajtach)
|
|
||||||
int tra; // wielkość obszaru transformów
|
|
||||||
int vnt; // wielkość obszaru wierzchołków
|
|
||||||
int tex = 0; // wielkość obszaru nazw tekstur
|
|
||||||
int nam = 0; // wielkość obszaru nazw submodeli
|
|
||||||
sub = 8 + sizeof(TSubModel) * iSubModelsCount;
|
|
||||||
tra = info->iTotalTransforms ? 8 + 64 * info->iTotalTransforms : 0;
|
|
||||||
vnt = 8 + 32 * iNumVerts;
|
|
||||||
for (i = 0; i < iSubModelsCount; ++i)
|
|
||||||
{
|
|
||||||
tex += info[i].iTextureLen;
|
|
||||||
nam += info[i].iNameLen;
|
|
||||||
}
|
|
||||||
if (tex)
|
|
||||||
tex += 9; // 8 na nagłówek i jeden ciąg pusty (tylko znacznik końca)
|
|
||||||
if (nam)
|
|
||||||
nam += 8;
|
|
||||||
len = 8 + sub + tra + vnt + tex + ((-tex) & 3) + nam + ((-nam) & 3);
|
|
||||||
TSubModel *roboczy = new TSubModel(); // bufor używany do zapisywania
|
|
||||||
// AnsiString *asN=&roboczy->asName,*asT=&roboczy->asTexture;
|
|
||||||
// roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno
|
|
||||||
/* TFileStream *fs = new TFileStream(AnsiString(FileName), fmCreate);
|
|
||||||
*/ {
|
|
||||||
std::ofstream file(FileName, std::ios::binary);
|
|
||||||
file.unsetf(std::ios::skipws);
|
|
||||||
file.write("E3D0", 4); // kromka główna
|
|
||||||
file.write(reinterpret_cast<char *>(&len), 4);
|
|
||||||
|
|
||||||
file.write("SUB0", 4); // dane submodeli
|
|
||||||
file.write(reinterpret_cast<char *>(&sub), 4);
|
|
||||||
for (i = 0; i < iSubModelsCount; ++i)
|
|
||||||
{
|
|
||||||
roboczy->InfoSet(info + i);
|
|
||||||
file.write(reinterpret_cast<char *>(roboczy),
|
|
||||||
256); // zapis jednego submodelu
|
|
||||||
}
|
|
||||||
if (tra)
|
|
||||||
{ // zapis transformów
|
|
||||||
file.write("TRA0", 4); // transformy
|
|
||||||
file.write(reinterpret_cast<char *>(&tra), 4);
|
|
||||||
for (i = 0; i < iSubModelsCount; ++i)
|
|
||||||
if (info[i].iTransform >= 0)
|
|
||||||
file.write(reinterpret_cast<char *>(info[i].pSubModel->GetMatrix()), 16 * 4);
|
|
||||||
}
|
|
||||||
{ // zapis wierzchołków
|
|
||||||
MakeArray(iNumVerts); // tworzenie tablic dla VBO
|
|
||||||
Root->RaArrayFill(m_pVNT); // wypełnianie tablicy
|
|
||||||
file.write("VNT0", 4); // wierzchołki
|
|
||||||
file.write(reinterpret_cast<char *>(&vnt), 4);
|
|
||||||
file.write(reinterpret_cast<char *>(m_pVNT), 32 * iNumVerts);
|
|
||||||
}
|
|
||||||
if (tex) // może być jeden submodel ze zmienną teksturą i nazwy nie będzie
|
|
||||||
{ // zapis nazw tekstur
|
|
||||||
file.write("TEX0", 4); // nazwy tekstur
|
|
||||||
i = (tex + 3) & ~3; // zaokrąglenie w górę
|
|
||||||
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
|
|
||||||
for (i = 0; i < iSubModelsCount; ++i)
|
|
||||||
if (info[i].iTextureLen)
|
|
||||||
file.write(info[i].pSubModel->pTexture.c_str(), info[i].iTextureLen);
|
|
||||||
if ((-tex) & 3)
|
|
||||||
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
|
|
||||||
{ // zapis nazw submodeli
|
|
||||||
file.write("NAM0", 4); // nazwy submodeli
|
|
||||||
i = (nam + 3) & ~3; // zaokrąglenie w górę
|
|
||||||
file.write(reinterpret_cast<char *>(&i), 4);
|
|
||||||
for (i = 0; i < iSubModelsCount; ++i)
|
|
||||||
if (info[i].iNameLen)
|
|
||||||
file.write(info[i].pSubModel->pName.c_str(), info[i].iNameLen);
|
|
||||||
if ((-nam) & 3)
|
|
||||||
file.write(reinterpret_cast<char *>(&zero),
|
|
||||||
((-nam) & 3)); // wyrównanie do wielokrotności 4 bajtów
|
|
||||||
}
|
|
||||||
} // file autocloses on getting out of scope
|
|
||||||
// roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno
|
|
||||||
// roboczy->iFlags=0; //żeby delete nie usuwało czego nie powinno
|
|
||||||
// roboczy->asName)=asN;
|
|
||||||
//&roboczy->asTexture=asT;
|
|
||||||
delete roboczy;
|
|
||||||
delete[] info;
|
|
||||||
};
|
|
||||||
|
|
||||||
void TModel3d::BreakHierarhy()
|
void TModel3d::BreakHierarhy()
|
||||||
{
|
{
|
||||||
Error("Not implemented yet :(");
|
Error("Not implemented yet :(");
|
||||||
|
|||||||
40
Model3d.h
40
Model3d.h
@@ -128,7 +128,6 @@ enum TAnimType // rodzaj animacji
|
|||||||
};
|
};
|
||||||
|
|
||||||
class TModel3d;
|
class TModel3d;
|
||||||
class TSubModelInfo;
|
|
||||||
|
|
||||||
class TSubModel
|
class TSubModel
|
||||||
{ // klasa submodelu - pojedyncza siatka, punkt świetlny albo grupa punktów
|
{ // klasa submodelu - pojedyncza siatka, punkt świetlny albo grupa punktów
|
||||||
@@ -206,7 +205,6 @@ public: // chwilowo
|
|||||||
TAnimType b_aAnim; // kody animacji oddzielnie, bo zerowane
|
TAnimType b_aAnim; // kody animacji oddzielnie, bo zerowane
|
||||||
public:
|
public:
|
||||||
float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer)
|
float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer)
|
||||||
char space[8]; // wolne miejsce na przyszłe zmienne (zmniejszyć w miarę potrzeby)
|
|
||||||
public:
|
public:
|
||||||
TSubModel **
|
TSubModel **
|
||||||
smLetter; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D)
|
smLetter; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D)
|
||||||
@@ -279,8 +277,6 @@ public:
|
|||||||
};
|
};
|
||||||
void InitialRotate(bool doit);
|
void InitialRotate(bool doit);
|
||||||
void DisplayLists();
|
void DisplayLists();
|
||||||
void Info();
|
|
||||||
void InfoSet(TSubModelInfo *info);
|
|
||||||
void BinInit(TSubModel *s, float4x4 *m, float8 *v,
|
void BinInit(TSubModel *s, float4x4 *m, float8 *v,
|
||||||
std::vector<std::string> *t, std::vector<std::string> *n, bool dynamic);
|
std::vector<std::string> *t, std::vector<std::string> *n, bool dynamic);
|
||||||
void ReplacableSet(texture_manager::size_type *r, int a)
|
void ReplacableSet(texture_manager::size_type *r, int a)
|
||||||
@@ -316,36 +312,12 @@ public:
|
|||||||
float MaxY(const float4x4 &m);
|
float MaxY(const float4x4 &m);
|
||||||
void AdjustDist();
|
void AdjustDist();
|
||||||
|
|
||||||
void deserialize(std::istream &s);
|
void deserialize(std::istream&);
|
||||||
};
|
void TSubModel::serialize(std::ostream&,
|
||||||
|
std::vector<TSubModel*>&,
|
||||||
class TSubModelInfo
|
std::vector<std::string>&,
|
||||||
{ // klasa z informacjami o submodelach, do tworzenia pliku binarnego
|
std::vector<std::string>&,
|
||||||
public:
|
std::vector<float4x4>&);
|
||||||
TSubModel *pSubModel; // wskaźnik na submodel
|
|
||||||
int iTransform; // numer transformu (-1 gdy brak)
|
|
||||||
int iName; // numer nazwy
|
|
||||||
int iTexture; // numer tekstury
|
|
||||||
int iNameLen; // długość nazwy
|
|
||||||
int iTextureLen; // długość tekstury
|
|
||||||
int iNext, iChild; // numer następnego i potomnego
|
|
||||||
static int iTotalTransforms; // ilość transformów
|
|
||||||
static int iTotalNames; // ilość nazw
|
|
||||||
static int iTotalTextures; // ilość tekstur
|
|
||||||
static int iCurrent; // aktualny obiekt
|
|
||||||
static TSubModelInfo *pTable; // tabele obiektów pomocniczych
|
|
||||||
TSubModelInfo()
|
|
||||||
{
|
|
||||||
pSubModel = NULL;
|
|
||||||
iTransform = iName = iTexture = iNext = iChild = -1; // nie ma
|
|
||||||
iNameLen = iTextureLen = 0;
|
|
||||||
}
|
|
||||||
void Reset()
|
|
||||||
{
|
|
||||||
pTable = this; // ustawienie wskaźnika tabeli obiektów
|
|
||||||
iTotalTransforms = iTotalNames = iTotalTextures = iCurrent = 0; // zerowanie liczników
|
|
||||||
}
|
|
||||||
~TSubModelInfo() {};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class TModel3d : public CMesh
|
class TModel3d : public CMesh
|
||||||
|
|||||||
14
VBO.cpp
14
VBO.cpp
@@ -28,6 +28,20 @@ void CVertNormTex::deserialize(std::istream &s)
|
|||||||
v = sn_utils::ld_float32(s);
|
v = sn_utils::ld_float32(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CVertNormTex::serialize(std::ostream &s)
|
||||||
|
{
|
||||||
|
sn_utils::ls_float32(s, x);
|
||||||
|
sn_utils::ls_float32(s, y);
|
||||||
|
sn_utils::ls_float32(s, z);
|
||||||
|
|
||||||
|
sn_utils::ls_float32(s, nx);
|
||||||
|
sn_utils::ls_float32(s, ny);
|
||||||
|
sn_utils::ls_float32(s, nz);
|
||||||
|
|
||||||
|
sn_utils::ls_float32(s, u);
|
||||||
|
sn_utils::ls_float32(s, v);
|
||||||
|
}
|
||||||
|
|
||||||
CMesh::CMesh()
|
CMesh::CMesh()
|
||||||
{ // utworzenie pustego obiektu
|
{ // utworzenie pustego obiektu
|
||||||
m_pVNT = nullptr;
|
m_pVNT = nullptr;
|
||||||
|
|||||||
3
VBO.h
3
VBO.h
@@ -22,7 +22,8 @@ class CVertNormTex
|
|||||||
float u = 0.0; // U mapowania
|
float u = 0.0; // U mapowania
|
||||||
float v = 0.0; // V mapowania
|
float v = 0.0; // V mapowania
|
||||||
|
|
||||||
void deserialize(std::istream &s);
|
void deserialize(std::istream&);
|
||||||
|
void serialize(std::ostream&);
|
||||||
};
|
};
|
||||||
|
|
||||||
class CMesh
|
class CMesh
|
||||||
|
|||||||
60
sn_utils.cpp
60
sn_utils.cpp
@@ -70,3 +70,63 @@ std::string sn_utils::d_str(std::istream &s)
|
|||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sn_utils::ls_uint16(std::ostream &s, uint16_t v)
|
||||||
|
{
|
||||||
|
uint8_t buf[2];
|
||||||
|
buf[0] = v;
|
||||||
|
buf[1] = v >> 8;
|
||||||
|
s.write((char*)buf, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sn_utils::ls_uint32(std::ostream &s, uint32_t v)
|
||||||
|
{
|
||||||
|
uint8_t buf[4];
|
||||||
|
buf[0] = v;
|
||||||
|
buf[1] = v >> 8;
|
||||||
|
buf[2] = v >> 16;
|
||||||
|
buf[3] = v >> 24;
|
||||||
|
s.write((char*)buf, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sn_utils::ls_int32(std::ostream &s, int32_t v)
|
||||||
|
{
|
||||||
|
uint8_t buf[4];
|
||||||
|
buf[0] = v;
|
||||||
|
buf[1] = v >> 8;
|
||||||
|
buf[2] = v >> 16;
|
||||||
|
buf[3] = v >> 24;
|
||||||
|
s.write((char*)buf, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sn_utils::ls_float32(std::ostream &s, float t)
|
||||||
|
{
|
||||||
|
uint32_t v = reinterpret_cast<uint32_t&>(t);
|
||||||
|
uint8_t buf[4];
|
||||||
|
buf[0] = v;
|
||||||
|
buf[1] = v >> 8;
|
||||||
|
buf[2] = v >> 16;
|
||||||
|
buf[3] = v >> 24;
|
||||||
|
s.write((char*)buf, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sn_utils::ls_float64(std::ostream &s, double t)
|
||||||
|
{
|
||||||
|
uint64_t v = reinterpret_cast<uint64_t&>(t);
|
||||||
|
uint8_t buf[8];
|
||||||
|
buf[0] = v;
|
||||||
|
buf[1] = v >> 8;
|
||||||
|
buf[2] = v >> 16;
|
||||||
|
buf[3] = v >> 24;
|
||||||
|
buf[4] = v >> 32;
|
||||||
|
buf[5] = v >> 40;
|
||||||
|
buf[6] = v >> 48;
|
||||||
|
buf[7] = v >> 56;
|
||||||
|
s.write((char*)buf, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sn_utils::s_str(std::ostream &s, std::string v)
|
||||||
|
{
|
||||||
|
const char* buf = v.c_str();
|
||||||
|
s.write(buf, v.size() + 1);
|
||||||
|
}
|
||||||
19
sn_utils.h
19
sn_utils.h
@@ -3,10 +3,17 @@
|
|||||||
class sn_utils
|
class sn_utils
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static uint16_t ld_uint16(std::istream &s);
|
static uint16_t ld_uint16(std::istream&);
|
||||||
static uint32_t ld_uint32(std::istream &s);
|
static uint32_t ld_uint32(std::istream&);
|
||||||
static int32_t ld_int32(std::istream &s);
|
static int32_t ld_int32(std::istream&);
|
||||||
static float ld_float32(std::istream &s);
|
static float ld_float32(std::istream&);
|
||||||
static double ld_float64(std::istream &s);
|
static double ld_float64(std::istream&);
|
||||||
static std::string d_str(std::istream &s);
|
static std::string d_str(std::istream&);
|
||||||
|
|
||||||
|
static void ls_uint16(std::ostream&, uint16_t);
|
||||||
|
static void ls_uint32(std::ostream&, uint32_t);
|
||||||
|
static void ls_int32(std::ostream&, int32_t);
|
||||||
|
static void ls_float32(std::ostream&, float);
|
||||||
|
static void ls_float64(std::ostream&, double);
|
||||||
|
static void s_str(std::ostream&, std::string);
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user