|
@@ -10,6 +10,7 @@
|
|
|
#include <eggVertex.h>
|
|
#include <eggVertex.h>
|
|
|
#include <eggTexture.h>
|
|
#include <eggTexture.h>
|
|
|
#include <eggPolygon.h>
|
|
#include <eggPolygon.h>
|
|
|
|
|
+#include <pnmImageHeader.h>
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
#include <algorithm>
|
|
|
|
|
|
|
@@ -39,9 +40,22 @@ EggTextureCards() : EggWriter(true, true) {
|
|
|
("g", "left,right,bottom,top", 0,
|
|
("g", "left,right,bottom,top", 0,
|
|
|
"Specifies the geometry of each polygon. The default is a unit polygon "
|
|
"Specifies the geometry of each polygon. The default is a unit polygon "
|
|
|
"centered on the origin: -0.5,0.5,-0.5,0.5. Polygons are always created "
|
|
"centered on the origin: -0.5,0.5,-0.5,0.5. Polygons are always created "
|
|
|
- "on the X-Y plane.",
|
|
|
|
|
|
|
+ "on the X-Y plane. If -p is not also specified, all polygons will be "
|
|
|
|
|
+ "the same size and shape.",
|
|
|
&EggTextureCards::dispatch_double_quad, NULL, &_polygon_geometry[0]);
|
|
&EggTextureCards::dispatch_double_quad, NULL, &_polygon_geometry[0]);
|
|
|
|
|
|
|
|
|
|
+ add_option
|
|
|
|
|
+ ("p", "xpixels,ypixels", 0,
|
|
|
|
|
+ "Indicates that polygons should be sized in proportion to the pixel "
|
|
|
|
|
+ "size of the texture image. This will potentially create a "
|
|
|
|
|
+ "different size and shape polygon for each texture. The coordinate "
|
|
|
|
|
+ "pair represents the image size in "
|
|
|
|
|
+ "pixels that will exactly fill up the polygon described with -g (or the "
|
|
|
|
|
+ "default polygon if -g is not specified); smaller images will be "
|
|
|
|
|
+ "given proportionately smaller polygons, and larger images will be "
|
|
|
|
|
+ "given proportionately larger polygons.",
|
|
|
|
|
+ &EggTextureCards::dispatch_double_pair, &_got_pixel_scale, &_pixel_scale[0]);
|
|
|
|
|
+
|
|
|
add_option
|
|
add_option
|
|
|
("c", "r,g,b[,a]", 0,
|
|
("c", "r,g,b[,a]", 0,
|
|
|
"Specifies the color of each polygon. The default is white: 1,1,1,1.",
|
|
"Specifies the color of each polygon. The default is white: 1,1,1,1.",
|
|
@@ -112,6 +126,67 @@ dispatch_wrap_mode(const string &opt, const string &arg, void *var) {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
|
|
+// Function: EggTextureCards::scan_texture
|
|
|
|
|
+// Access: Private
|
|
|
|
|
+// Description: Reads the texture image header to determine its size,
|
|
|
|
|
+// and based on this size, computes the appropriate
|
|
|
|
|
+// left,right,bottom,top geometry of the card that
|
|
|
|
|
+// correspond to this texture.
|
|
|
|
|
+//
|
|
|
|
|
+// Returns true if successful, or false if the texture
|
|
|
|
|
+// cannot be read.
|
|
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
|
|
+bool EggTextureCards::
|
|
|
|
|
+scan_texture(const Filename &filename, LVecBase4d &geometry) {
|
|
|
|
|
+ PNMImageHeader header;
|
|
|
|
|
+ if (!header.read_header(filename)) {
|
|
|
|
|
+ nout << "Unable to read image " << filename << "\n";
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ double xscale = header.get_x_size() / _pixel_scale[0];
|
|
|
|
|
+ double yscale = header.get_y_size() / _pixel_scale[1];
|
|
|
|
|
+
|
|
|
|
|
+ geometry.set(_polygon_geometry[0] * xscale,
|
|
|
|
|
+ _polygon_geometry[1] * xscale,
|
|
|
|
|
+ _polygon_geometry[2] * yscale,
|
|
|
|
|
+ _polygon_geometry[3] * yscale);
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
|
|
+// Function: EggTextureCards::make_vertices
|
|
|
|
|
+// Access: Private
|
|
|
|
|
+// Description: Creates a set of four vertices for the polygon
|
|
|
|
|
+// according to the left,right,bottom,top geometry.
|
|
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
|
|
+void EggTextureCards::
|
|
|
|
|
+make_vertices(const LPoint4d &geometry, EggVertexPool *vpool,
|
|
|
|
|
+ EggVertex *&v1, EggVertex *&v2, EggVertex *&v3, EggVertex *&v4) {
|
|
|
|
|
+ //
|
|
|
|
|
+ // 1 4
|
|
|
|
|
+ //
|
|
|
|
|
+ //
|
|
|
|
|
+ // 2 3
|
|
|
|
|
+ //
|
|
|
|
|
+
|
|
|
|
|
+ v1 = vpool->make_new_vertex
|
|
|
|
|
+ (LPoint3d(geometry[0], geometry[3], 0.0));
|
|
|
|
|
+ v2 = vpool->make_new_vertex
|
|
|
|
|
+ (LPoint3d(geometry[0], geometry[2], 0.0));
|
|
|
|
|
+ v3 = vpool->make_new_vertex
|
|
|
|
|
+ (LPoint3d(geometry[1], geometry[2], 0.0));
|
|
|
|
|
+ v4 = vpool->make_new_vertex
|
|
|
|
|
+ (LPoint3d(geometry[1], geometry[3], 0.0));
|
|
|
|
|
+
|
|
|
|
|
+ v1->set_uv(TexCoordd(0.0, 1.0));
|
|
|
|
|
+ v2->set_uv(TexCoordd(0.0, 0.0));
|
|
|
|
|
+ v3->set_uv(TexCoordd(1.0, 0.0));
|
|
|
|
|
+ v4->set_uv(TexCoordd(1.0, 1.0));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
// Function: EggTextureCards::run
|
|
// Function: EggTextureCards::run
|
|
|
// Access: Public
|
|
// Access: Public
|
|
@@ -133,53 +208,52 @@ run() {
|
|
|
EggVertexPool *vpool = new EggVertexPool("vpool");
|
|
EggVertexPool *vpool = new EggVertexPool("vpool");
|
|
|
group->add_child(vpool);
|
|
group->add_child(vpool);
|
|
|
|
|
|
|
|
- //
|
|
|
|
|
- // 1 4
|
|
|
|
|
- //
|
|
|
|
|
- //
|
|
|
|
|
- // 2 3
|
|
|
|
|
- //
|
|
|
|
|
-
|
|
|
|
|
- EggVertex *v1 = vpool->make_new_vertex
|
|
|
|
|
- (LPoint3d(_polygon_geometry[0], _polygon_geometry[3], 0.0));
|
|
|
|
|
- EggVertex *v2 = vpool->make_new_vertex
|
|
|
|
|
- (LPoint3d(_polygon_geometry[0], _polygon_geometry[2], 0.0));
|
|
|
|
|
- EggVertex *v3 = vpool->make_new_vertex
|
|
|
|
|
- (LPoint3d(_polygon_geometry[1], _polygon_geometry[2], 0.0));
|
|
|
|
|
- EggVertex *v4 = vpool->make_new_vertex
|
|
|
|
|
- (LPoint3d(_polygon_geometry[1], _polygon_geometry[3], 0.0));
|
|
|
|
|
|
|
+ EggVertex *v1, *v2, *v3, *v4;
|
|
|
|
|
|
|
|
- v1->set_uv(TexCoordd(0.0, 1.0));
|
|
|
|
|
- v2->set_uv(TexCoordd(0.0, 0.0));
|
|
|
|
|
- v3->set_uv(TexCoordd(1.0, 0.0));
|
|
|
|
|
- v4->set_uv(TexCoordd(1.0, 1.0));
|
|
|
|
|
|
|
+ if (!_got_pixel_scale) {
|
|
|
|
|
+ // If we don't have a per-texture pixel scale, all the polygons
|
|
|
|
|
+ // will be the same size, and hence may all share the same four
|
|
|
|
|
+ // vertices.
|
|
|
|
|
+ make_vertices(_polygon_geometry, vpool, v1, v2, v3, v4);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// Now, create a texture reference and a polygon for each texture.
|
|
// Now, create a texture reference and a polygon for each texture.
|
|
|
- // We don't really care whether the texture files actually exist at
|
|
|
|
|
- // this point yet.
|
|
|
|
|
|
|
|
|
|
vector_string::const_iterator ti;
|
|
vector_string::const_iterator ti;
|
|
|
for (ti = _texture_names.begin(); ti != _texture_names.end(); ++ti) {
|
|
for (ti = _texture_names.begin(); ti != _texture_names.end(); ++ti) {
|
|
|
Filename filename = (*ti);
|
|
Filename filename = (*ti);
|
|
|
string name = filename.get_basename_wo_extension();
|
|
string name = filename.get_basename_wo_extension();
|
|
|
|
|
|
|
|
- EggTexture *tref = new EggTexture(name, filename);
|
|
|
|
|
- tref->set_wrap_mode(_wrap_mode);
|
|
|
|
|
- group->add_child(tref);
|
|
|
|
|
-
|
|
|
|
|
- // Each polygon gets placed in its own sub-group. This will make
|
|
|
|
|
- // pulling them out by name at runtime possible.
|
|
|
|
|
- EggGroup *sub_group = new EggGroup(name);
|
|
|
|
|
- group->add_child(sub_group);
|
|
|
|
|
- EggPolygon *poly = new EggPolygon();
|
|
|
|
|
- sub_group->add_child(poly);
|
|
|
|
|
- poly->set_texture(tref);
|
|
|
|
|
- poly->set_color(_polygon_color);
|
|
|
|
|
-
|
|
|
|
|
- poly->add_vertex(v1);
|
|
|
|
|
- poly->add_vertex(v2);
|
|
|
|
|
- poly->add_vertex(v3);
|
|
|
|
|
- poly->add_vertex(v4);
|
|
|
|
|
|
|
+ bool texture_ok = true;
|
|
|
|
|
+ if (_got_pixel_scale) {
|
|
|
|
|
+ // If we have a per-texture pixel scale, we have to read in the
|
|
|
|
|
+ // texture header and determine its size.
|
|
|
|
|
+ LVecBase4d geometry;
|
|
|
|
|
+ texture_ok = scan_texture(filename, geometry);
|
|
|
|
|
+ if (texture_ok) {
|
|
|
|
|
+ make_vertices(geometry, vpool, v1, v2, v3, v4);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (texture_ok) {
|
|
|
|
|
+ EggTexture *tref = new EggTexture(name, filename);
|
|
|
|
|
+ tref->set_wrap_mode(_wrap_mode);
|
|
|
|
|
+ group->add_child(tref);
|
|
|
|
|
+
|
|
|
|
|
+ // Each polygon gets placed in its own sub-group. This will make
|
|
|
|
|
+ // pulling them out by name at runtime possible.
|
|
|
|
|
+ EggGroup *sub_group = new EggGroup(name);
|
|
|
|
|
+ group->add_child(sub_group);
|
|
|
|
|
+ EggPolygon *poly = new EggPolygon();
|
|
|
|
|
+ sub_group->add_child(poly);
|
|
|
|
|
+ poly->set_texture(tref);
|
|
|
|
|
+ poly->set_color(_polygon_color);
|
|
|
|
|
+
|
|
|
|
|
+ poly->add_vertex(v1);
|
|
|
|
|
+ poly->add_vertex(v2);
|
|
|
|
|
+ poly->add_vertex(v3);
|
|
|
|
|
+ poly->add_vertex(v4);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Done!
|
|
// Done!
|