Android Open Source - 101AndroidApps Geometry






From Project

Back to project page 101AndroidApps.

License

The source code is released under:

Licenced under the Creative Commons Attribution 4.0 licence. For full text see http://creativecommons.org/licenses/by/4.0/

If you think the Android project 101AndroidApps 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

package com.hulzenga.ioi.android.util.open_gl.geometry;
//from   www  .j  a v a 2 s .co  m
import com.hulzenga.ioi.android.util.open_gl.vector.Vec3;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public abstract class Geometry {

  private static final int VERTICES_PER_TRIANGLE = 3;

  private List<Vec3>  vertices           = new ArrayList<Vec3>();
  private List<Vec3>  normals            = new ArrayList<Vec3>();
  private List<Vec3>  textureCoordinates = new ArrayList<Vec3>();
  private List<Short> indices            = new ArrayList<Short>();

  public List<Vec3> getVertices() {
    return vertices;
  }

  public List<Vec3> getNormals() {
    return normals;
  }

  public List<Vec3> getTextureCoordinates() {
    return textureCoordinates;
  }

  public List<Short> getIndices() {
    return indices;
  }

  public void makeFaceted() {

    if (isFaceted()) {
      return;
    }

    List<Vec3> newVertices = new ArrayList<Vec3>();
    List<Vec3> newNormals = new ArrayList<Vec3>();
    List<Vec3> newTextureCoordinates = new ArrayList<Vec3>();
    List<Short> newIndices = new ArrayList<Short>();

    for (int i = 0; i < indices.size(); i++) {
      newVertices.add(vertices.get(indices.get(i)));
      newNormals.add(normals.get(indices.get(i)));
      newTextureCoordinates.add(textureCoordinates.get(indices.get(i)));
      newIndices.add((short) i);
    }

    vertices = newVertices;
    normals = newNormals;
    textureCoordinates = newTextureCoordinates;
    indices = newIndices;

    int numberOfTriangles = indices.size() / VERTICES_PER_TRIANGLE;

    for (int i = 0; i < numberOfTriangles; i++) {
      Vec3 a = vertices.get(i * VERTICES_PER_TRIANGLE).copy().
          subtract(vertices.get(i * VERTICES_PER_TRIANGLE + 1));
      Vec3 b = vertices.get(i * VERTICES_PER_TRIANGLE + 1).copy().
          subtract(vertices.get(i * VERTICES_PER_TRIANGLE + 2));
      a.cross(b).normalize();
      normals.set(i * VERTICES_PER_TRIANGLE , a);
      normals.set(i * VERTICES_PER_TRIANGLE + 1, a);
      normals.set(i * VERTICES_PER_TRIANGLE + 2, a);
    }
  }

  public boolean isFaceted() {
    return vertices.size() == indices.size();
  }

  public void discardSelectedVertices(VertexSelector selector) {

    List<Integer> removalList = new ArrayList<Integer>();

    for (int i = vertices.size()-1; i >= 0; i--) {
      if (selector.isSelected(vertices.get(i))) {
        removalList.add(i);
      }
    }

    for (int i = 0; i < indices.size();) {
      if (removalList.contains(indices.get(i)) ||
          removalList.contains(indices.get(i+1)) ||
          removalList.contains(indices.get(i+2))) {
        indices.remove(i+2);
        indices.remove(i+1);
        indices.remove(i);
      } else {
        i += 3;
      }
    }

    for (int i : removalList) {
      vertices.remove(i);
      normals.remove(i);

      //TODO: add this once all geometries have texture coordinates
      //textureCoordinates.remove(i);
    }
  }

  /**
   * Estimates normals based on neighboring vertex locations. Dubious how well this works
   */
  public void estimateNormals() {
    for (short i = 0; i < vertices.size(); i++) {
      Vec3 newNormal = new Vec3(0.0f, 0.0f, 0.0f);
      for (Vec3 connectedVertex : findConnectedVertices(i)) {
        newNormal.add(connectedVertex.copy().subtract(vertices.get(i)));
      }
      normals.set(i, newNormal.normalize().invert());
    }
  }

  private List<Vec3> findConnectedVertices(short vertexIndex) {
    List<Vec3> connectedVertices = new ArrayList<Vec3>();
    Set<Short> connectedIndices = new HashSet<Short>();

    int numberOfTriangles = indices.size() / VERTICES_PER_TRIANGLE;
    Short s1, s2, s3;
    for (int i = 0; i < numberOfTriangles; i++) {
      s1 = indices.get(i * 3);
      s2 = indices.get(i * 3 + 1);
      s3 = indices.get(i * 3 + 2);

      if (s1 == vertexIndex || s2 == vertexIndex || s3 == vertexIndex) {
        connectedIndices.add(s1);
        connectedIndices.add(s2);
        connectedIndices.add(s3);
      }
    }

    for (Short index : connectedIndices) {
      connectedVertices.add(vertices.get(index));
    }
    return connectedVertices;
  }

  public interface VertexSelector {
    public boolean isSelected(Vec3 vertex);
  }
}




Java Source Code List

