|
@@ -171,67 +171,64 @@ check_quad_geom() {
|
|
|
|
|
|
|
|
// Check that the vertices are arranged in a square.
|
|
// Check that the vertices are arranged in a square.
|
|
|
GeomVertexReader vertex(vdata, InternalName::get_vertex());
|
|
GeomVertexReader vertex(vdata, InternalName::get_vertex());
|
|
|
|
|
+ GeomVertexReader texcoord(vdata, InternalName::get_texcoord());
|
|
|
LVecBase3 v = vertex.get_data3();
|
|
LVecBase3 v = vertex.get_data3();
|
|
|
if (!IS_NEARLY_ZERO(v[1])) {
|
|
if (!IS_NEARLY_ZERO(v[1])) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+ LTexCoord uv(0);
|
|
|
|
|
+ if (texcoord.has_column()) {
|
|
|
|
|
+ uv = texcoord.get_data2();
|
|
|
|
|
+ }
|
|
|
PN_stdfloat minx = v[0];
|
|
PN_stdfloat minx = v[0];
|
|
|
PN_stdfloat maxx = v[0];
|
|
PN_stdfloat maxx = v[0];
|
|
|
PN_stdfloat miny = v[2];
|
|
PN_stdfloat miny = v[2];
|
|
|
PN_stdfloat maxy = v[2];
|
|
PN_stdfloat maxy = v[2];
|
|
|
|
|
+ PN_stdfloat minu = uv[0];
|
|
|
|
|
+ PN_stdfloat maxu = uv[0];
|
|
|
|
|
+ PN_stdfloat minv = uv[1];
|
|
|
|
|
+ PN_stdfloat maxv = uv[1];
|
|
|
|
|
|
|
|
- for (int i = 0; i < 3; ++i) {
|
|
|
|
|
|
|
+ for (int i = 1; i < 4; ++i) {
|
|
|
v = vertex.get_data3();
|
|
v = vertex.get_data3();
|
|
|
if (!IS_NEARLY_ZERO(v[1])) {
|
|
if (!IS_NEARLY_ZERO(v[1])) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (texcoord.has_column()) {
|
|
|
|
|
+ uv = texcoord.get_data2();
|
|
|
|
|
+ }
|
|
|
if (!IS_NEARLY_EQUAL(v[0], minx) && !IS_NEARLY_EQUAL(v[0], maxx)) {
|
|
if (!IS_NEARLY_EQUAL(v[0], minx) && !IS_NEARLY_EQUAL(v[0], maxx)) {
|
|
|
if (!IS_NEARLY_EQUAL(minx, maxx)) {
|
|
if (!IS_NEARLY_EQUAL(minx, maxx)) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
- minx = min(v[0], minx);
|
|
|
|
|
- maxx = max(v[0], maxx);
|
|
|
|
|
|
|
+ if (v[0] < minx) {
|
|
|
|
|
+ minx = v[0];
|
|
|
|
|
+ minu = uv[0];
|
|
|
|
|
+ }
|
|
|
|
|
+ if (v[0] > maxx) {
|
|
|
|
|
+ maxx = v[0];
|
|
|
|
|
+ maxu = uv[0];
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
if (!IS_NEARLY_EQUAL(v[2], miny) && !IS_NEARLY_EQUAL(v[2], maxy)) {
|
|
if (!IS_NEARLY_EQUAL(v[2], miny) && !IS_NEARLY_EQUAL(v[2], maxy)) {
|
|
|
if (!IS_NEARLY_EQUAL(miny, maxy)) {
|
|
if (!IS_NEARLY_EQUAL(miny, maxy)) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
- miny = min(v[2], miny);
|
|
|
|
|
- maxy = max(v[2], maxy);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- PN_stdfloat minu = 0;
|
|
|
|
|
- PN_stdfloat maxu = 0;
|
|
|
|
|
- PN_stdfloat minv = 0;
|
|
|
|
|
- PN_stdfloat maxv = 0;
|
|
|
|
|
-
|
|
|
|
|
- // Same for the texcoord data.
|
|
|
|
|
- if (format->has_column(InternalName::get_texcoord())) {
|
|
|
|
|
- GeomVertexReader texcoord(vdata, InternalName::get_texcoord());
|
|
|
|
|
- LVecBase2 tc = texcoord.get_data2();
|
|
|
|
|
- minu = tc[0];
|
|
|
|
|
- maxu = tc[0];
|
|
|
|
|
- minv = tc[1];
|
|
|
|
|
- maxv = tc[1];
|
|
|
|
|
-
|
|
|
|
|
- for (int i = 0; i < 3; ++i) {
|
|
|
|
|
- tc = texcoord.get_data2();
|
|
|
|
|
- if (!IS_NEARLY_EQUAL(tc[0], minu) && !IS_NEARLY_EQUAL(tc[0], maxu)) {
|
|
|
|
|
- if (!IS_NEARLY_EQUAL(minu, maxu)) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- minu = min(tc[0], minu);
|
|
|
|
|
- maxu = max(tc[0], maxu);
|
|
|
|
|
|
|
+ if (v[2] < miny) {
|
|
|
|
|
+ miny = v[2];
|
|
|
|
|
+ minv = uv[1];
|
|
|
}
|
|
}
|
|
|
- if (!IS_NEARLY_EQUAL(tc[1], minv) && !IS_NEARLY_EQUAL(tc[1], maxv)) {
|
|
|
|
|
- if (!IS_NEARLY_EQUAL(minv, maxv)) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- minv = min(tc[1], minv);
|
|
|
|
|
- maxv = max(tc[1], maxv);
|
|
|
|
|
|
|
+ if (v[2] > maxy) {
|
|
|
|
|
+ maxy = v[2];
|
|
|
|
|
+ maxv = uv[1];
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ if (!IS_NEARLY_EQUAL(uv[0], minu) && !IS_NEARLY_EQUAL(uv[0], maxu)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!IS_NEARLY_EQUAL(uv[1], minv) && !IS_NEARLY_EQUAL(uv[1], maxv)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
_quad_dimensions.set(minx, miny, maxx, maxy);
|
|
_quad_dimensions.set(minx, miny, maxx, maxy);
|