node.java
来自「java 3d game jme 工程开发源代码」· Java 代码 · 共 712 行 · 第 1/2 页
JAVA
712 行
*/
public boolean hasChild(Spatial spat) {
if(children == null) {
return false;
}
if (children.contains(spat))
return true;
for (int i = 0, max = getQuantity(); i < max; i++) {
Spatial child = children.get(i);
if (child instanceof Node && ((Node) child).hasChild(spat))
return true;
}
return false;
}
/**
* <code>updateWorldData</code> updates all the children maintained by
* this node.
*
* @param time
* the frame time.
*/
@Override
public void updateWorldData(float time) {
super.updateWorldData(time);
Spatial child;
for (int i = 0, n = getQuantity(); i < n; i++) {
try {
child = children.get(i);
} catch (IndexOutOfBoundsException e) {
// a child was removed in updateGeometricState (note: this may
// skip one child)
break;
}
if (child != null) {
child.updateGeometricState(time, false);
}
}
}
@Override
public void updateWorldVectors(boolean recurse) {
if (((lockedMode & Spatial.LOCKED_TRANSFORMS) == 0)) {
updateWorldScale();
updateWorldRotation();
updateWorldTranslation();
if (recurse) {
for (int i = 0, n = getQuantity(); i < n; i++) {
children.get(i).updateWorldVectors(true);
}
}
}
}
@Override
public void lockBounds() {
super.lockBounds();
for (int i = 0, max = getQuantity(); i < max; i++) {
Spatial child = children.get(i);
if (child != null) {
child.lockBounds();
}
}
}
@Override
public void lockShadows() {
super.lockShadows();
for (int i = 0, max = getQuantity(); i < max; i++) {
Spatial child = children.get(i);
if (child != null) {
child.lockShadows();
}
}
}
@Override
public void lockTransforms() {
super.lockTransforms();
for (int i = 0, max = getQuantity(); i < max; i++) {
Spatial child = children.get(i);
if (child != null) {
child.lockTransforms();
}
}
}
@Override
public void lockMeshes(Renderer r) {
super.lockMeshes(r);
for (int i = 0, max = getQuantity(); i < max; i++) {
Spatial child = children.get(i);
if (child != null) {
child.lockMeshes(r);
}
}
}
@Override
public void unlockBounds() {
super.unlockBounds();
for (int i = 0, max = getQuantity(); i < max; i++) {
Spatial child = children.get(i);
if (child != null) {
child.unlockBounds();
}
}
}
@Override
public void unlockShadows() {
super.unlockShadows();
for (int i = 0, max = getQuantity(); i < max; i++) {
Spatial child = children.get(i);
if (child != null) {
child.unlockShadows();
}
}
}
@Override
public void unlockTransforms() {
super.unlockTransforms();
for (int i = 0, max = getQuantity(); i < max; i++) {
Spatial child = children.get(i);
if (child != null) {
child.unlockTransforms();
}
}
}
@Override
public void unlockMeshes(Renderer r) {
super.unlockMeshes(r);
for (int i = 0, max = getQuantity(); i < max; i++) {
Spatial child = children.get(i);
if (child != null) {
child.unlockMeshes(r);
}
}
}
/**
* <code>draw</code> calls the onDraw method for each child maintained by
* this node.
*
* @see com.jme.scene.Spatial#draw(com.jme.renderer.Renderer)
* @param r
* the renderer to draw to.
*/
@Override
public void draw(Renderer r) {
if(children == null) {
return;
}
Spatial child;
for (int i = 0, cSize = children.size(); i < cSize; i++) {
child = children.get(i);
if (child != null)
child.onDraw(r);
}
}
/**
* Applies the stack of render states to each child by calling
* updateRenderState(states) on each child.
*
* @param states
* The Stack[] of render states to apply to each child.
*/
@Override
protected void applyRenderState(Stack<? extends RenderState>[] states) {
if(children == null) {
return;
}
for (int i = 0, cSize = children.size(); i < cSize; i++) {
Spatial pkChild = getChild(i);
if (pkChild != null)
pkChild.updateRenderState(states);
}
}
@Override
public void sortLights() {
if(children == null) {
return;
}
for (int i = 0, cSize = children.size(); i < cSize; i++) {
Spatial pkChild = getChild(i);
if (pkChild != null)
pkChild.sortLights();
}
}
/**
* <code>updateWorldBound</code> merges the bounds of all the children
* maintained by this node. This will allow for faster culling operations.
*
* @see com.jme.scene.Spatial#updateWorldBound()
*/
@Override
public void updateWorldBound() {
if ((lockedMode & Spatial.LOCKED_BOUNDS) != 0) return;
if (children == null) {
return;
}
BoundingVolume worldBound = null;
for (int i = 0, cSize = children.size(); i < cSize; i++) {
Spatial child = children.get(i);
if (child != null) {
if (worldBound != null) {
// merge current world bound with child world bound
worldBound.mergeLocal(child.getWorldBound());
} else {
// set world bound to first non-null child world bound
if (child.getWorldBound() != null) {
worldBound = child.getWorldBound().clone(this.worldBound);
}
}
}
}
this.worldBound = worldBound;
}
@Override
public void findCollisions(Spatial scene, CollisionResults results) {
if (getWorldBound() != null && isCollidable && scene.isCollidable()) {
if (getWorldBound().intersects(scene.getWorldBound())) {
// further checking needed.
for (int i = 0; i < getQuantity(); i++) {
getChild(i).findCollisions(scene, results);
}
}
}
}
@Override
public boolean hasCollision(Spatial scene, boolean checkTriangles) {
if (getWorldBound() != null && isCollidable && scene.isCollidable()) {
if (getWorldBound().intersects(scene.getWorldBound())) {
if(children == null && !checkTriangles) {
return true;
}
// further checking needed.
for (int i = 0; i < getQuantity(); i++) {
if (getChild(i).hasCollision(scene, checkTriangles)) {
return true;
}
}
}
}
return false;
}
@Override
public void findPick(Ray toTest, PickResults results) {
if(children == null) {
return;
}
if (getWorldBound() != null && isCollidable) {
if (getWorldBound().intersects(toTest)) {
// further checking needed.
for (int i = 0; i < getQuantity(); i++) {
( children.get(i)).findPick(toTest, results);
}
}
}
}
/**
* Returns all children to this node.
*
* @return a list containing all children to this node
*/
public List<Spatial> getChildren() {
return children;
}
/**
* Used with Serialization. Do not call this directly.
*
* @param s
* @throws IOException
* @throws ClassNotFoundException
* @see java.io.Serializable
*/
private void readObject(java.io.ObjectInputStream s) throws IOException,
ClassNotFoundException {
s.defaultReadObject();
if (children != null) {
// go through children and set parent to this node
for (int x = 0, cSize = children.size(); x < cSize; x++) {
Spatial child = children.get(x);
child.parent = this;
}
}
}
public void childChange(Geometry geometry, int index1, int index2) {
//just pass to parent
if(parent != null) {
parent.childChange(geometry, index1, index2);
}
}
public void write(JMEExporter e) throws IOException {
super.write(e);
if (children == null)
e.getCapsule(this).writeSavableArrayList(null, "children", null);
else
e.getCapsule(this).writeSavableArrayList(new ArrayList<Spatial>(children), "children", null);
}
@SuppressWarnings("unchecked")
public void read(JMEImporter e) throws IOException {
super.read(e);
ArrayList<Spatial> cList = e.getCapsule(this).readSavableArrayList("children", null);
if (cList == null)
children = null;
else
children = Collections.synchronizedList(cList);
// go through children and set parent to this node
if (children != null) {
for (int x = 0, cSize = children.size(); x < cSize; x++) {
Spatial child = children.get(x);
child.parent = this;
}
}
}
@Override
public void setModelBound(BoundingVolume modelBound) {
if(children != null) {
for(int i = 0, max = children.size(); i < max; i++) {
children.get(i).setModelBound(modelBound != null ? modelBound.clone(null) : null);
}
}
}
@Override
public void updateModelBound() {
if(children != null) {
for(int i = 0, max = children.size(); i < max; i++) {
children.get(i).updateModelBound();
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?