Merge pull request #3333 from RichardTea/acloader_enums
ACLoader: Use Surface type enumspull/3329/head^2
commit
52c29612f7
|
@ -471,32 +471,33 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object,
|
||||||
++node->mNumMeshes;
|
++node->mNumMeshes;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ((*it).flags & 0xf) {
|
switch ((*it).GetType()) {
|
||||||
// closed line
|
// closed line
|
||||||
case 0x1:
|
case Surface::ClosedLine:
|
||||||
needMat[idx].first += (unsigned int)(*it).entries.size();
|
needMat[idx].first += (unsigned int)(*it).entries.size();
|
||||||
needMat[idx].second += (unsigned int)(*it).entries.size() << 1u;
|
needMat[idx].second += (unsigned int)(*it).entries.size() << 1u;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// unclosed line
|
// unclosed line
|
||||||
case 0x2:
|
case Surface::OpenLine:
|
||||||
needMat[idx].first += (unsigned int)(*it).entries.size() - 1;
|
needMat[idx].first += (unsigned int)(*it).entries.size() - 1;
|
||||||
needMat[idx].second += ((unsigned int)(*it).entries.size() - 1) << 1u;
|
needMat[idx].second += ((unsigned int)(*it).entries.size() - 1) << 1u;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// triangle strip
|
// triangle strip
|
||||||
case 0x4:
|
case Surface::TriangleStrip:
|
||||||
needMat[idx].first += (unsigned int)(*it).entries.size() - 2;
|
needMat[idx].first += (unsigned int)(*it).entries.size() - 2;
|
||||||
needMat[idx].second += ((unsigned int)(*it).entries.size() - 2) * 3;
|
needMat[idx].second += ((unsigned int)(*it).entries.size() - 2) * 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 0 == polygon, else unknown
|
|
||||||
default:
|
default:
|
||||||
if ((*it).flags & 0xf) {
|
// Coerce unknowns to a polygon and warn
|
||||||
ASSIMP_LOG_WARN("AC3D: The type flag of a surface is unknown");
|
ASSIMP_LOG_WARN_F("AC3D: The type flag of a surface is unknown: ", (*it).flags);
|
||||||
(*it).flags &= ~(0xf);
|
(*it).flags &= ~(Surface::Mask);
|
||||||
}
|
// fallthrough
|
||||||
|
|
||||||
|
// polygon
|
||||||
|
case Surface::Polygon:
|
||||||
// the number of faces increments by one, the number
|
// the number of faces increments by one, the number
|
||||||
// of vertices by surface.numref.
|
// of vertices by surface.numref.
|
||||||
needMat[idx].first++;
|
needMat[idx].first++;
|
||||||
|
@ -552,8 +553,8 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object,
|
||||||
const Surface &src = *it;
|
const Surface &src = *it;
|
||||||
|
|
||||||
// closed polygon
|
// closed polygon
|
||||||
unsigned int type = (*it).flags & 0xf;
|
uint8_t type = (*it).GetType();
|
||||||
if (!type) {
|
if (type == Surface::Polygon) {
|
||||||
aiFace &face = *faces++;
|
aiFace &face = *faces++;
|
||||||
face.mNumIndices = (unsigned int)src.entries.size();
|
face.mNumIndices = (unsigned int)src.entries.size();
|
||||||
if (0 != face.mNumIndices) {
|
if (0 != face.mNumIndices) {
|
||||||
|
@ -576,7 +577,7 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (type == 0x4) {
|
} else if (type == Surface::TriangleStrip) {
|
||||||
for (unsigned int i = 0; i < (unsigned int)src.entries.size() - 2; ++i) {
|
for (unsigned int i = 0; i < (unsigned int)src.entries.size() - 2; ++i) {
|
||||||
const Surface::SurfaceEntry &entry1 = src.entries[i];
|
const Surface::SurfaceEntry &entry1 = src.entries[i];
|
||||||
const Surface::SurfaceEntry &entry2 = src.entries[i + 1];
|
const Surface::SurfaceEntry &entry2 = src.entries[i + 1];
|
||||||
|
@ -584,8 +585,8 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object,
|
||||||
|
|
||||||
// skip degenerate triangles
|
// skip degenerate triangles
|
||||||
if (object.vertices[entry1.first] == object.vertices[entry2.first] ||
|
if (object.vertices[entry1.first] == object.vertices[entry2.first] ||
|
||||||
object.vertices[entry1.first] == object.vertices[entry3.first] ||
|
object.vertices[entry1.first] == object.vertices[entry3.first] ||
|
||||||
object.vertices[entry2.first] == object.vertices[entry3.first]) {
|
object.vertices[entry2.first] == object.vertices[entry3.first]) {
|
||||||
mesh->mNumFaces--;
|
mesh->mNumFaces--;
|
||||||
mesh->mNumVertices -= 3;
|
mesh->mNumVertices -= 3;
|
||||||
continue;
|
continue;
|
||||||
|
@ -640,7 +641,7 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object,
|
||||||
|
|
||||||
// either a closed or an unclosed line
|
// either a closed or an unclosed line
|
||||||
unsigned int tmp = (unsigned int)(*it).entries.size();
|
unsigned int tmp = (unsigned int)(*it).entries.size();
|
||||||
if (0x2 == type) --tmp;
|
if (Surface::OpenLine == type) --tmp;
|
||||||
for (unsigned int m = 0; m < tmp; ++m) {
|
for (unsigned int m = 0; m < tmp; ++m) {
|
||||||
aiFace &face = *faces++;
|
aiFace &face = *faces++;
|
||||||
|
|
||||||
|
@ -663,7 +664,7 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object,
|
||||||
++uv;
|
++uv;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0x1 == type && tmp - 1 == m) {
|
if (Surface::ClosedLine == type && tmp - 1 == m) {
|
||||||
// if this is a closed line repeat its beginning now
|
// if this is a closed line repeat its beginning now
|
||||||
it2 = (*it).entries.begin();
|
it2 = (*it).entries.begin();
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -69,7 +69,10 @@ public:
|
||||||
// Represents an AC3D material
|
// Represents an AC3D material
|
||||||
struct Material {
|
struct Material {
|
||||||
Material() :
|
Material() :
|
||||||
rgb(0.6f, 0.6f, 0.6f), spec(1.f, 1.f, 1.f), shin(0.f), trans(0.f) {}
|
rgb(0.6f, 0.6f, 0.6f),
|
||||||
|
spec(1.f, 1.f, 1.f),
|
||||||
|
shin(0.f),
|
||||||
|
trans(0.f) {}
|
||||||
|
|
||||||
// base color of the material
|
// base color of the material
|
||||||
aiColor3D rgb;
|
aiColor3D rgb;
|
||||||
|
@ -96,18 +99,43 @@ public:
|
||||||
// Represents an AC3D surface
|
// Represents an AC3D surface
|
||||||
struct Surface {
|
struct Surface {
|
||||||
Surface() :
|
Surface() :
|
||||||
mat(0), flags(0) {}
|
mat(0),
|
||||||
|
flags(0) {}
|
||||||
|
|
||||||
unsigned int mat, flags;
|
unsigned int mat, flags;
|
||||||
|
|
||||||
typedef std::pair<unsigned int, aiVector2D> SurfaceEntry;
|
typedef std::pair<unsigned int, aiVector2D> SurfaceEntry;
|
||||||
std::vector<SurfaceEntry> entries;
|
std::vector<SurfaceEntry> entries;
|
||||||
|
|
||||||
|
// Type is low nibble of flags
|
||||||
|
enum Type : uint8_t {
|
||||||
|
Polygon = 0x0,
|
||||||
|
ClosedLine = 0x1,
|
||||||
|
OpenLine = 0x2,
|
||||||
|
TriangleStrip = 0x4, // ACC extension (TORCS and Speed Dreams)
|
||||||
|
|
||||||
|
Mask = 0xf,
|
||||||
|
};
|
||||||
|
|
||||||
|
inline constexpr uint8_t GetType() const { return (flags & Mask); }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Represents an AC3D object
|
// Represents an AC3D object
|
||||||
struct Object {
|
struct Object {
|
||||||
Object() :
|
Object() :
|
||||||
type(World), name(""), children(), texture(""), texRepeat(1.f, 1.f), texOffset(0.0f, 0.0f), rotation(), translation(), vertices(), surfaces(), numRefs(0), subDiv(0), crease() {}
|
type(World),
|
||||||
|
name(""),
|
||||||
|
children(),
|
||||||
|
texture(""),
|
||||||
|
texRepeat(1.f, 1.f),
|
||||||
|
texOffset(0.0f, 0.0f),
|
||||||
|
rotation(),
|
||||||
|
translation(),
|
||||||
|
vertices(),
|
||||||
|
surfaces(),
|
||||||
|
numRefs(0),
|
||||||
|
subDiv(0),
|
||||||
|
crease() {}
|
||||||
|
|
||||||
// Type description
|
// Type description
|
||||||
enum Type {
|
enum Type {
|
||||||
|
|
Loading…
Reference in New Issue