com.hulzenga.ioi.android.AppActivity.java
com.hulzenga.ioi.android.AppDetailsDialog.java
com.hulzenga.ioi.android.App.java
com.hulzenga.ioi.android.TableOfContentsActivity.java
com.hulzenga.ioi.android.app_001.HelloWorldActivity.java
com.hulzenga.ioi.android.app_002.Ball.java
com.hulzenga.ioi.android.app_002.BouncyBallsActivity.java
com.hulzenga.ioi.android.app_002.BouncyBallsView.java
com.hulzenga.ioi.android.app_003.MonsterDatabaseActivity.java
com.hulzenga.ioi.android.app_003.MonsterEditDialog.java
com.hulzenga.ioi.android.app_003.MonsterGenerator.java
com.hulzenga.ioi.android.app_003.MonsterListAdapter.java
com.hulzenga.ioi.android.app_003.database.MonsterContract.java
com.hulzenga.ioi.android.app_003.database.MonsterDatabaseHelper.java
com.hulzenga.ioi.android.app_003.database.MonsterProvider.java
com.hulzenga.ioi.android.app_004.BouncyBall3dActivity.java
com.hulzenga.ioi.android.app_004.BouncyBall3dGLSurfaceView.java
com.hulzenga.ioi.android.app_004.BouncyBall3dRenderer.java
com.hulzenga.ioi.android.app_004.BouncyBallGame.java
com.hulzenga.ioi.android.app_005.ElementActivity.java
com.hulzenga.ioi.android.app_005.ElementAdapter.java
com.hulzenga.ioi.android.app_005.ElementAnimator.java
com.hulzenga.ioi.android.app_005.ElementSnakeView.java
com.hulzenga.ioi.android.app_005.ElementView.java
com.hulzenga.ioi.android.app_005.Element.java
com.hulzenga.ioi.android.app_006.EmptyFragment.java
com.hulzenga.ioi.android.app_006.ExposureFragment.java
com.hulzenga.ioi.android.app_006.SettingChangeListener.java
com.hulzenga.ioi.android.app_006.SettingIconFragment.java
com.hulzenga.ioi.android.app_006.SettingMenuFragment.java
com.hulzenga.ioi.android.app_006.SettingMenuLvl2Fragment.java
com.hulzenga.ioi.android.app_006.Setting.java
com.hulzenga.ioi.android.app_006.SimpleCameraActivity.java
com.hulzenga.ioi.android.app_006.SimpleCameraPreview.java
com.hulzenga.ioi.android.app_007.ButtonsFragment.java
com.hulzenga.ioi.android.app_007.HighScores.java
com.hulzenga.ioi.android.app_007.LinksFragment.java
com.hulzenga.ioi.android.app_007.Menu.java
com.hulzenga.ioi.android.app_007.Review.java
com.hulzenga.ioi.android.app_007.Score.java
com.hulzenga.ioi.android.app_007.StatusFragment.java
com.hulzenga.ioi.android.app_007.WikiGameActivity.java
com.hulzenga.ioi.android.app_007.Wiki.java
com.hulzenga.ioi.android.app_008.OverheidActivity.java
com.hulzenga.ioi.android.app_008.OverheidFeedAdapter.java
com.hulzenga.ioi.android.app_008.OverheidFeedFragment.java
com.hulzenga.ioi.android.app_008.OverheidFeedItem.java
com.hulzenga.ioi.android.app_008.OverheidFeed.java
com.hulzenga.ioi.android.app_008.OverheidPagerAdapter.java
com.hulzenga.ioi.android.app_009.ThumbsUpActivity.java
com.hulzenga.ioi.android.app_009.ThumbsUpServer.java
com.hulzenga.ioi.android.app_009.ThumbsUpService.java
com.hulzenga.ioi.android.app_010.CompassActivity.java
com.hulzenga.ioi.android.app_010.CompassDetailsView.java
com.hulzenga.ioi.android.app_010.CompassView.java
com.hulzenga.ioi.android.util.Constrain.java
com.hulzenga.ioi.android.util.DeveloperTools.java
com.hulzenga.ioi.android.util.FileManager.java
com.hulzenga.ioi.android.util.ScreenMetrics.java
com.hulzenga.ioi.android.util.open_gl.ColorFunctionFactory.java
com.hulzenga.ioi.android.util.open_gl.ColorFunction.java
com.hulzenga.ioi.android.util.open_gl.ShaderTools.java
com.hulzenga.ioi.android.util.open_gl.engine.NodeController.java
com.hulzenga.ioi.android.util.open_gl.engine.SceneGraph.java
com.hulzenga.ioi.android.util.open_gl.engine.SceneNode.java
com.hulzenga.ioi.android.util.open_gl.geometry.Box.java
com.hulzenga.ioi.android.util.open_gl.geometry.Cylinder.java
com.hulzenga.ioi.android.util.open_gl.geometry.Geometry.java
com.hulzenga.ioi.android.util.open_gl.geometry.Grid.java
com.hulzenga.ioi.android.util.open_gl.geometry.Sphere.java
com.hulzenga.ioi.android.util.open_gl.geometry.Transform.java
com.hulzenga.ioi.android.util.open_gl.vector.Vec3.java
com.hulzenga.ioi.android.util.open_gl.vector.Vec4.java
fi.iki.elonen.NanoHTTPD.java