33from_collision_solids(
NodePath &np,
bool clear) {
35 NodePathCollection result;
42 CollisionNode *cnode = DCAST(CollisionNode, cnp.
node());
44 PT(PandaNode) bnode =
nullptr;
48 if (is_tangible(cnode)) {
49 PT(BulletRigidBodyNode) body;
51 body =
new BulletRigidBodyNode();
52 body->add_shapes_from_collision_solids(cnode);
56 body->set_name(cnode->get_name());
61 PT(BulletGhostNode) ghost;
63 ghost =
new BulletGhostNode();
64 ghost->add_shapes_from_collision_solids(cnode);
67 ghost->set_name(cnode->get_name());
90 for (
size_t j = 0; j < cnode->get_num_solids(); ++j) {
91 CPT(CollisionSolid) solid = cnode->get_solid(j);
92 if (solid->is_tangible()) {
106 PT(InternalName) name = BulletHelper::get_sb_index();
110 PT(GeomVertexArrayFormat) array;
111 PT(GeomVertexFormat) unregistered_format;
112 CPT(GeomVertexFormat) registered_format;
114 array =
new GeomVertexArrayFormat();
115 array->add_column(name, 1, Geom::NT_uint16, Geom::C_index);
117 unregistered_format =
new GeomVertexFormat(*format);
118 unregistered_format->add_array(array);
120 registered_format = GeomVertexFormat::register_format(unregistered_format);
122 return registered_format;
131 PT(InternalName) name = BulletHelper::get_sb_flip();
135 PT(GeomVertexArrayFormat) array;
136 PT(GeomVertexFormat) unregistered_format;
137 CPT(GeomVertexFormat) registered_format;
139 array =
new GeomVertexArrayFormat();
140 array->add_column(name, 1, Geom::NT_uint8, Geom::C_other);
142 unregistered_format =
new GeomVertexFormat(*format);
143 unregistered_format->add_array(array);
145 registered_format = GeomVertexFormat::register_format(unregistered_format);
147 return registered_format;
153PT(
Geom) BulletHelper::
156 return make_geom(node, format, two_sided,
true);
162PT(
Geom) BulletHelper::
165 return make_geom(node, format,
false,
false);
171PT(
Geom) BulletHelper::
174 btTransform trans = btTransform::getIdentity();
175 get_node_transform(trans, node);
177 btSoftBody *body = (btSoftBody *)node->get_object();
180 PT(GeomPrimitive) prim;
181 PT(GeomVertexData) vdata;
183 CPT(GeomVertexFormat) fmt = (format) ? format : GeomVertexFormat::get_v3n3t2();
184 fmt = BulletHelper::add_sb_flip_column(fmt);
186 nassertr(fmt->has_column(InternalName::get_vertex()),
nullptr);
187 nassertr(fmt->has_column(InternalName::get_normal()),
nullptr);
189 btSoftBody::tNodeArray &nodes(body->m_nodes);
192 vdata =
new GeomVertexData(
"", fmt, Geom::UH_stream);
194 GeomVertexWriter vwriter(vdata, InternalName::get_vertex());
195 GeomVertexWriter nwriter(vdata, InternalName::get_normal());
196 GeomVertexWriter fwriter(vdata, BulletHelper::get_sb_flip());
198 for (
int j=0; j<nodes.size(); ++j) {
199 btVector3 v = nodes[j].m_x;
200 btVector3 &n = nodes[j].m_n;
202 v = trans.invXform(v);
204 vwriter.add_data3((PN_stdfloat)v.getX(), (PN_stdfloat)v.getY(), (PN_stdfloat)v.getZ());
205 nwriter.add_data3((PN_stdfloat)n.getX(), (PN_stdfloat)n.getY(), (PN_stdfloat)n.getZ());
206 fwriter.add_data1i(0);
210 for (
int j=0; j<nodes.size(); ++j) {
211 btVector3 v = nodes[j].m_x;
212 btVector3 &n = nodes[j].m_n;
214 v = trans.invXform(v);
216 vwriter.add_data3((PN_stdfloat)v.getX(), (PN_stdfloat)v.getY(), (PN_stdfloat)v.getZ());
217 nwriter.add_data3((PN_stdfloat)n.getX(), (PN_stdfloat)n.getY(), (PN_stdfloat)n.getZ());
218 fwriter.add_data1i(1);
223 btSoftBody::Node *node0 = &nodes[0];
228 btSoftBody::tFaceArray &faces(body->m_faces);
230 prim =
new GeomTriangles(Geom::UH_stream);
231 prim->set_shade_model(Geom::SM_uniform);
233 for (
int j=0; j<faces.size(); ++j) {
234 i0 = int(faces[j].m_n[0] - node0);
235 i1 = int(faces[j].m_n[1] - node0);
236 i2 = int(faces[j].m_n[2] - node0);
238 prim->add_vertices(i0, i1, i2);
239 prim->close_primitive();
242 i0 = nodes.size() + int(faces[j].m_n[0] - node0);
243 i1 = nodes.size() + int(faces[j].m_n[2] - node0);
244 i2 = nodes.size() + int(faces[j].m_n[1] - node0);
246 prim->add_vertices(i0, i1, i2);
247 prim->close_primitive();
252 btSoftBody::tLinkArray &links(body->m_links);
254 prim =
new GeomLines(Geom::UH_stream);
255 prim->set_shade_model(Geom::SM_uniform);
257 for (
int j=0; j<links.size(); ++j) {
258 i0 = int(links[j].m_n[0] - node0);
259 i1 = int(links[j].m_n[1] - node0);
261 prim->add_vertices(i0, i1);
262 prim->close_primitive();
267 geom =
new Geom(vdata);
268 geom->add_primitive(prim);
277make_texcoords_for_patch(
Geom *geom,
int resx,
int resy) {
281 nassertv(vdata->has_column(InternalName::get_texcoord()));
283 GeomVertexRewriter texcoords(vdata, InternalName::get_texcoord());
292 while (!texcoords.is_at_end()) {
298 u = (float)ix/(
float)(resx - 1);
299 v = (float)iy/(
float)(resy - 1);
301 texcoords.set_data2f(u, v);
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
A node in the scene graph that can hold any number of CollisionSolids.
get_into_collide_mask
Returns the current "into" CollideMask.
A container for geometry primitives.
PointerTo< GeomVertexData > modify_vertex_data()
Returns a modifiable pointer to the GeomVertexData, so that application code may directly maniuplate ...
Encodes a string name in a hash table, mapping it to a pointer.
This is a set of zero or more NodePaths.
void add_path(const NodePath &node_path)
Adds a new NodePath to the collection.
get_num_paths
Returns the number of NodePaths in the collection.
get_path
Returns the nth NodePath in the collection.
NodePath is the fundamental system for disambiguating instances, and also provides a higher-level int...
static NodePath any_path(PandaNode *node, Thread *current_thread=Thread::get_current_thread())
Returns a new NodePath that represents any arbitrary path from the root to the indicated node.
void remove_node(Thread *current_thread=Thread::get_current_thread())
Disconnects the referenced node from the scene graph.
NodePathCollection find_all_matches(const std::string &path) const
Returns the complete set of all NodePaths that begin with this NodePath and can be extended by path.
PandaNode * node() const
Returns the referenced node of the path.
const TransformState * get_transform(Thread *current_thread=Thread::get_current_thread()) const
Returns the complete transform object set on this node.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.