Android Open Source - Schooner-3D Boned Object






From Project

Back to project page Schooner-3D.

License

The source code is released under:

Apache License

If you think the Android project Schooner-3D listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright 2012 Dan Mercer/*from   www  .ja  va2  s  . c o  m*/
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.supermercerbros.gameengine.objects;

import android.util.Log;

import com.supermercerbros.gameengine.armature.Action;
import com.supermercerbros.gameengine.armature.ActionData;
import com.supermercerbros.gameengine.armature.BinarySkeletalVertexModifier;
import com.supermercerbros.gameengine.armature.SkeletalVertexModifier;
import com.supermercerbros.gameengine.armature.Skeleton;
import com.supermercerbros.gameengine.engine.shaders.Material;
import com.supermercerbros.gameengine.parsers.PreObjectData;

public class BonedObject extends GameObject {
  public static final int BONES_PER_VERTEX = 4;
  
  public final float[] boneWeights;
  public final byte[] boneIndices;
  private final Skeleton skeleton;
  
  private Action currentAction;
  private final ActionData actionData;
  private final int boneCount;
  
  public BonedObject(PreObjectData data, Material material, Skeleton skeleton) {
    super(data, material);
    this.skeleton = skeleton;
    
    final int vertCount = info.count;
    boneCount = skeleton.boneCount();
    actionData = new ActionData(boneCount);
    
    // Localize arrays
    final byte[][] localIndices = data.boneIndices;
    final float[][] localWeights = data.boneWeights;
    
    // Get largest number of bone weights per vertex
    int vertexWeightCount = 0;
    for (int i = 0; i < vertCount; i++) {
      int weightCount = localWeights[i].length;
      if (weightCount > vertexWeightCount) {
        vertexWeightCount = weightCount;
      }
    }
    
    Log.d(TAG, "vertexWeightCount = " + vertexWeightCount);
    if (vertexWeightCount == 1) { // Single, binary weights
      
      // Init boneIndices and boneWeights
      this.boneIndices = new byte[vertCount];
      this.boneWeights = null;
      
      // Fill boneIndices (boneWeights is unused)
      for (int i = 0; i < vertCount; i++) {
        this.boneIndices[i] = localIndices[i][0];
      }
      
      // Init VertexModifier and ActionData
            material.setVertexModifier(new BinarySkeletalVertexModifier(boneCount));
      
    } else { // Multiple weights.
      if (vertexWeightCount > BONES_PER_VERTEX) {
        Log.e(TAG, "At least one vertex has more than " + BONES_PER_VERTEX
            + " bones parented to it. Only " + BONES_PER_VERTEX
            + " are supported.");
        vertexWeightCount = BONES_PER_VERTEX;
      }
      
      // Init boneIndices and boneWeights
      this.boneIndices = new byte[BONES_PER_VERTEX * vertCount];
      this.boneWeights = new float[BONES_PER_VERTEX * vertCount];
      
      // Fill boneIndices and boneWeights
      for (int vert = 0; vert < vertCount; vert++) {
        final byte[] vertIndices = localIndices[vert];
        final float[] vertWeights = localWeights[vert];
        final int boneCount = vertIndices.length;
        final int vertOffset = vert * 4;
        
        for (int j = 0; j < vertexWeightCount && j < boneCount; j++) {
          int offset = vertOffset + j;
          boneIndices[offset] = vertIndices[j];
          boneWeights[offset] = vertWeights[j];
        }
      }
      
      // Init VertexModifier and ActionData
      material.setVertexModifier(new SkeletalVertexModifier(BONES_PER_VERTEX,
          boneCount));
    }
  }
  
  /**
   * Sets the Action of this BonedObject to the given Action
   * 
   * @param action
   *            The Action to start.
   * @param duration
   *            The duration of the Action, in milliseconds.
   */
  public void setAction(Action action, long duration) {
    if (action != null) {
      final long time = System.currentTimeMillis();
      currentAction = action;
      actionData.writeState(time, time, duration, skeleton);
      // TODO: time, time? (add delay support to this method and to
      // movements)
      super.startMovement(action.movement, time, duration);
    } else {
      throw new IllegalArgumentException("action == null");
    }
  }
  
  @Override
  public void drawVerts(long time) {
    if (currentAction != null) {
      currentAction.update(actionData, skeleton, time);
    }
  }
  
  @Override
  public int getExtraMatrixCount() {
    return boneCount;
  }
  
  @Override
  public void writeMatrices(float[] matrixArray) {
    super.writeMatrices(matrixArray);
    skeleton.writeMatrices(matrixArray, 16);
  }
}




Java Source Code List

com.supermercerbros.gameengine.GameActivity.java
com.supermercerbros.gameengine.GameView.java
com.supermercerbros.gameengine.Schooner3D.java
com.supermercerbros.gameengine.TestActivity.java
com.supermercerbros.gameengine.TestMaterials.java
com.supermercerbros.gameengine.TestObjects.java
com.supermercerbros.gameengine.animation.AnimationData.java
com.supermercerbros.gameengine.animation.Keyframe.java
com.supermercerbros.gameengine.animation.MeshAnimation.java
com.supermercerbros.gameengine.armature.ActionData.java
com.supermercerbros.gameengine.armature.Action.java
com.supermercerbros.gameengine.armature.BinarySkeletalVertexModifier.java
com.supermercerbros.gameengine.armature.Bone.java
com.supermercerbros.gameengine.armature.SkeletalVertexModifier.java
com.supermercerbros.gameengine.armature.Skeleton.java
com.supermercerbros.gameengine.collision.Bounds.java
com.supermercerbros.gameengine.collision.Collider.java
com.supermercerbros.gameengine.collision.CollisionDetector.java
com.supermercerbros.gameengine.collision.Collision.java
com.supermercerbros.gameengine.collision.DebugListener.java
com.supermercerbros.gameengine.collision.Edge.java
com.supermercerbros.gameengine.collision.Face.java
com.supermercerbros.gameengine.collision.Feature.java
com.supermercerbros.gameengine.collision.Intersection.java
com.supermercerbros.gameengine.collision.Line.java
com.supermercerbros.gameengine.collision.LocalDistMinimum.java
com.supermercerbros.gameengine.collision.Matrix.java
com.supermercerbros.gameengine.collision.OnCollisionCheckFinishedListener.java
com.supermercerbros.gameengine.collision.Plane.java
com.supermercerbros.gameengine.collision.Point.java
com.supermercerbros.gameengine.collision.Polyhedron.java
com.supermercerbros.gameengine.collision.SphereBounds.java
com.supermercerbros.gameengine.collision.Vector.java
com.supermercerbros.gameengine.collision.Vertex.java
com.supermercerbros.gameengine.debug.JankCatcher.java
com.supermercerbros.gameengine.debug.LoopLog.java
com.supermercerbros.gameengine.engine.Camera.java
com.supermercerbros.gameengine.engine.DataPipe.java
com.supermercerbros.gameengine.engine.EGLContextLostHandler.java
com.supermercerbros.gameengine.engine.Engine.java
com.supermercerbros.gameengine.engine.GameRenderer.java
com.supermercerbros.gameengine.engine.Light.java
com.supermercerbros.gameengine.engine.Normals.java
com.supermercerbros.gameengine.engine.RenderData.java
com.supermercerbros.gameengine.engine.Scene.java
com.supermercerbros.gameengine.engine.Time.java
com.supermercerbros.gameengine.engine.shaders.Material.java
com.supermercerbros.gameengine.engine.shaders.Program.java
com.supermercerbros.gameengine.engine.shaders.ShaderLib.java
com.supermercerbros.gameengine.engine.shaders.Shader.java
com.supermercerbros.gameengine.engine.shaders.VertexModifier.java
com.supermercerbros.gameengine.handlers.OnAnimationCompleteDispatcher.java
com.supermercerbros.gameengine.handlers.OnAnimationCompleteListener.java
com.supermercerbros.gameengine.hud.CoordsConverter.java
com.supermercerbros.gameengine.hud.GameHud.java
com.supermercerbros.gameengine.hud.HudElement.java
com.supermercerbros.gameengine.material.CelShadedMaterial.java
com.supermercerbros.gameengine.material.TexturedMaterial.java
com.supermercerbros.gameengine.math.BezierCurve.java
com.supermercerbros.gameengine.math.Curve.java
com.supermercerbros.gameengine.math.MatrixUtils.java
com.supermercerbros.gameengine.math.Quaternion.java
com.supermercerbros.gameengine.motion.CurveMovement.java
com.supermercerbros.gameengine.motion.MovementData.java
com.supermercerbros.gameengine.motion.Movement.java
com.supermercerbros.gameengine.objects.AnimatedMeshObject.java
com.supermercerbros.gameengine.objects.BasicMaterial.java
com.supermercerbros.gameengine.objects.BonedObject.java
com.supermercerbros.gameengine.objects.GameObject.java
com.supermercerbros.gameengine.objects.Metadata.java
com.supermercerbros.gameengine.parsers.ConstantCurve.java
com.supermercerbros.gameengine.parsers.GameFactory.java
com.supermercerbros.gameengine.parsers.PreBoneData.java
com.supermercerbros.gameengine.parsers.PreObjectData.java
com.supermercerbros.gameengine.parsers.Sch3D.java
com.supermercerbros.gameengine.render.Compositor.java
com.supermercerbros.gameengine.shaders.ProgramSource.java
com.supermercerbros.gameengine.texture.BitmapTexture.java
com.supermercerbros.gameengine.texture.ETC1CompressedTexture.java
com.supermercerbros.gameengine.texture.Texture.java
com.supermercerbros.gameengine.util.BetterDataInputStream.java
com.supermercerbros.gameengine.util.DelayedRunnable.java
com.supermercerbros.gameengine.util.GLES2.java
com.supermercerbros.gameengine.util.IPO.java
com.supermercerbros.gameengine.util.LoopingThread.java
com.supermercerbros.gameengine.util.Toggle.java
com.supermercerbros.gameengine.util.Utils.java