00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
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
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
00139
00140
00141
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