Beispiel #1
0
 /** Should only be called from updateGeometricState(). In most cases should not be subclassed. */
 protected void updateWorldTransforms() {
   if (parent == null) {
     worldTransform.set(localTransform);
     refreshFlags &= ~RF_TRANSFORM;
   } else {
     // check if transform for parent is updated
     assert ((parent.refreshFlags & RF_TRANSFORM) == 0);
     worldTransform.set(localTransform);
     worldTransform.combineWithParent(parent.worldTransform);
     refreshFlags &= ~RF_TRANSFORM;
   }
 }
Beispiel #2
0
  /** Computes the world transform of this Spatial in the most efficient manner possible. */
  void checkDoTransformUpdate() {
    if ((refreshFlags & RF_TRANSFORM) == 0) {
      return;
    }

    if (parent == null) {
      worldTransform.set(localTransform);
      refreshFlags &= ~RF_TRANSFORM;
    } else {
      TempVars vars = TempVars.get();

      Spatial[] stack = vars.spatialStack;
      Spatial rootNode = this;
      int i = 0;
      while (true) {
        Spatial hisParent = rootNode.parent;
        if (hisParent == null) {
          rootNode.worldTransform.set(rootNode.localTransform);
          rootNode.refreshFlags &= ~RF_TRANSFORM;
          i--;
          break;
        }

        stack[i] = rootNode;

        if ((hisParent.refreshFlags & RF_TRANSFORM) == 0) {
          break;
        }

        rootNode = hisParent;
        i++;
      }

      vars.release();

      for (int j = i; j >= 0; j--) {
        rootNode = stack[j];
        // rootNode.worldTransform.set(rootNode.localTransform);
        // rootNode.worldTransform.combineWithParent(rootNode.parent.worldTransform);
        // rootNode.refreshFlags &= ~RF_TRANSFORM;
        rootNode.updateWorldTransforms();
      }
    }
  }