mirror of
https://github.com/overte-org/overte.git
synced 2025-04-26 02:56:31 +02:00
Final code for minecraft import to review
This commit is contained in:
parent
4899f77a0c
commit
4dda71e830
4 changed files with 331 additions and 298 deletions
|
@ -7,42 +7,42 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
Tag::Tag(int tagId, std::stringstream &ss) : _tagId(tagId) {
|
Tag::Tag(int tagId, std::stringstream &ss) : _tagId(tagId) {
|
||||||
int size(ss.get() << 8 | ss.get());
|
int size = ss.get() << 8 | ss.get();
|
||||||
|
|
||||||
_name.clear();
|
_name.clear();
|
||||||
for (int i(0); i < size; ++i) {
|
for (int i = 0; i < size; ++i) {
|
||||||
_name += ss.get();
|
_name += ss.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Tag* Tag::readTag(int tagId, std::stringstream &ss) {
|
Tag* Tag::readTag(int tagId, std::stringstream &ss) {
|
||||||
|
|
||||||
switch (tagId) {
|
switch (tagId) {
|
||||||
case TAG_Byte:
|
case TAG_Byte:
|
||||||
return new TagByte(ss);
|
return new TagByte(ss);
|
||||||
case TAG_Short:
|
case TAG_Short:
|
||||||
return new TagShort(ss);
|
return new TagShort(ss);
|
||||||
case TAG_Int:
|
case TAG_Int:
|
||||||
return new TagInt(ss);
|
return new TagInt(ss);
|
||||||
case TAG_Long:
|
case TAG_Long:
|
||||||
return new TagLong(ss);
|
return new TagLong(ss);
|
||||||
case TAG_Byte_Array:
|
case TAG_Float:
|
||||||
return new TagByteArray(ss);
|
return new TagFloat(ss);
|
||||||
case TAG_String:
|
case TAG_Double:
|
||||||
return new TagString(ss);
|
return new TagDouble(ss);
|
||||||
case TAG_List:
|
case TAG_Byte_Array:
|
||||||
return new TagList(ss);
|
return new TagByteArray(ss);
|
||||||
case TAG_Compound:
|
case TAG_String:
|
||||||
return new TagCompound(ss);
|
return new TagString(ss);
|
||||||
case TAG_Int_Array:
|
case TAG_List:
|
||||||
return new TagIntArray(ss);
|
return new TagList(ss);
|
||||||
case TAG_Float:
|
case TAG_Compound:
|
||||||
case TAG_Double:
|
return new TagCompound(ss);
|
||||||
default:
|
case TAG_Int_Array:
|
||||||
//TODO
|
return new TagIntArray(ss);
|
||||||
exit(EXIT_FAILURE);
|
default:
|
||||||
break;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TagByte::TagByte(std::stringstream &ss) : Tag(TAG_Byte, ss) {
|
TagByte::TagByte(std::stringstream &ss) : Tag(TAG_Byte, ss) {
|
||||||
|
@ -59,15 +59,25 @@ TagInt::TagInt(std::stringstream &ss) : Tag(TAG_Int, ss) {
|
||||||
|
|
||||||
TagLong::TagLong(std::stringstream &ss) : Tag(TAG_Long, ss) {
|
TagLong::TagLong(std::stringstream &ss) : Tag(TAG_Long, ss) {
|
||||||
_data = (((int64_t) ss.get()) << 56 | ((int64_t) ss.get()) << 48
|
_data = (((int64_t) ss.get()) << 56 | ((int64_t) ss.get()) << 48
|
||||||
| ((int64_t) ss.get()) << 40 | ((int64_t) ss.get()) << 32
|
|((int64_t) ss.get()) << 40 | ((int64_t) ss.get()) << 32
|
||||||
| ss.get() << 24 | ss.get() << 16 | ss.get() << 8 | ss.get());
|
| ss.get() << 24 | ss.get() << 16
|
||||||
|
| ss.get() << 8 | ss.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
// We don't need Float and double, so we just ignore the bytes
|
||||||
|
TagFloat::TagFloat(std::stringstream &ss) : Tag(TAG_Float, ss) {
|
||||||
|
ss.seekg(4, ss.cur);
|
||||||
|
}
|
||||||
|
|
||||||
|
TagDouble::TagDouble(std::stringstream &ss) : Tag(TAG_Double, ss) {
|
||||||
|
ss.seekg(8, ss.cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
TagByteArray::TagByteArray(std::stringstream &ss) : Tag(TAG_Byte_Array, ss) {
|
TagByteArray::TagByteArray(std::stringstream &ss) : Tag(TAG_Byte_Array, ss) {
|
||||||
_size = ss.get() << 24 | ss.get() << 16 | ss.get() << 8 | ss.get();
|
_size = ss.get() << 24 | ss.get() << 16 | ss.get() << 8 | ss.get();
|
||||||
|
|
||||||
_data = new char[_size];
|
_data = new char[_size];
|
||||||
for (int i(0); i < _size; ++i) {
|
for (int i = 0; i < _size; ++i) {
|
||||||
_data[i] = ss.get();
|
_data[i] = ss.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,58 +85,64 @@ TagByteArray::TagByteArray(std::stringstream &ss) : Tag(TAG_Byte_Array, ss) {
|
||||||
TagString::TagString(std::stringstream &ss) : Tag(TAG_String, ss) {
|
TagString::TagString(std::stringstream &ss) : Tag(TAG_String, ss) {
|
||||||
_size = ss.get() << 8 | ss.get();
|
_size = ss.get() << 8 | ss.get();
|
||||||
|
|
||||||
for (int i(0); i < _size; ++i) {
|
for (int i = 0; i < _size; ++i) {
|
||||||
_data += ss.get();
|
_data += ss.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TagList::TagList(std::stringstream &ss) : Tag(TAG_List, ss) {
|
TagList::TagList(std::stringstream &ss) :
|
||||||
|
Tag(TAG_List, ss) {
|
||||||
_tagId = ss.get();
|
_tagId = ss.get();
|
||||||
_size = ss.get() << 24 | ss.get() << 16 | ss.get() << 8 | ss.get();
|
_size = ss.get() << 24 | ss.get() << 16 | ss.get() << 8 | ss.get();
|
||||||
|
|
||||||
for (int i(0); i < _size; ++i) {
|
for (int i = 0; i < _size; ++i) {
|
||||||
ss.putback(0);
|
ss.putback(0); ss.putback(0);
|
||||||
ss.putback(0);
|
|
||||||
_data.push_back(readTag(_tagId, ss));
|
_data.push_back(readTag(_tagId, ss));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TagCompound::TagCompound(std::stringstream &ss) : Tag(TAG_Compound, ss),
|
TagCompound::TagCompound(std::stringstream &ss) :
|
||||||
_size(0),
|
Tag(TAG_Compound, ss),
|
||||||
_width(0),
|
_size(0),
|
||||||
_length(0),
|
_width(0),
|
||||||
_height(0),
|
_length(0),
|
||||||
_blocksId(NULL),
|
_height(0),
|
||||||
_blocksData(NULL) {
|
_blocksId(NULL),
|
||||||
int tagId;
|
_blocksData(NULL)
|
||||||
|
{
|
||||||
|
int tagId;
|
||||||
|
|
||||||
while (TAG_End != (tagId = ss.get())) {
|
while (TAG_End != (tagId = ss.get())) {
|
||||||
_data.push_back(readTag(tagId, ss));
|
_data.push_back(readTag(tagId, ss));
|
||||||
++_size;
|
++_size;
|
||||||
|
|
||||||
if (TAG_Short == tagId) {
|
if (NULL == _data.back()) {
|
||||||
if ("Width" == _data.back()->name()) {
|
_blocksId = NULL;
|
||||||
_width = ((TagShort*) _data.back())->data();
|
_blocksData = NULL;
|
||||||
} else if ("Height" == _data.back()->name()) {
|
return;
|
||||||
_height = ((TagShort*) _data.back())->data();
|
} else if (TAG_Short == tagId) {
|
||||||
} else if ("Length" == _data.back()->name()) {
|
if ("Width" == _data.back()->getName()) {
|
||||||
_length = ((TagShort*) _data.back())->data();
|
_width = ((TagShort*) _data.back())->getData();
|
||||||
}
|
} else if ("Height" == _data.back()->getName()) {
|
||||||
} else if (TAG_Byte_Array == tagId) {
|
_height = ((TagShort*) _data.back())->getData();
|
||||||
if ("Blocks" == _data.back()->name()) {
|
} else if ("Length" == _data.back()->getName()) {
|
||||||
_blocksId = ((TagByteArray*) _data.back())->data();
|
_length = ((TagShort*) _data.back())->getData();
|
||||||
} else if ("Data" == _data.back()->name()) {
|
}
|
||||||
_blocksData = ((TagByteArray*) _data.back())->data();
|
} else if (TAG_Byte_Array == tagId) {
|
||||||
|
if ("Blocks" == _data.back()->getName()) {
|
||||||
|
_blocksId = ((TagByteArray*) _data.back())->getData();
|
||||||
|
} else if ("Data" == _data.back()->getName()) {
|
||||||
|
_blocksData = ((TagByteArray*) _data.back())->getData();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TagIntArray::TagIntArray(std::stringstream &ss) : Tag(TAG_Int_Array, ss) {
|
TagIntArray::TagIntArray(std::stringstream &ss) : Tag(TAG_Int_Array, ss) {
|
||||||
_size = ss.get() << 24 | ss.get() << 16 | ss.get() << 8 | ss.get();
|
_size = ss.get() << 24 | ss.get() << 16 | ss.get() << 8 | ss.get();
|
||||||
|
|
||||||
_data = new int[_size];
|
_data = new int[_size];
|
||||||
for (int i(0); i < _size; ++i) {
|
for (int i = 0; i < _size; ++i) {
|
||||||
_data[i] = ss.get();
|
_data[i] = ss.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -162,22 +178,22 @@ int ungzip(std::ifstream &file, std::stringstream &ss) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int full_length = gzipedBytes.size();
|
unsigned int full_length = gzipedBytes.size();
|
||||||
unsigned int half_length = gzipedBytes.size()/2;
|
unsigned int half_length = gzipedBytes.size()/2;
|
||||||
unsigned int uncompLength = full_length;
|
unsigned int uncompLength = full_length;
|
||||||
|
|
||||||
char* uncomp = (char*) calloc(sizeof(char), uncompLength);
|
char* uncomp = (char*) calloc(sizeof(char), uncompLength);
|
||||||
|
|
||||||
z_stream strm;
|
z_stream strm;
|
||||||
strm.next_in = (Bytef *) gzipedBytes.c_str();
|
strm.next_in = (Bytef *) gzipedBytes.c_str();
|
||||||
strm.avail_in = gzipedBytes.size();
|
strm.avail_in = full_length;
|
||||||
strm.total_out = 0;
|
strm.total_out = 0;
|
||||||
strm.zalloc = Z_NULL;
|
strm.zalloc = Z_NULL;
|
||||||
strm.zfree = Z_NULL;
|
strm.zfree = Z_NULL;
|
||||||
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
|
||||||
if (inflateInit2(&strm, (16+MAX_WBITS)) != Z_OK) {
|
if (inflateInit2(&strm, (16 + MAX_WBITS)) != Z_OK) {
|
||||||
free(uncomp);
|
free(uncomp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -187,13 +203,13 @@ int ungzip(std::ifstream &file, std::stringstream &ss) {
|
||||||
if (strm.total_out >= uncompLength) {
|
if (strm.total_out >= uncompLength) {
|
||||||
// Increase size of output buffer
|
// Increase size of output buffer
|
||||||
char* uncomp2 = (char*) calloc(sizeof(char), uncompLength + half_length);
|
char* uncomp2 = (char*) calloc(sizeof(char), uncompLength + half_length);
|
||||||
memcpy( uncomp2, uncomp, uncompLength );
|
memcpy(uncomp2, uncomp, uncompLength);
|
||||||
uncompLength += half_length;
|
uncompLength += half_length;
|
||||||
free(uncomp);
|
free(uncomp);
|
||||||
uncomp = uncomp2;
|
uncomp = uncomp2;
|
||||||
}
|
}
|
||||||
|
|
||||||
strm.next_out = (Bytef *) (uncomp + strm.total_out);
|
strm.next_out = (Bytef *) (uncomp + strm.total_out);
|
||||||
strm.avail_out = uncompLength - strm.total_out;
|
strm.avail_out = uncompLength - strm.total_out;
|
||||||
|
|
||||||
// Inflate another chunk.
|
// Inflate another chunk.
|
||||||
|
@ -207,7 +223,7 @@ int ungzip(std::ifstream &file, std::stringstream &ss) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i=0; i<strm.total_out; ++i) {
|
for (size_t i = 0; i < strm.total_out; ++i) {
|
||||||
ss << uncomp[i];
|
ss << uncomp[i];
|
||||||
}
|
}
|
||||||
free(uncomp);
|
free(uncomp);
|
||||||
|
|
|
@ -29,8 +29,8 @@ class Tag {
|
||||||
public:
|
public:
|
||||||
Tag(int tagId, std::stringstream &ss);
|
Tag(int tagId, std::stringstream &ss);
|
||||||
|
|
||||||
int tagId() const {return _tagId;}
|
int getTagId() const {return _tagId;}
|
||||||
std::string name () const {return _name; }
|
std::string getName () const {return _name; }
|
||||||
|
|
||||||
static Tag* readTag(int tagId, std::stringstream &ss);
|
static Tag* readTag(int tagId, std::stringstream &ss);
|
||||||
};
|
};
|
||||||
|
@ -42,7 +42,7 @@ class TagByte : public Tag {
|
||||||
public:
|
public:
|
||||||
TagByte(std::stringstream &ss);
|
TagByte(std::stringstream &ss);
|
||||||
|
|
||||||
int8_t data() const {return _data;}
|
int8_t getData() const {return _data;}
|
||||||
};
|
};
|
||||||
|
|
||||||
class TagShort : public Tag {
|
class TagShort : public Tag {
|
||||||
|
@ -52,7 +52,7 @@ class TagShort : public Tag {
|
||||||
public:
|
public:
|
||||||
TagShort(std::stringstream &ss);
|
TagShort(std::stringstream &ss);
|
||||||
|
|
||||||
int16_t data() const {return _data;}
|
int16_t getData() const {return _data;}
|
||||||
};
|
};
|
||||||
|
|
||||||
class TagInt : public Tag {
|
class TagInt : public Tag {
|
||||||
|
@ -62,7 +62,7 @@ class TagInt : public Tag {
|
||||||
public:
|
public:
|
||||||
TagInt(std::stringstream &ss);
|
TagInt(std::stringstream &ss);
|
||||||
|
|
||||||
int32_t data() const {return _data;}
|
int32_t getData() const {return _data;}
|
||||||
};
|
};
|
||||||
|
|
||||||
class TagLong : public Tag {
|
class TagLong : public Tag {
|
||||||
|
@ -72,7 +72,17 @@ class TagLong : public Tag {
|
||||||
public:
|
public:
|
||||||
TagLong(std::stringstream &ss);
|
TagLong(std::stringstream &ss);
|
||||||
|
|
||||||
int64_t data() const {return _data;}
|
int64_t getData() const {return _data;}
|
||||||
|
};
|
||||||
|
|
||||||
|
class TagFloat : public Tag {
|
||||||
|
public:
|
||||||
|
TagFloat(std::stringstream &ss);
|
||||||
|
};
|
||||||
|
|
||||||
|
class TagDouble : public Tag {
|
||||||
|
public:
|
||||||
|
TagDouble(std::stringstream &ss);
|
||||||
};
|
};
|
||||||
|
|
||||||
class TagByteArray : public Tag {
|
class TagByteArray : public Tag {
|
||||||
|
@ -83,8 +93,8 @@ class TagByteArray : public Tag {
|
||||||
public:
|
public:
|
||||||
TagByteArray(std::stringstream &ss);
|
TagByteArray(std::stringstream &ss);
|
||||||
|
|
||||||
int size() const {return _size;}
|
int getSize() const {return _size;}
|
||||||
char* data() const {return _data;}
|
char* getData() const {return _data;}
|
||||||
};
|
};
|
||||||
|
|
||||||
class TagString : public Tag {
|
class TagString : public Tag {
|
||||||
|
@ -95,27 +105,27 @@ class TagString : public Tag {
|
||||||
public:
|
public:
|
||||||
TagString(std::stringstream &ss);
|
TagString(std::stringstream &ss);
|
||||||
|
|
||||||
int size() const {return _size;}
|
int getSize() const {return _size;}
|
||||||
std::string data() const {return _data;}
|
std::string getData() const {return _data;}
|
||||||
};
|
};
|
||||||
|
|
||||||
class TagList : public Tag {
|
class TagList : public Tag {
|
||||||
private:
|
private:
|
||||||
int _tagId;
|
int _tagId;
|
||||||
int _size;
|
int _size;
|
||||||
std::list<Tag*> _data;
|
std::list<Tag*> _data;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TagList(std::stringstream &ss);
|
TagList(std::stringstream &ss);
|
||||||
|
|
||||||
int tagId() const {return _tagId;}
|
int getTagId() const {return _tagId;}
|
||||||
int size () const {return _size; }
|
int getSize () const {return _size; }
|
||||||
std::list<Tag*> data () const {return _data; }
|
std::list<Tag*> getData () const {return _data; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class TagCompound : public Tag {
|
class TagCompound : public Tag {
|
||||||
private:
|
private:
|
||||||
int _size;
|
int _size;
|
||||||
std::list<Tag*> _data;
|
std::list<Tag*> _data;
|
||||||
|
|
||||||
// Specific to schematics file
|
// Specific to schematics file
|
||||||
|
@ -128,14 +138,14 @@ class TagCompound : public Tag {
|
||||||
public:
|
public:
|
||||||
TagCompound(std::stringstream &ss);
|
TagCompound(std::stringstream &ss);
|
||||||
|
|
||||||
int size () const {return _size; }
|
int getSize () const {return _size; }
|
||||||
std::list<Tag*> data () const {return _data; }
|
std::list<Tag*> getData () const {return _data; }
|
||||||
|
|
||||||
int width () const {return _width; }
|
int getWidth () const {return _width; }
|
||||||
int length () const {return _length; }
|
int getLength () const {return _length; }
|
||||||
int height () const {return _height; }
|
int getHeight () const {return _height; }
|
||||||
char* blockId () const {return _blocksId; }
|
char* getBlocksId () const {return _blocksId; }
|
||||||
char* blocksData() const {return _blocksData;}
|
char* getBlocksData() const {return _blocksData;}
|
||||||
};
|
};
|
||||||
|
|
||||||
class TagIntArray : public Tag {
|
class TagIntArray : public Tag {
|
||||||
|
@ -147,6 +157,6 @@ class TagIntArray : public Tag {
|
||||||
TagIntArray(std::stringstream &ss);
|
TagIntArray(std::stringstream &ss);
|
||||||
~TagIntArray() {delete _data;}
|
~TagIntArray() {delete _data;}
|
||||||
|
|
||||||
int size() const {return _size;}
|
int getSize() const {return _size;}
|
||||||
int* data() const {return _data;}
|
int* getData() const {return _data;}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1461,228 +1461,77 @@ bool VoxelTree::readFromSchematicsFile(const char *fileName) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
int err = retrieveData(fileName, ss);
|
int err = retrieveData(fileName, ss);
|
||||||
if (err && TAG_Compound != ss.get()) {
|
if (err && TAG_Compound != ss.get()) {
|
||||||
printLog("ERROR: Invalid schematic file.\n");
|
printLog("[ERROR] Invalid schematic file.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ss.get();
|
ss.get();
|
||||||
TagCompound schematics(ss);
|
TagCompound schematics(ss);
|
||||||
if (!schematics.blockId()) {
|
if (!schematics.getBlocksId() || !schematics.getBlocksData()) {
|
||||||
printLog("ERROR: Can't read schematic data.\n");
|
printLog("[ERROR] Invalid schematic file.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int max = (schematics.width() > schematics.length()) ? schematics.width() : schematics.length();
|
int max = (schematics.getWidth() > schematics.getLength()) ? schematics.getWidth() : schematics.getLength();
|
||||||
max = (max > schematics.height()) ? max : schematics.height();
|
max = (max > schematics.getHeight()) ? max : schematics.getHeight();
|
||||||
|
|
||||||
int scale = 1;
|
int scale = 1;
|
||||||
while (max > scale) scale *= 2;
|
while (max > scale) scale *= 2;
|
||||||
float size = 1.0f / scale;
|
float size = 1.0f / scale;
|
||||||
|
|
||||||
bool create = false;
|
int create = 1;
|
||||||
int red = 128, green = 128, blue = 128;
|
int red = 128, green = 128, blue = 128;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
for (int y = 0; y < schematics.height(); ++y) {
|
for (int y = 0; y < schematics.getHeight(); ++y) {
|
||||||
for (int z = 0; z < schematics.length(); ++z) {
|
for (int z = 0; z < schematics.getLength(); ++z) {
|
||||||
for (int x = 0; x < schematics.width(); ++x) {
|
for (int x = 0; x < schematics.getWidth(); ++x) {
|
||||||
int pos = ((y * schematics.length()) + z) * schematics.width() + x;
|
int pos = ((y * schematics.getLength()) + z) * schematics.getWidth() + x;
|
||||||
int id = schematics.blockId()[pos];
|
int id = schematics.getBlocksId()[pos];
|
||||||
|
int data = schematics.getBlocksData()[pos];
|
||||||
|
|
||||||
create = true;
|
create = 1;
|
||||||
switch (id) {
|
computeBlockColor(id, data, &red, &green, &blue, &create);
|
||||||
case 1:
|
|
||||||
case 14:
|
|
||||||
case 15:
|
|
||||||
case 16:
|
|
||||||
case 21:
|
|
||||||
case 56:
|
|
||||||
case 73:
|
|
||||||
case 74:
|
|
||||||
case 97:
|
|
||||||
case 129: red = 128; green = 128; blue = 128; break;
|
|
||||||
case 2: red = 77; green = 117; blue = 66; break;
|
|
||||||
case 3:
|
|
||||||
case 60: red = 116; green = 83; blue = 56; break;
|
|
||||||
case 4: red = 71; green = 71; blue = 71; break;
|
|
||||||
case 5:
|
|
||||||
case 125: red = 133; green = 94; blue = 62; break;
|
|
||||||
case 7: red = 35; green = 35; blue = 35; break;
|
|
||||||
case 8:
|
|
||||||
case 9: red = 100; green = 109; blue = 185; break;
|
|
||||||
case 10:
|
|
||||||
case 11: red = 192; green = 64; blue = 8; break;
|
|
||||||
case 12: red = 209; green = 199; blue = 155; break;
|
|
||||||
case 13: red = 96; green = 94; blue = 93; break;
|
|
||||||
case 17: red = 71; green = 56; blue = 35; break;
|
|
||||||
case 18: red = 76; green = 104; blue = 64; break;
|
|
||||||
case 19: red = 119; green = 119; blue = 37; break;
|
|
||||||
case 22: red = 22; green = 44; blue = 86; break;
|
|
||||||
case 23:
|
|
||||||
case 29:
|
|
||||||
case 33:
|
|
||||||
case 61:
|
|
||||||
case 62:
|
|
||||||
case 158: red = 61; green = 61; blue = 61; break;
|
|
||||||
case 24: red = 209; green = 202; blue = 156; break;
|
|
||||||
case 25:
|
|
||||||
case 58:
|
|
||||||
case 84:
|
|
||||||
case 137: red = 57; green = 38; blue = 25; break;
|
|
||||||
case 35:
|
|
||||||
switch (schematics.blocksData()[pos]) {
|
|
||||||
case 0: red = 234; green = 234; blue = 234; break;
|
|
||||||
case 1: red = 224; green = 140; blue = 84; break;
|
|
||||||
case 2: red = 185; green = 90; blue = 194; break;
|
|
||||||
case 3: red = 124; green = 152; blue = 208; break;
|
|
||||||
case 4: red = 165; green = 154; blue = 35; break;
|
|
||||||
case 5: red = 70; green = 187; blue = 61; break;
|
|
||||||
case 6: red = 206; green = 124; blue = 145; break;
|
|
||||||
case 7: red = 66; green = 66; blue = 66; break;
|
|
||||||
case 8: red = 170; green = 176; blue = 176; break;
|
|
||||||
case 9: red = 45; green = 108; blue = 35; break;
|
|
||||||
case 10: red = 130; green = 62; blue = 8; break;
|
|
||||||
case 11: red = 43; green = 51; blue = 29; break;
|
|
||||||
case 12: red = 73; green = 47; blue = 29; break;
|
|
||||||
case 13: red = 57; green = 76; blue = 36; break;
|
|
||||||
case 14: red = 165; green = 58; blue = 53; break;
|
|
||||||
case 15: red = 24; green = 24; blue = 24; break;
|
|
||||||
default:
|
|
||||||
create = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 41: red = 239; green = 238; blue = 105; break;
|
|
||||||
case 42: red = 146; green = 146; blue = 146; break;
|
|
||||||
case 43:
|
|
||||||
case 98: red = 161; green = 161; blue = 161; break;
|
|
||||||
case 44:
|
|
||||||
switch (schematics.blocksData()[pos]) {
|
|
||||||
case 0: red = 161; green = 161; blue = 161; break;
|
|
||||||
case 1: red = 209; green = 202; blue = 156; break;
|
|
||||||
case 2: red = 133; green = 94; blue = 62; break;
|
|
||||||
case 3: red = 71; green = 71; blue = 71; break;
|
|
||||||
case 4: red = 121; green = 67; blue = 53; break;
|
|
||||||
case 5: red = 161; green = 161; blue = 161; break;
|
|
||||||
case 6: red = 45; green = 22; blue = 26; break;
|
|
||||||
case 7: red = 195; green = 192; blue = 185; break;
|
|
||||||
default:
|
|
||||||
create = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (create) {
|
switch (create) {
|
||||||
createVoxel(size * x , size * y, size * z , size / 2, red, green, blue, true);
|
case 1:
|
||||||
createVoxel(size * x + size / 2, size * y, size * z , size / 2, red, green, blue, true);
|
|
||||||
createVoxel(size * x , size * y, size * z + size / 2, size / 2, red, green, blue, true);
|
|
||||||
createVoxel(size * x + size / 2, size * y, size * z + size / 2, size / 2, red, green, blue, true);
|
|
||||||
count += 4;
|
|
||||||
create = false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 45: red = 121; green = 67; blue = 53; break;
|
|
||||||
case 46: red = 118; green = 36; blue = 13; break;
|
|
||||||
case 47: red = 155; green = 127; blue = 76; break;
|
|
||||||
case 48: red = 61; green = 79; blue = 61; break;
|
|
||||||
case 49: red = 52; green = 41; blue = 74; break;
|
|
||||||
case 52: red = 12; green = 66; blue = 71; break;
|
|
||||||
case 53:
|
|
||||||
case 67:
|
|
||||||
case 108:
|
|
||||||
case 109:
|
|
||||||
case 114:
|
|
||||||
case 128:
|
|
||||||
case 134:
|
|
||||||
case 135:
|
|
||||||
case 136:
|
|
||||||
case 156:
|
|
||||||
switch (id) {
|
|
||||||
case 53:
|
|
||||||
case 134:
|
|
||||||
case 135:
|
|
||||||
case 136: red = 133; green = 94; blue = 62; break;
|
|
||||||
case 67: red = 71; green = 71; blue = 71; break;
|
|
||||||
case 108: red = 121; green = 67; blue = 53; break;
|
|
||||||
case 109: red = 161; green = 161; blue = 161; break;
|
|
||||||
case 114: red = 45; green = 22; blue = 26; break;
|
|
||||||
case 128: red = 209; green = 202; blue = 156; break;
|
|
||||||
case 156: red = 195; green = 192; blue = 185; break;
|
|
||||||
default:
|
|
||||||
create = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (create) {
|
|
||||||
createVoxel(size * x , size * y, size * z , size / 2, red, green, blue, true);
|
|
||||||
createVoxel(size * x + size / 2, size * y, size * z , size / 2, red, green, blue, true);
|
|
||||||
createVoxel(size * x , size * y, size * z + size / 2, size / 2, red, green, blue, true);
|
|
||||||
createVoxel(size * x + size / 2, size * y, size * z + size / 2, size / 2, red, green, blue, true);
|
|
||||||
|
|
||||||
switch (schematics.blocksData()[pos]) {
|
|
||||||
case 0:
|
|
||||||
createVoxel(size * x + size / 2, size * y + size / 2, size * z , size / 2, red, green, blue, true);
|
|
||||||
createVoxel(size * x + size / 2, size * y + size / 2, size * z + size / 2, size / 2, red, green, blue, true);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
createVoxel(size * x , size * y + size / 2, size * z , size / 2, red, green, blue, true);
|
|
||||||
createVoxel(size * x , size * y + size / 2, size * z + size / 2, size / 2, red, green, blue, true);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
createVoxel(size * x , size * y + size / 2, size * z + size / 2, size / 2, red, green, blue, true);
|
|
||||||
createVoxel(size * x + size / 2, size * y + size / 2, size * z + size / 2, size / 2, red, green, blue, true);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
createVoxel(size * x , size * y + size / 2, size * z , size / 2, red, green, blue, true);
|
|
||||||
createVoxel(size * x + size / 2, size * y + size / 2, size * z , size / 2, red, green, blue, true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
count += 6;
|
|
||||||
create = false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 54:
|
|
||||||
case 95:
|
|
||||||
case 146: red = 155; green = 105; blue = 32; break;
|
|
||||||
case 57: red = 145; green = 219; blue = 215; break;
|
|
||||||
case 79: red = 142; green = 162; blue = 195; break;
|
|
||||||
case 80: red = 255; green = 255; blue = 255; break;
|
|
||||||
case 81: red = 8; green = 64; blue = 15; break;
|
|
||||||
case 82: red = 150; green = 155; blue = 166; break;
|
|
||||||
case 86:
|
|
||||||
case 91: red = 179; green = 108; blue = 17; break;
|
|
||||||
case 87:
|
|
||||||
case 153: red = 91; green = 31; blue = 30; break;
|
|
||||||
case 88: red = 68; green = 49; blue = 38; break;
|
|
||||||
case 89: red = 180; green = 134; blue = 65; break;
|
|
||||||
case 103: red = 141; green = 143; blue = 36; break;
|
|
||||||
case 110: red = 103; green = 92; blue = 95; break;
|
|
||||||
case 112: red = 45; green = 22; blue = 26; break;
|
|
||||||
case 121: red = 183; green = 178; blue = 129; break;
|
|
||||||
case 123: red = 101; green = 59; blue = 31; break;
|
|
||||||
case 124: red = 213; green = 178; blue = 123; break;
|
|
||||||
case 130: red = 38; green = 54; blue = 56; break;
|
|
||||||
case 133: red = 53; green = 84; blue = 85; break;
|
|
||||||
case 152: red = 131; green = 22; blue = 7; break;
|
|
||||||
case 155: red = 195; green = 192; blue = 185; break;
|
|
||||||
case 159: red = 195; green = 165; blue = 150; break;
|
|
||||||
case 170: red = 168; green = 139; blue = 15; break;
|
|
||||||
case 172: red = 140; green = 86; blue = 61; break;
|
|
||||||
case 173: red = 9; green = 9; blue = 9; break;
|
|
||||||
default:
|
|
||||||
create = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (create) {
|
|
||||||
createVoxel(size * x, size * y, size * z, size, red, green, blue, true);
|
createVoxel(size * x, size * y, size * z, size, red, green, blue, true);
|
||||||
++count;
|
++count;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch (data) {
|
||||||
|
case 0:
|
||||||
|
createVoxel(size * x + size / 2, size * y + size / 2, size * z , size / 2, red, green, blue, true);
|
||||||
|
createVoxel(size * x + size / 2, size * y + size / 2, size * z + size / 2, size / 2, red, green, blue, true);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
createVoxel(size * x , size * y + size / 2, size * z , size / 2, red, green, blue, true);
|
||||||
|
createVoxel(size * x , size * y + size / 2, size * z + size / 2, size / 2, red, green, blue, true);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
createVoxel(size * x , size * y + size / 2, size * z + size / 2, size / 2, red, green, blue, true);
|
||||||
|
createVoxel(size * x + size / 2, size * y + size / 2, size * z + size / 2, size / 2, red, green, blue, true);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
createVoxel(size * x , size * y + size / 2, size * z , size / 2, red, green, blue, true);
|
||||||
|
createVoxel(size * x + size / 2, size * y + size / 2, size * z , size / 2, red, green, blue, true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
count += 2;
|
||||||
|
// There's no break on purpose.
|
||||||
|
case 3:
|
||||||
|
createVoxel(size * x , size * y, size * z , size / 2, red, green, blue, true);
|
||||||
|
createVoxel(size * x + size / 2, size * y, size * z , size / 2, red, green, blue, true);
|
||||||
|
createVoxel(size * x , size * y, size * z + size / 2, size / 2, red, green, blue, true);
|
||||||
|
createVoxel(size * x + size / 2, size * y, size * z + size / 2, size / 2, red, green, blue, true);
|
||||||
|
count += 4;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printLog("Created %d voxels frome minecraft import.\n", count);
|
printLog("Created %d voxels from minecraft import.\n", count);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1771,3 +1620,160 @@ void VoxelTree::copyFromTreeIntoSubTree(VoxelTree* sourceTree, VoxelNode* destin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VoxelTree::computeBlockColor(int id, int data, int* r, int* g, int* b, int* create) {
|
||||||
|
int red = *r, green = *g, blue = *b;
|
||||||
|
|
||||||
|
switch (id) {
|
||||||
|
case 1:
|
||||||
|
case 14:
|
||||||
|
case 15:
|
||||||
|
case 16:
|
||||||
|
case 21:
|
||||||
|
case 56:
|
||||||
|
case 73:
|
||||||
|
case 74:
|
||||||
|
case 97:
|
||||||
|
case 129: red = 128; green = 128; blue = 128; break;
|
||||||
|
case 2: red = 77; green = 117; blue = 66; break;
|
||||||
|
case 3:
|
||||||
|
case 60: red = 116; green = 83; blue = 56; break;
|
||||||
|
case 4: red = 71; green = 71; blue = 71; break;
|
||||||
|
case 5:
|
||||||
|
case 125: red = 133; green = 94; blue = 62; break;
|
||||||
|
case 7: red = 35; green = 35; blue = 35; break;
|
||||||
|
case 8:
|
||||||
|
case 9: red = 100; green = 109; blue = 185; break;
|
||||||
|
case 10:
|
||||||
|
case 11: red = 192; green = 64; blue = 8; break;
|
||||||
|
case 12: red = 209; green = 199; blue = 155; break;
|
||||||
|
case 13: red = 96; green = 94; blue = 93; break;
|
||||||
|
case 17: red = 71; green = 56; blue = 35; break;
|
||||||
|
case 18: red = 76; green = 104; blue = 64; break;
|
||||||
|
case 19: red = 119; green = 119; blue = 37; break;
|
||||||
|
case 22: red = 22; green = 44; blue = 86; break;
|
||||||
|
case 23:
|
||||||
|
case 29:
|
||||||
|
case 33:
|
||||||
|
case 61:
|
||||||
|
case 62:
|
||||||
|
case 158: red = 61; green = 61; blue = 61; break;
|
||||||
|
case 24: red = 209; green = 202; blue = 156; break;
|
||||||
|
case 25:
|
||||||
|
case 58:
|
||||||
|
case 84:
|
||||||
|
case 137: red = 57; green = 38; blue = 25; break;
|
||||||
|
case 35:
|
||||||
|
switch (data) {
|
||||||
|
case 0: red = 234; green = 234; blue = 234; break;
|
||||||
|
case 1: red = 224; green = 140; blue = 84; break;
|
||||||
|
case 2: red = 185; green = 90; blue = 194; break;
|
||||||
|
case 3: red = 124; green = 152; blue = 208; break;
|
||||||
|
case 4: red = 165; green = 154; blue = 35; break;
|
||||||
|
case 5: red = 70; green = 187; blue = 61; break;
|
||||||
|
case 6: red = 206; green = 124; blue = 145; break;
|
||||||
|
case 7: red = 66; green = 66; blue = 66; break;
|
||||||
|
case 8: red = 170; green = 176; blue = 176; break;
|
||||||
|
case 9: red = 45; green = 108; blue = 35; break;
|
||||||
|
case 10: red = 130; green = 62; blue = 8; break;
|
||||||
|
case 11: red = 43; green = 51; blue = 29; break;
|
||||||
|
case 12: red = 73; green = 47; blue = 29; break;
|
||||||
|
case 13: red = 57; green = 76; blue = 36; break;
|
||||||
|
case 14: red = 165; green = 58; blue = 53; break;
|
||||||
|
case 15: red = 24; green = 24; blue = 24; break;
|
||||||
|
default:
|
||||||
|
*create = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 41: red = 239; green = 238; blue = 105; break;
|
||||||
|
case 42: red = 146; green = 146; blue = 146; break;
|
||||||
|
case 43:
|
||||||
|
case 98: red = 161; green = 161; blue = 161; break;
|
||||||
|
case 44:
|
||||||
|
*create = 3;
|
||||||
|
|
||||||
|
switch (data) {
|
||||||
|
case 0: red = 161; green = 161; blue = 161; break;
|
||||||
|
case 1: red = 209; green = 202; blue = 156; break;
|
||||||
|
case 2: red = 133; green = 94; blue = 62; break;
|
||||||
|
case 3: red = 71; green = 71; blue = 71; break;
|
||||||
|
case 4: red = 121; green = 67; blue = 53; break;
|
||||||
|
case 5: red = 161; green = 161; blue = 161; break;
|
||||||
|
case 6: red = 45; green = 22; blue = 26; break;
|
||||||
|
case 7: red = 195; green = 192; blue = 185; break;
|
||||||
|
default:
|
||||||
|
*create = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 45: red = 121; green = 67; blue = 53; break;
|
||||||
|
case 46: red = 118; green = 36; blue = 13; break;
|
||||||
|
case 47: red = 155; green = 127; blue = 76; break;
|
||||||
|
case 48: red = 61; green = 79; blue = 61; break;
|
||||||
|
case 49: red = 52; green = 41; blue = 74; break;
|
||||||
|
case 52: red = 12; green = 66; blue = 71; break;
|
||||||
|
case 53:
|
||||||
|
case 67:
|
||||||
|
case 108:
|
||||||
|
case 109:
|
||||||
|
case 114:
|
||||||
|
case 128:
|
||||||
|
case 134:
|
||||||
|
case 135:
|
||||||
|
case 136:
|
||||||
|
case 156:
|
||||||
|
*create = 2;
|
||||||
|
|
||||||
|
switch (id) {
|
||||||
|
case 53:
|
||||||
|
case 134:
|
||||||
|
case 135:
|
||||||
|
case 136: red = 133; green = 94; blue = 62; break;
|
||||||
|
case 67: red = 71; green = 71; blue = 71; break;
|
||||||
|
case 108: red = 121; green = 67; blue = 53; break;
|
||||||
|
case 109: red = 161; green = 161; blue = 161; break;
|
||||||
|
case 114: red = 45; green = 22; blue = 26; break;
|
||||||
|
case 128: red = 209; green = 202; blue = 156; break;
|
||||||
|
case 156: red = 195; green = 192; blue = 185; break;
|
||||||
|
default:
|
||||||
|
*create = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 54:
|
||||||
|
case 95:
|
||||||
|
case 146: red = 155; green = 105; blue = 32; break;
|
||||||
|
case 57: red = 145; green = 219; blue = 215; break;
|
||||||
|
case 79: red = 142; green = 162; blue = 195; break;
|
||||||
|
case 80: red = 255; green = 255; blue = 255; break;
|
||||||
|
case 81: red = 8; green = 64; blue = 15; break;
|
||||||
|
case 82: red = 150; green = 155; blue = 166; break;
|
||||||
|
case 86:
|
||||||
|
case 91: red = 179; green = 108; blue = 17; break;
|
||||||
|
case 87:
|
||||||
|
case 153: red = 91; green = 31; blue = 30; break;
|
||||||
|
case 88: red = 68; green = 49; blue = 38; break;
|
||||||
|
case 89: red = 180; green = 134; blue = 65; break;
|
||||||
|
case 103: red = 141; green = 143; blue = 36; break;
|
||||||
|
case 110: red = 103; green = 92; blue = 95; break;
|
||||||
|
case 112: red = 45; green = 22; blue = 26; break;
|
||||||
|
case 121: red = 183; green = 178; blue = 129; break;
|
||||||
|
case 123: red = 101; green = 59; blue = 31; break;
|
||||||
|
case 124: red = 213; green = 178; blue = 123; break;
|
||||||
|
case 130: red = 38; green = 54; blue = 56; break;
|
||||||
|
case 133: red = 53; green = 84; blue = 85; break;
|
||||||
|
case 152: red = 131; green = 22; blue = 7; break;
|
||||||
|
case 155: red = 195; green = 192; blue = 185; break;
|
||||||
|
case 159: red = 195; green = 165; blue = 150; break;
|
||||||
|
case 170: red = 168; green = 139; blue = 15; break;
|
||||||
|
case 172: red = 140; green = 86; blue = 61; break;
|
||||||
|
case 173: red = 9; green = 9; blue = 9; break;
|
||||||
|
default:
|
||||||
|
*create = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*r = red;
|
||||||
|
*g = green;
|
||||||
|
*b = blue;
|
||||||
|
}
|
||||||
|
|
|
@ -136,6 +136,7 @@ public:
|
||||||
// reads voxels from square image with alpha as a Y-axis
|
// reads voxels from square image with alpha as a Y-axis
|
||||||
bool readFromSquareARGB32Pixels(const uint32_t* pixels, int dimension);
|
bool readFromSquareARGB32Pixels(const uint32_t* pixels, int dimension);
|
||||||
bool readFromSchematicsFile(const char* filename);
|
bool readFromSchematicsFile(const char* filename);
|
||||||
|
void computeBlockColor(int id, int data, int* r, int* g, int* b, int* create);
|
||||||
|
|
||||||
unsigned long getVoxelCount();
|
unsigned long getVoxelCount();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue