119 lines
4.4 KiB
Java
119 lines
4.4 KiB
Java
/*
|
|
* Copyright (C) 2007 The Android Open Source Project
|
|
*
|
|
* 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.android.globaltime;
|
|
|
|
public class LatLongSphere extends Sphere {
|
|
|
|
public LatLongSphere(float centerX, float centerY, float centerZ,
|
|
float radius, int lats, int longs,
|
|
float minLongitude, float maxLongitude,
|
|
boolean emitTextureCoordinates,
|
|
boolean emitNormals,
|
|
boolean emitColors,
|
|
boolean flatten) {
|
|
super(emitTextureCoordinates, emitNormals, emitColors);
|
|
|
|
int tris = 2 * (lats - 1) * (longs - 1);
|
|
int[] vertices = new int[3 * lats * longs];
|
|
int[] texcoords = new int[2 * lats * longs];
|
|
int[] colors = new int[4 * lats * longs];
|
|
int[] normals = new int[3 * lats * longs];
|
|
short[] indices = new short[3 * tris];
|
|
|
|
int vidx = 0;
|
|
int tidx = 0;
|
|
int nidx = 0;
|
|
int cidx = 0;
|
|
int iidx = 0;
|
|
|
|
minLongitude *= DEGREES_TO_RADIANS;
|
|
maxLongitude *= DEGREES_TO_RADIANS;
|
|
|
|
for (int i = 0; i < longs; i++) {
|
|
float fi = (float) i / (longs - 1);
|
|
// theta is the longitude
|
|
float theta =
|
|
(maxLongitude - minLongitude) * (1.0f - fi) + minLongitude;
|
|
float sinTheta = (float) Math.sin(theta);
|
|
float cosTheta = (float) Math.cos(theta);
|
|
|
|
for (int j = 0; j < lats; j++) {
|
|
float fj = (float) j / (lats - 1);
|
|
// phi is the latitude
|
|
float phi = PI * fj;
|
|
float sinPhi = (float) Math.sin(phi);
|
|
float cosPhi = (float) Math.cos(phi);
|
|
float x = cosTheta * sinPhi;
|
|
float y = cosPhi;
|
|
float z = sinTheta * sinPhi;
|
|
|
|
if (flatten) {
|
|
// Place vertices onto a flat projection
|
|
vertices[vidx++] = toFixed(2.0f * fi - 1.0f);
|
|
vertices[vidx++] = toFixed(0.5f - fj);
|
|
vertices[vidx++] = toFixed(0.0f);
|
|
} else {
|
|
// Place vertices onto the surface of a sphere
|
|
// with the given center and radius
|
|
vertices[vidx++] = toFixed(x * radius + centerX);
|
|
vertices[vidx++] = toFixed(y * radius + centerY);
|
|
vertices[vidx++] = toFixed(z * radius + centerZ);
|
|
}
|
|
|
|
if (emitTextureCoordinates) {
|
|
texcoords[tidx++] = toFixed(1.0f - (theta / (TWO_PI)));
|
|
texcoords[tidx++] = toFixed(fj);
|
|
}
|
|
|
|
if (emitNormals) {
|
|
float norm = 1.0f / Shape.length(x, y, z);
|
|
normals[nidx++] = toFixed(x * norm);
|
|
normals[nidx++] = toFixed(y * norm);
|
|
normals[nidx++] = toFixed(z * norm);
|
|
}
|
|
|
|
// 0 == black, 65536 == white
|
|
if (emitColors) {
|
|
colors[cidx++] = (i % 2) * 65536;
|
|
colors[cidx++] = 0;
|
|
colors[cidx++] = (j % 2) * 65536;
|
|
colors[cidx++] = 65536;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < longs - 1; i++) {
|
|
for (int j = 0; j < lats - 1; j++) {
|
|
int base = i * lats + j;
|
|
|
|
// Ensure both triangles have the same final vertex
|
|
// since this vertex carries the color for flat
|
|
// shading
|
|
indices[iidx++] = (short) (base);
|
|
indices[iidx++] = (short) (base + 1);
|
|
indices[iidx++] = (short) (base + lats + 1);
|
|
|
|
indices[iidx++] = (short) (base + lats);
|
|
indices[iidx++] = (short) (base);
|
|
indices[iidx++] = (short) (base + lats + 1);
|
|
}
|
|
}
|
|
|
|
allocateBuffers(vertices, texcoords, normals, colors, indices);
|
|
}
|
|
}
|