open_toontown_panda3d/panda/src/builder/test_builder.cxx

212 lines
5.3 KiB
C++

// Filename: test_builder.cxx
// Created by: drose (09Sep97)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
//
// All use of this software is subject to the terms of the Panda 3d
// Software license. You should have received a copy of this license
// along with this source code; you will also find a current copy of
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
//
// To contact the maintainers of this program write to
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
#include "builder.h"
#include "builderPrim.h"
#include "mesher.h"
#include "notify.h"
#include "geom.h"
#include "geomNode.h"
#include "namedNode.h"
#include "dftraverser.h"
#include "traverserVisitor.h"
#include "renderRelation.h"
#include "nullTransitionWrapper.h"
#include "nullLevelState.h"
#include "pta_Vertexf.h"
#include "pta_Normalf.h"
#include "pta_Colorf.h"
#include "pta_TexCoordf.h"
class polygon : public BuilderPrimI {
public:
};
extern int hedface_vt_len;
extern Vertexf hedface_vt[];
extern polygon polys[];
extern int num_polys;
class ReportGeoms :
public TraverserVisitor<NullTransitionWrapper, NullLevelState> {
public:
bool reached_node(Node *node, const NullTransitionWrapper &, NullLevelState &);
};
bool ReportGeoms::
reached_node(Node *node, const NullTransitionWrapper &, NullLevelState &) {
if (node->is_of_type(GeomNode::get_class_type())) {
GeomNode *geomNode = (GeomNode *)node;
nout << "\n" << *geomNode << ", " << geomNode->get_num_geoms()
<< " geoms:\n";
int num_geoms = geomNode->get_num_geoms();
for (int i = 0; i < num_geoms; i++) {
dDrawable *draw = geomNode->get_geom(i);
Geom *geom = DCAST(Geom, draw);
nout << *geom << ":\n";
geom->output_verbose(nout);
}
} else {
nout << *node << "\n";
}
return true;
}
int
main(void) {
#if 1
NamedNode *root = new NamedNode("root");
Builder builder;
PTA_Vertexf v_array(hedface_vt_len);
int i;
for (i = 0; i < hedface_vt_len; i++) {
v_array[i] = hedface_vt[i];
}
PTA_Colorf c_array(num_polys);
for (i = 0; i < num_polys; i++) {
c_array[i].set(1.0, 1.0, 1.0, 1.0);
}
BuilderBucket bucket;
bucket._node = root;
bucket.set_coords(v_array);
bucket.set_colors(c_array);
bucket._mesh = true;
for (i = 0; i < num_polys; i++) {
polys[i].set_color(i);
// nout << "Adding polygon " << i << ": " << polys[i] << "\n";
builder.add_prim_nonindexed(bucket, polys[i]);
}
ReportGeoms rg;
GeomNode *gn = builder.build();
nout << "Built " << (void *)gn << "\n";
if (gn != NULL) {
NullLevelState level_state;
rg.reached_node(gn, NullTransitionWrapper(), level_state);
}
nout << "\nTraversing root:\n";
df_traverse(root, rg, NullTransitionWrapper(), NullLevelState(),
RenderRelation::get_class_type());
#else
Builder builder;
BuilderPrimI prim;
BuilderBucket bucket;
ushort p = 0;
int xi, yi;
xi = 4;
yi = xi;
int x, y;
PTA_Vertexf coords(xi * yi);
PTA_Normalf normals(xi * yi);
PTA_Colorf colors(3);
double xv, yv, zv;
for (y = 0; y < yi; y++) {
for (x = 0; x < xi; x++) {
xv = (double)x / (double)(xi-1) - 0.5;
yv = (double)y / (double)(yi-1) - 0.5;
//zv = (y <= x) ? 0.0 : ((float)(y-x)*(y-x) / (float)(yi));
//zv = sqrt(1.0 - (xv*xv + yv*yv));
//zv = sqrt(1.0 - (xv*xv + yv*yv));
//zv = sqrt(max(0.25 - (xv*xv + yv*yv), 0.0));
zv = 0.0;
p = y*xi + x;
coords[p].set(xv, yv, zv);
}
}
for (y = 0; y < yi-1; y++) {
for (x = 0; x < xi-1; x++) {
p = y*xi + x;
pfVec3 p1 = coords[p+xi];
pfVec3 p2 = coords[p];
pfVec3 p3 = coords[p+1];
normals[p] = normalize(cross(p1-p2, p2-p3));
}
}
colors[0].set(1.0, 1.0, 1.0, 1.0);
colors[1].set(1.0, 0.0, 0.0, 1.0);
colors[2].set(0.0, 0.0, 1.0, 1.0);
bucket.set_coords(coords);
bucket.set_normals(normals);
bucket.set_colors(colors);
bucket.setAttr(PFSTATE_FRONTMTL, new pfMaterial);
bucket.setMode(PFSTATE_ENLIGHTING, PF_ON);
bucket._mesh = true;
bucket._max_tfan_angle = 60;
bucket._show_tstrips = true;
bucket._retesselate_coplanar = true;
builder.add_bucket(bucket);
nout << "Adding polygons.\n";
for (y = 0; y < yi-1; y++) {
for (x = 0; x < xi-1; x++) {
p = y*xi + x;
BuilderVertexI bv0(p), bv1(p+1), bv4(p+xi), bv5(p+xi+1);
if (p==0) {
builder.add_prim(BuilderPrimI(bv0, bv5, bv4).set_color(1));
builder.add_prim(BuilderPrimI(bv1, bv5, bv0).set_color(1));
} else if (p==5) {
builder.add_prim(BuilderPrimI(bv0, bv5, bv4).set_color(1));
builder.add_prim(BuilderPrimI(bv1, bv5, bv0).set_color(1));
} else if (p==1 || p==4) {
builder.add_prim(BuilderPrimI(bv0, bv1, bv4).set_color(1));
builder.add_prim(BuilderPrimI(bv1, bv5, bv4).set_color(1));
} else {
builder.add_prim(BuilderPrimI(bv0, bv5, bv4).set_color(0));
builder.add_prim(BuilderPrimI(bv1, bv5, bv0).set_color(0));
}
}
}
nout << "Building.\n";
pfNode *root = builder.build_all_buckets();
if (root!=NULL) {
report_geosets(root);
}
pfdStoreFile(root, "builder.pfa");
#endif
return 0;
}