Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

panda/src/builder/test_builder.cxx

Go to the documentation of this file.
00001 // Filename: test_builder.cxx
00002 // Created by:  drose (09Sep97)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
00008 //
00009 // All use of this software is subject to the terms of the Panda 3d
00010 // Software license.  You should have received a copy of this license
00011 // along with this source code; you will also find a current copy of
00012 // the license at http://www.panda3d.org/license.txt .
00013 //
00014 // To contact the maintainers of this program write to
00015 // panda3d@yahoogroups.com .
00016 //
00017 ////////////////////////////////////////////////////////////////////
00018 
00019 #include "builder.h"
00020 #include "builderPrim.h"
00021 #include "mesher.h"
00022 
00023 #include <notify.h>
00024 #include <geom.h>
00025 #include <geomNode.h>
00026 #include <namedNode.h>
00027 #include <dftraverser.h>
00028 #include <traverserVisitor.h>
00029 #include <renderRelation.h>
00030 #include <nullTransitionWrapper.h>
00031 #include <nullLevelState.h>
00032 #include <pta_Vertexf.h>
00033 #include <pta_Normalf.h>
00034 #include <pta_Colorf.h>
00035 #include <pta_TexCoordf.h>
00036 
00037 class polygon : public BuilderPrimI {
00038 public:
00039 };
00040 
00041 extern int hedface_vt_len;
00042 extern Vertexf hedface_vt[];
00043 extern polygon polys[];
00044 extern int num_polys;
00045 
00046 
00047 class ReportGeoms :
00048   public TraverserVisitor<NullTransitionWrapper, NullLevelState> {
00049 public:
00050   bool reached_node(Node *node, const NullTransitionWrapper &, NullLevelState &);
00051 };
00052 
00053 bool ReportGeoms::
00054 reached_node(Node *node, const NullTransitionWrapper &, NullLevelState &) {
00055   if (node->is_of_type(GeomNode::get_class_type())) {
00056     GeomNode *geomNode = (GeomNode *)node;
00057     nout << "\n" << *geomNode << ", " << geomNode->get_num_geoms()
00058          << " geoms:\n";
00059     int num_geoms = geomNode->get_num_geoms();
00060     for (int i = 0; i < num_geoms; i++) {
00061       dDrawable *draw = geomNode->get_geom(i);
00062       Geom *geom = DCAST(Geom, draw);
00063       nout << *geom << ":\n";
00064       geom->output_verbose(nout);
00065     }
00066 
00067   } else {
00068     nout << *node << "\n";
00069   }
00070   return true;
00071 }
00072 
00073 int
00074 main(void) {
00075 
00076 #if 1
00077   NamedNode *root = new NamedNode("root");
00078 
00079   Builder builder;
00080 
00081   PTA_Vertexf v_array(hedface_vt_len);
00082   int i;
00083   for (i = 0; i < hedface_vt_len; i++) {
00084     v_array[i] = hedface_vt[i];
00085   }
00086   PTA_Colorf c_array(num_polys);
00087   for (i = 0; i < num_polys; i++) {
00088     c_array[i].set(1.0, 1.0, 1.0, 1.0);
00089   }
00090 
00091   BuilderBucket bucket;
00092   bucket._node = root;
00093   bucket.set_coords(v_array);
00094   bucket.set_colors(c_array);
00095   bucket._mesh = true;
00096 
00097   for (i = 0; i < num_polys; i++) {
00098     polys[i].set_color(i);
00099     //    nout << "Adding polygon " << i << ": " << polys[i] << "\n";
00100     builder.add_prim_nonindexed(bucket, polys[i]);
00101   }
00102 
00103   ReportGeoms rg;
00104 
00105   GeomNode *gn = builder.build();
00106   nout << "Built " << (void *)gn << "\n";
00107   if (gn != NULL) {
00108     NullLevelState level_state;
00109     rg.reached_node(gn, NullTransitionWrapper(), level_state);
00110   }
00111 
00112   nout << "\nTraversing root:\n";
00113   df_traverse(root, rg, NullTransitionWrapper(), NullLevelState(),
00114               RenderRelation::get_class_type());
00115 
00116 #else
00117   Builder builder;
00118   BuilderPrimI prim;
00119 
00120   BuilderBucket bucket;
00121 
00122   ushort p = 0;
00123   int xi, yi;
00124   xi = 4;
00125   yi = xi;
00126 
00127   int x, y;
00128   PTA_Vertexf coords(xi * yi);
00129   PTA_Normalf normals(xi * yi);
00130   PTA_Colorf colors(3);
00131 
00132   double xv, yv, zv;
00133   for (y = 0; y < yi; y++) {
00134     for (x = 0; x < xi; x++) {
00135       xv = (double)x / (double)(xi-1) - 0.5;
00136       yv = (double)y / (double)(yi-1) - 0.5;
00137 
00138       //zv = (y <= x) ? 0.0 : ((float)(y-x)*(y-x) / (float)(yi));
00139       //zv = sqrt(1.0 - (xv*xv + yv*yv));
00140       //zv = sqrt(1.0 - (xv*xv + yv*yv));
00141       //zv = sqrt(max(0.25 - (xv*xv + yv*yv), 0.0));
00142       zv = 0.0;
00143 
00144       p = y*xi + x;
00145       coords[p].set(xv, yv, zv);
00146     }
00147   }
00148 
00149   for (y = 0; y < yi-1; y++) {
00150     for (x = 0; x < xi-1; x++) {
00151       p = y*xi + x;
00152       pfVec3 p1 = coords[p+xi];
00153       pfVec3 p2 = coords[p];
00154       pfVec3 p3 = coords[p+1];
00155       normals[p] = normalize(cross(p1-p2, p2-p3));
00156     }
00157   }
00158 
00159   colors[0].set(1.0, 1.0, 1.0, 1.0);
00160   colors[1].set(1.0, 0.0, 0.0, 1.0);
00161   colors[2].set(0.0, 0.0, 1.0, 1.0);
00162 
00163   bucket.set_coords(coords);
00164   bucket.set_normals(normals);
00165   bucket.set_colors(colors);
00166 
00167   bucket.setAttr(PFSTATE_FRONTMTL, new pfMaterial);
00168   bucket.setMode(PFSTATE_ENLIGHTING, PF_ON);
00169 
00170   bucket._mesh = true;
00171   bucket._max_tfan_angle = 60;
00172   bucket._show_tstrips = true;
00173   bucket._retesselate_coplanar = true;
00174   builder.add_bucket(bucket);
00175 
00176   nout << "Adding polygons.\n";
00177   for (y = 0; y < yi-1; y++) {
00178     for (x = 0; x < xi-1; x++) {
00179       p = y*xi + x;
00180       BuilderVertexI bv0(p), bv1(p+1), bv4(p+xi), bv5(p+xi+1);
00181       if (p==0) {
00182         builder.add_prim(BuilderPrimI(bv0, bv5, bv4).set_color(1));
00183         builder.add_prim(BuilderPrimI(bv1, bv5, bv0).set_color(1));
00184       } else if (p==5) {
00185         builder.add_prim(BuilderPrimI(bv0, bv5, bv4).set_color(1));
00186         builder.add_prim(BuilderPrimI(bv1, bv5, bv0).set_color(1));
00187       } else if (p==1 || p==4) {
00188         builder.add_prim(BuilderPrimI(bv0, bv1, bv4).set_color(1));
00189         builder.add_prim(BuilderPrimI(bv1, bv5, bv4).set_color(1));
00190       } else {
00191         builder.add_prim(BuilderPrimI(bv0, bv5, bv4).set_color(0));
00192         builder.add_prim(BuilderPrimI(bv1, bv5, bv0).set_color(0));
00193       }
00194 
00195     }
00196   }
00197 
00198   nout << "Building.\n";
00199   pfNode *root = builder.build_all_buckets();
00200 
00201   if (root!=NULL) {
00202     report_geosets(root);
00203   }
00204 
00205   pfdStoreFile(root, "builder.pfa");
00206 
00207 #endif
00208 
00209   return 0;
00210 }
00211 

Generated on Fri May 2 00:34:51 2003 for Panda by doxygen1.3