Java 类javax.vecmath.TexCoord2f 实例源码
项目:SweetHome3D
文件:OBJWriter.java
/**
* Writes <code>textureCoordinates</code> in a line vt at OBJ format,
* if the texture coordinates wasn't written yet.
*/
private void writeTextureCoordinates(TexCoord2f textureCoordinates, int index,
int[] textureCoordinatesIndexSubstitutes) throws IOException
{
Integer textureCoordinatesIndex = this.textureCoordinatesIndices.get(textureCoordinates);
if (textureCoordinatesIndex == null)
{
textureCoordinatesIndexSubstitutes[index] = this.textureCoordinatesIndices.size() + 1;
this.textureCoordinatesIndices.put(textureCoordinates, textureCoordinatesIndexSubstitutes[index]);
// Write only once unique texture coordinates
this.out.write("vt " + format(textureCoordinates.x) + " " + format(textureCoordinates.y) + " 0\n");
}
else
{
textureCoordinatesIndexSubstitutes[index] = textureCoordinatesIndex;
}
}
项目:geoxygene
文件:OBJWriter.java
/**
* Returns texture coordinates generated with <code>texCoordGeneration</code> computed
* as described in <code>TexCoordGeneration</code> javadoc.
*/
private TexCoord2f generateTextureCoordinates(float x, float y, float z,
Vector4f planeS,
Vector4f planeT) {
return new TexCoord2f(x * planeS.x + y * planeS.y + z * planeS.z + planeS.w,
x * planeT.x + y * planeT.y + z * planeT.z + planeT.w);
}
项目:geoxygene
文件:OBJWriter.java
/**
* Writes <code>textureCoordinates</code> in a line vt at OBJ format,
* if the texture coordinates wasn't written yet.
*/
private void writeTextureCoordinates(TexCoord2f textureCoordinates, int index,
int [] textureCoordinatesIndexSubstitutes) throws IOException {
Integer textureCoordinatesIndex = this.textureCoordinatesIndices.get(textureCoordinates);
if (textureCoordinatesIndex == null) {
textureCoordinatesIndexSubstitutes [index] = this.textureCoordinatesIndices.size() + 1;
this.textureCoordinatesIndices.put(textureCoordinates, textureCoordinatesIndexSubstitutes [index]);
// Write only once unique texture coordinates
this.out.write("vt " + format(textureCoordinates.x)
+ " " + format(textureCoordinates.y) + " 0\n");
} else {
textureCoordinatesIndexSubstitutes [index] = textureCoordinatesIndex;
}
}
项目:SweetHome3D
文件:Max3DSLoader.java
public Mesh3DS(String name, Point3f[] vertices, TexCoord2f[] textureCoordinates, Face3DS[] faces, Short color,
Transform3D transform)
{
this.name = name;
this.vertices = vertices;
this.textureCoordinates = textureCoordinates;
this.faces = faces;
this.color = color;
this.transform = transform;
}
项目:SweetHome3D
文件:PhotoRenderer.java
/**
* Stores <code>textureCoordinates</code> in <code>uvs</code>.
*/
private void exportTextureCoordinates(TexCoord2f textureCoordinates, int index, float[] uvs)
{
index *= 2;
uvs[index++] = textureCoordinates.x;
uvs[index] = textureCoordinates.y;
}
项目:GpsPrune
文件:TerrainHelper.java
/**
* Get the texture coordinates as an array
* @return texture coordinates as array
*/
public TexCoord2f[] getTextureCoordinates()
{
if (_gridSize <= 1) {return null;}
final int numNodes = _gridSize * _gridSize;
final float gridStep = 1.0f / (_gridSize - 1);
// Build all the required nodes
TexCoord2f[] nodes = new TexCoord2f[numNodes];
for (int i=0; i<_gridSize; i++)
{
for (int j=0; j<_gridSize; j++)
{
nodes[j * _gridSize + i] = new TexCoord2f(gridStep * i, 1.0f - gridStep * j);
}
}
// Now put these nodes into a new result array (repeating nodes as necessary)
final int resultSize = _gridSize * (_gridSize * 2 - 2);
TexCoord2f[] result = new TexCoord2f[resultSize];
final int numStrips = _gridSize - 1;
int resultIndex = 0;
for (int strip=0; strip<numStrips; strip++)
{
for (int col=0; col<_gridSize; col++)
{
int bottomNodeIndex = strip * _gridSize + col;
int topNodeIndex = bottomNodeIndex + _gridSize;
result[resultIndex++] = nodes[bottomNodeIndex];
result[resultIndex++] = nodes[topNodeIndex];
}
}
return result;
}
项目:silvie
文件:OBJWriter.java
/**
* Writes <code>textureCoordinates</code> in a line vt at OBJ format, if the
* texture coordinates wasn't written yet.
*/
private void writeTextureCoordinates(TexCoord2f textureCoordinates, int index, int[] textureCoordinatesIndexSubstitutes) throws IOException {
Integer textureCoordinatesIndex = this.textureCoordinatesIndices.get(textureCoordinates);
if (textureCoordinatesIndex == null) {
textureCoordinatesIndexSubstitutes[index] = this.textureCoordinatesIndices.size() + 1;
this.textureCoordinatesIndices.put(textureCoordinates, textureCoordinatesIndexSubstitutes[index]);
// Write only once unique texture coordinates
this.out.write("vt " + format(textureCoordinates.x) + " " + format(textureCoordinates.y) + " 0\n");
} else {
textureCoordinatesIndexSubstitutes[index] = textureCoordinatesIndex;
}
}
项目:SweetHome3D
文件:Ground3D.java
/**
* Adds to ground shape the geometry matching the given area.
*/
private void addAreaGeometry(Shape3D groundShape, HomeTexture groundTexture, Area area, float elevation)
{
List<float[][]> areaPoints = getAreaPoints(area, 1, false);
if (!areaPoints.isEmpty())
{
int vertexCount = 0;
int[] stripCounts = new int[areaPoints.size()];
for (int i = 0; i < stripCounts.length; i++)
{
stripCounts[i] = areaPoints.get(i).length;
vertexCount += stripCounts[i];
}
Point3f[] geometryCoords = new Point3f[vertexCount];
TexCoord2f[] geometryTextureCoords = groundTexture != null ? new TexCoord2f[vertexCount] : null;
float textureWidth;
float textureHeight;
if (groundTexture != null)
{
textureWidth = TextureManager.getInstance().getRotatedTextureWidth(groundTexture);
textureHeight = TextureManager.getInstance().getRotatedTextureHeight(groundTexture);
}
else
{
textureWidth = 0;
textureHeight = 0;
}
int j = 0;
for (float[][] areaPartPoints : areaPoints)
{
for (int i = 0; i < areaPartPoints.length; i++, j++)
{
float[] point = areaPartPoints[i];
geometryCoords[j] = new Point3f(point[0], elevation, point[1]);
if (groundTexture != null)
{
geometryTextureCoords[j] = new TexCoord2f((point[0] - this.originX) / textureWidth,
(this.originY - point[1]) / textureHeight);
}
}
}
GeometryInfo geometryInfo = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
geometryInfo.setCoordinates(geometryCoords);
if (groundTexture != null)
{
geometryInfo.setTextureCoordinateParams(1, 2);
geometryInfo.setTextureCoordinates(0, geometryTextureCoords);
}
geometryInfo.setStripCounts(stripCounts);
new NormalGenerator(0).generateNormals(geometryInfo);
groundShape.addGeometry(geometryInfo.getIndexedGeometryArray());
}
}
项目:SweetHome3D
文件:Ground3D.java
/**
* Adds to ground shape the geometry matching the given area sides.
*/
private void addAreaSidesGeometry(Shape3D groundShape, HomeTexture groundTexture, float[][] areaPoints,
float elevation, float sideHeight)
{
Point3f[] geometryCoords = new Point3f[areaPoints.length * 4];
TexCoord2f[] geometryTextureCoords = groundTexture != null ? new TexCoord2f[geometryCoords.length] : null;
float textureWidth;
float textureHeight;
if (groundTexture != null)
{
textureWidth = TextureManager.getInstance().getRotatedTextureWidth(groundTexture);
textureHeight = TextureManager.getInstance().getRotatedTextureHeight(groundTexture);
}
else
{
textureWidth = 0;
textureHeight = 0;
}
for (int i = 0, j = 0; i < areaPoints.length; i++)
{
float[] point = areaPoints[i];
float[] nextPoint = areaPoints[i < areaPoints.length - 1 ? i + 1 : 0];
geometryCoords[j++] = new Point3f(point[0], elevation, point[1]);
geometryCoords[j++] = new Point3f(point[0], elevation + sideHeight, point[1]);
geometryCoords[j++] = new Point3f(nextPoint[0], elevation + sideHeight, nextPoint[1]);
geometryCoords[j++] = new Point3f(nextPoint[0], elevation, nextPoint[1]);
if (groundTexture != null)
{
float distance = (float) Point2D.distance(point[0], point[1], nextPoint[0], nextPoint[1]);
geometryTextureCoords[j - 4] = new TexCoord2f(point[0] / textureWidth, elevation / textureHeight);
geometryTextureCoords[j - 3] = new TexCoord2f(point[0] / textureWidth,
(elevation + sideHeight) / textureHeight);
geometryTextureCoords[j - 2] = new TexCoord2f((point[0] - distance) / textureWidth,
(elevation + sideHeight) / textureHeight);
geometryTextureCoords[j - 1] = new TexCoord2f((point[0] - distance) / textureWidth,
elevation / textureHeight);
}
}
GeometryInfo geometryInfo = new GeometryInfo(GeometryInfo.QUAD_ARRAY);
geometryInfo.setCoordinates(geometryCoords);
if (groundTexture != null)
{
geometryInfo.setTextureCoordinateParams(1, 2);
geometryInfo.setTextureCoordinates(0, geometryTextureCoords);
}
new NormalGenerator(0).generateNormals(geometryInfo);
groundShape.addGeometry(geometryInfo.getIndexedGeometryArray());
}
项目:SweetHome3D
文件:Max3DSLoader.java
public TexCoord2f[] getTextureCoordinates()
{
return this.textureCoordinates;
}
项目:SweetHome3D
文件:OBJWriter.java
/**
* Returns texture coordinates generated with <code>texCoordGeneration</code> computed
* as described in <code>TexCoordGeneration</code> javadoc.
*/
private TexCoord2f generateTextureCoordinates(float x, float y, float z, Vector4f planeS, Vector4f planeT)
{
return new TexCoord2f(x * planeS.x + y * planeS.y + z * planeS.z + planeS.w,
x * planeT.x + y * planeT.y + z * planeT.z + planeT.w);
}
项目:SweetHome3D
文件:PhotoRenderer.java
/**
* Returns texture coordinates generated with <code>texCoordGeneration</code> computed
* as described in <code>TexCoordGeneration</code> javadoc.
*/
private TexCoord2f generateTextureCoordinates(float x, float y, float z, Vector4f planeS, Vector4f planeT)
{
return new TexCoord2f(x * planeS.x + y * planeS.y + z * planeS.z + planeS.w,
x * planeT.x + y * planeT.y + z * planeT.z + planeT.w);
}
项目:SweetHome3D
文件:OBJLoader.java
/**
* Returns the scene parsed from a stream.
*/
private Scene parseObjectStream(Reader reader, URL baseUrl) throws IOException
{
this.vertices = new ArrayList<Point3f>();
this.textureCoordinates = new ArrayList<TexCoord2f>();
this.normals = new ArrayList<Vector3f>();
this.groups = new LinkedHashMap<String, Group>();
this.currentGroup = new Group("default");
this.groups.put("default", this.currentGroup);
this.currentMaterial = "default";
this.appearances = new HashMap<String, Appearance>(DEFAULT_APPEARANCES);
StreamTokenizer tokenizer = createTokenizer(reader);
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF)
{
switch (tokenizer.ttype)
{
case StreamTokenizer.TT_WORD:
parseObjectLine(tokenizer, baseUrl);
break;
case StreamTokenizer.TT_EOL:
break;
default:
throw new IncorrectFormatException(
"Unexpected token " + tokenizer.sval + " at row " + tokenizer.lineno());
}
}
try
{
return createScene();
}
finally
{
this.vertices = null;
this.textureCoordinates = null;
this.normals = null;
this.groups = null;
this.appearances = null;
}
}
项目:SweetHome3D
文件:HomeComponent3D.java
/**
* Returns a half sphere oriented inward and with texture ordinates
* that spread along an hemisphere.
*/
private Geometry createHalfSphereGeometry(boolean top)
{
final int divisionCount = 48;
Point3f[] coords = new Point3f[divisionCount * divisionCount];
TexCoord2f[] textureCoords = top ? new TexCoord2f[divisionCount * divisionCount] : null;
Color3f[] colors = top ? null : new Color3f[divisionCount * divisionCount];
for (int i = 0, k = 0; i < divisionCount; i++)
{
double alpha = i * 2 * Math.PI / divisionCount;
float cosAlpha = (float) Math.cos(alpha);
float sinAlpha = (float) Math.sin(alpha);
double nextAlpha = (i + 1) * 2 * Math.PI / divisionCount;
float cosNextAlpha = (float) Math.cos(nextAlpha);
float sinNextAlpha = (float) Math.sin(nextAlpha);
for (int j = 0; j < divisionCount / 4; j++)
{
double beta = 2 * j * Math.PI / divisionCount;
float cosBeta = (float) Math.cos(beta);
float sinBeta = (float) Math.sin(beta);
// Correct the bottom of the hemisphere to avoid seeing a bottom hemisphere at the horizon
float y = j != 0 ? (top ? sinBeta : -sinBeta) : -0.01f;
double nextBeta = 2 * (j + 1) * Math.PI / divisionCount;
if (!top)
{
nextBeta = -nextBeta;
}
float cosNextBeta = (float) Math.cos(nextBeta);
float sinNextBeta = (float) Math.sin(nextBeta);
if (top)
{
coords[k] = new Point3f(cosAlpha * cosBeta, y, sinAlpha * cosBeta);
textureCoords[k++] = new TexCoord2f((float) i / divisionCount, sinBeta);
coords[k] = new Point3f(cosNextAlpha * cosBeta, y, sinNextAlpha * cosBeta);
textureCoords[k++] = new TexCoord2f((float) (i + 1) / divisionCount, sinBeta);
coords[k] = new Point3f(cosNextAlpha * cosNextBeta, sinNextBeta, sinNextAlpha * cosNextBeta);
textureCoords[k++] = new TexCoord2f((float) (i + 1) / divisionCount, sinNextBeta);
coords[k] = new Point3f(cosAlpha * cosNextBeta, sinNextBeta, sinAlpha * cosNextBeta);
textureCoords[k++] = new TexCoord2f((float) i / divisionCount, sinNextBeta);
}
else
{
coords[k] = new Point3f(cosAlpha * cosBeta, y, sinAlpha * cosBeta);
float color1 = .9f + y * .5f;
colors[k++] = new Color3f(color1, color1, color1);
coords[k] = new Point3f(cosAlpha * cosNextBeta, sinNextBeta, sinAlpha * cosNextBeta);
float color2 = .9f + sinNextBeta * .5f;
colors[k++] = new Color3f(color2, color2, color2);
coords[k] = new Point3f(cosNextAlpha * cosNextBeta, sinNextBeta, sinNextAlpha * cosNextBeta);
colors[k++] = new Color3f(color2, color2, color2);
coords[k] = new Point3f(cosNextAlpha * cosBeta, y, sinNextAlpha * cosBeta);
colors[k++] = new Color3f(color1, color1, color1);
}
}
}
GeometryInfo geometryInfo = new GeometryInfo(GeometryInfo.QUAD_ARRAY);
geometryInfo.setCoordinates(coords);
if (textureCoords != null)
{
geometryInfo.setTextureCoordinateParams(1, 2);
geometryInfo.setTextureCoordinates(0, textureCoords);
}
if (colors != null)
{
geometryInfo.setColors(colors);
}
geometryInfo.indexify();
geometryInfo.compact();
Geometry halfSphereGeometry = geometryInfo.getIndexedGeometryArray();
return halfSphereGeometry;
}
项目:silvie
文件:CHRModel.java
@Override
public void extract() throws Exception {
/*
* Some models don't work at all (LIFT.CHR and ITEMS.CHR). They seem to
* be incomplete/garbage files that were probably included by mistake
*/
super.extract();
int rootChunkDataSize = super.resourceBytes.length - 2 * DataReader.INT_SIZE;
byte[] rootChunkData = new byte[rootChunkDataSize];
System.arraycopy(super.resourceBytes, 2 * DataReader.INT_SIZE, rootChunkData, 0, rootChunkDataSize);
AbstractChunk rootChunk = new Chunk0x8000(ROOT_CHUNK_ID, rootChunkData);
rootChunk.readContents();
Chunk0x7f01 textureOffsetsChunk = (Chunk0x7f01) rootChunk.getChunksById(TEXTURE_OFFSETS_CHUNK_ID).get(0);
List<AbstractChunk> shapeChunks = rootChunk.getChunksById(SHAPE_CHUNK_ID);
Chunk0x7f04 textureChunk = (Chunk0x7f04) rootChunk.getChunksById(TEXTURE_CHUNK_ID).get(0);
Chunk0x7f05 shapePositionsChunk = (Chunk0x7f05) rootChunk.getChunksById(SHAPE_POSITIONS_CHUNK_ID).get(0);
Chunk0x7f06 shapePositionIdsChunk = (Chunk0x7f06) rootChunk.getChunksById(SHAPE_POSITION_IDS_CHUNK_ID).get(0);
shapePositionIdsChunk.mapPositions(shapePositionsChunk);
List<Point3f> vertexList = new ArrayList<>();
List<Integer> stripCountList = new ArrayList<>();
List<TexCoord2f> texCoordList = new ArrayList<>();
int[] textureOffsets = textureOffsetsChunk.getTextureOffsets();
short[] texturePixelIndices = textureChunk.getTexturePixelIndices();
int textureWidth = textureChunk.getWidth();
int textureHeight = textureChunk.getHeight();
for (AbstractChunk chunk : shapeChunks) {
Chunk0x7f02 shape = (Chunk0x7f02) chunk;
int shapeId = shape.getShapeId();
Polygon[] polygons = shape.getPolygons();
Point3f[] shapeVertices = shape.getVertices();
for (Polygon polygon : polygons) {
int textureOffsetIndex = polygon.getTextureOffsetIndex();
int textureStartPixel = textureOffsets[textureOffsetIndex];
polygon.setPixelSearchStart(textureStartPixel);
polygon.setTexturePixelIndices(texturePixelIndices);
polygon.setTextureWidth(textureWidth);
polygon.decode();
int[] vertexIndices = polygon.getShapeVertexIndices();
// Going backwards, otherwise faces are inside out
for (int i = vertexIndices.length - 1; i >= 0; i--) {
Point3f vertex = (Point3f) shapeVertices[vertexIndices[i]].clone();
vertex.add(shapePositionIdsChunk.getShapePosition(shapeId));
vertexList.add(vertex);
}
Point[] relativeUVs = polygon.getRelativeUVs();
for (int i = relativeUVs.length - 1; i >= 0; i--) {
int texOriginX = textureStartPixel % textureWidth;
int texOriginY = textureStartPixel / textureWidth;
float u = (float) (relativeUVs[i].getX() + texOriginX);
u /= textureWidth;
float v = (float) (relativeUVs[i].getY() + texOriginY);
// The UV 0,0 is at the bottom left
v = textureHeight - v;
v /= textureHeight;
texCoordList.add(new TexCoord2f(u, v));
}
stripCountList.add(polygon.getVerticeCount());
}
}
Point3f[] vertices = vertexList.toArray(new Point3f[vertexList.size()]);
int[] stripCounts = stripCountList.stream().mapToInt(i -> i).toArray();
TexCoord2f[] texCoords = texCoordList.toArray(new TexCoord2f[texCoordList.size()]);
GeometryInfo geometryInfo = new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
geometryInfo.setCoordinates(vertices);
geometryInfo.setStripCounts(stripCounts);
geometryInfo.setTextureCoordinateParams(1, 2);
geometryInfo.setTextureCoordinates(0, texCoords);
Appearance appearence = new Appearance();
TextureLoader textureLoader = new TextureLoader((BufferedImage) textureChunk.getTexture());
appearence.setTexture(textureLoader.getTexture());
NormalGenerator normalGenerator = new NormalGenerator();
normalGenerator.generateNormals(geometryInfo);
Stripifier stripifier = new Stripifier();
stripifier.stripify(geometryInfo);
GeometryArray geometryArray = geometryInfo.getGeometryArray();
this.shape3d = new Shape3D(geometryArray);
this.shape3d.setAppearance(appearence);
}
项目:silvie
文件:OBJWriter.java
/**
* Returns texture coordinates generated with
* <code>texCoordGeneration</code> computed as described in
* <code>TexCoordGeneration</code> javadoc.
*/
private TexCoord2f generateTextureCoordinates(float x, float y, float z, Vector4f planeS, Vector4f planeT) {
return new TexCoord2f(x * planeS.x + y * planeS.y + z * planeS.z + planeS.w, x * planeT.x + y * planeT.y + z * planeT.z + planeT.w);
}