package java3d;
public class Box extends Primitive {
public static final int FRONT = 0;
public static final int BACK = 1;
public static final int RIGHT = 2;
public static final int LEFT = 3;
public static final int TOP = 4;
public static final int BOTTOM = 5;
float xDim = 1.0f;
float yDim = 1.0f;
float zDim = 1.0f;
private Shape3D frontShape = null;
private Shape3D backShape = null;
private Shape3D rightShape = null;
private Shape3D leftShape = null;
private Shape3D topShape = null;
private Shape3D bottomShape = null;
public Box() {
this(1.0f, 1.0f, 1.0f, null);
}
public Box(float x, float y, float z, Appearance ap) {
float coordinates[][] = {
{-x, -y, z},
{ x, -y, z},
{ x, y, z},
{-x, y, z},
{-x, -y, -z},
{ x, -y, -z},
{ x, y, -z},
{-x, y, -z}
};
float uv[] = {
0, 0, 1, 0, 1, 1 , 0, 1,
};
// 各面のジオメトリを作成
TriangleFanArray frontGeom = new TriangleFanArray(4,
TriangleFanArray.COORDINATES | TriangleFanArray.NORMALS | TriangleFanArray.TEXTURE_COORDINATE_2,
new int[]{4});
TriangleFanArray backGeom = new TriangleFanArray(4,
TriangleFanArray.COORDINATES | TriangleFanArray.NORMALS | TriangleFanArray.TEXTURE_COORDINATE_2,
new int[]{4});
TriangleFanArray rightGeom = new TriangleFanArray(4,
TriangleFanArray.COORDINATES | TriangleFanArray.NORMALS | TriangleFanArray.TEXTURE_COORDINATE_2,
new int[]{4});
TriangleFanArray leftGeom = new TriangleFanArray(4,
TriangleFanArray.COORDINATES | TriangleFanArray.NORMALS | TriangleFanArray.TEXTURE_COORDINATE_2,
new int[]{4});
TriangleFanArray topGeom = new TriangleFanArray(4,
TriangleFanArray.COORDINATES | TriangleFanArray.NORMALS | TriangleFanArray.TEXTURE_COORDINATE_2,
new int[]{4});
TriangleFanArray bottomGeom = new TriangleFanArray(4,
TriangleFanArray.COORDINATES | TriangleFanArray.NORMALS | TriangleFanArray.TEXTURE_COORDINATE_2,
new int[]{4});
// 頂点座標の設定
frontGeom.setCoordinate(0, coordinates[0]);
frontGeom.setCoordinate(1, coordinates[1]);
frontGeom.setCoordinate(2, coordinates[2]);
frontGeom.setCoordinate(3, coordinates[3]);
backGeom.setCoordinate(0, coordinates[5]);
backGeom.setCoordinate(1, coordinates[4]);
backGeom.setCoordinate(2, coordinates[7]);
backGeom.setCoordinate(3, coordinates[6]);
rightGeom.setCoordinate(0, coordinates[1]);
rightGeom.setCoordinate(1, coordinates[5]);
rightGeom.setCoordinate(2, coordinates[6]);
rightGeom.setCoordinate(3, coordinates[2]);
leftGeom.setCoordinate(0, coordinates[4]);
leftGeom.setCoordinate(1, coordinates[0]);
leftGeom.setCoordinate(2, coordinates[3]);
leftGeom.setCoordinate(3, coordinates[7]);
topGeom.setCoordinate(0, coordinates[3]);
topGeom.setCoordinate(1, coordinates[2]);
topGeom.setCoordinate(2, coordinates[6]);
topGeom.setCoordinate(3, coordinates[7]);
bottomGeom.setCoordinate(0, coordinates[4]);
bottomGeom.setCoordinate(1, coordinates[5]);
bottomGeom.setCoordinate(2, coordinates[1]);
bottomGeom.setCoordinate(3, coordinates[0]);
// テクスチャ座標の設定
frontGeom.setTextureCoordinates(0, uv);
backGeom.setTextureCoordinates(0, uv);
rightGeom.setTextureCoordinates(0, uv);
leftGeom.setTextureCoordinates(0, uv);
topGeom.setTextureCoordinates(0, uv);
bottomGeom.setTextureCoordinates(0, uv);
// 法線の設定
float[] frontNorm = new float[]{0.0f, 0.0f, 1.0f};
frontGeom.setNormal(0, frontNorm);
frontGeom.setNormal(1, frontNorm);
frontGeom.setNormal(2, frontNorm);
frontGeom.setNormal(3, frontNorm);
float[] backNorm = new float[]{0.0f, 0.0f, -1.0f};
backGeom.setNormal(0, backNorm);
backGeom.setNormal(1, backNorm);
backGeom.setNormal(2, backNorm);
backGeom.setNormal(3, backNorm);
float[] rightNorm = new float[]{1.0f, 0.0f, 0.0f};
rightGeom.setNormal(0, rightNorm);
rightGeom.setNormal(1, rightNorm);
rightGeom.setNormal(2, rightNorm);
rightGeom.setNormal(3, rightNorm);
float[] leftNorm = new float[]{-1.0f, 0.0f, 0.0f};
leftGeom.setNormal(0, leftNorm);
leftGeom.setNormal(1, leftNorm);
leftGeom.setNormal(2, leftNorm);
leftGeom.setNormal(3, leftNorm);
float[] topNorm = new float[]{0.0f, 1.0f, 0.0f};
topGeom.setNormal(0, topNorm);
topGeom.setNormal(1, topNorm);
topGeom.setNormal(2, topNorm);
topGeom.setNormal(3, topNorm);
float[] bottomNorm = new float[]{0.0f, -1.0f, 0.0f};
bottomGeom.setNormal(0, bottomNorm);
bottomGeom.setNormal(1, bottomNorm);
bottomGeom.setNormal(2, bottomNorm);
bottomGeom.setNormal(3, bottomNorm);
// 表面属性の作成
if (ap == null) {
ap = new Appearance();
}
setAppearance(ap);
Appearance ap1;
Appearance ap2;
Appearance ap3;
Appearance ap4;
Appearance ap5;
Appearance ap6;
Texture tex = ap.getTexture();
if (tex != null && tex instanceof TextureCubeMap) {
// GL10 では GL_TEXTURE_CUBE_MAP が使えないので、TextureCubeMap の場合は Texture2D に分解する
ap1 = (Appearance)ap.cloneNodeComponent();
ap2 = (Appearance)ap.cloneNodeComponent();
ap3 = (Appearance)ap.cloneNodeComponent();
ap4 = (Appearance)ap.cloneNodeComponent();
ap5 = (Appearance)ap.cloneNodeComponent();
ap6 = (Appearance)ap.cloneNodeComponent();
ImageComponent ic1 = tex.getImage(TextureCubeMap.POSITIVE_Z);
Texture2D tex1 = new Texture2D(Texture2D.BASE_LEVEL, Texture2D.RGB, ic1.width, ic1.height);
tex1.setImage(0, ic1);
ap1.setTexture(tex1);
ImageComponent ic2 = tex.getImage(TextureCubeMap.NEGATIVE_Z);
Texture2D tex2 = new Texture2D(Texture2D.BASE_LEVEL, Texture2D.RGB, ic2.width, ic2.height);
tex2.setImage(0, ic2);
ap2.setTexture(tex2);
ImageComponent ic3 = tex.getImage(TextureCubeMap.POSITIVE_X);
Texture2D tex3 = new Texture2D(Texture2D.BASE_LEVEL, Texture2D.RGB, ic3.width, ic3.height);
tex3.setImage(0, ic3);
ap3.setTexture(tex3);
ImageComponent ic4 = tex.getImage(TextureCubeMap.NEGATIVE_X);
Texture2D tex4 = new Texture2D(Texture2D.BASE_LEVEL, Texture2D.RGB, ic4.width, ic4.height);
tex4.setImage(0, ic4);
ap4.setTexture(tex4);
ImageComponent ic5 = tex.getImage(TextureCubeMap.POSITIVE_Y);
Texture2D tex5 = new Texture2D(Texture2D.BASE_LEVEL, Texture2D.RGB, ic5.width, ic5.height);
tex5.setImage(0, ic5);
ap5.setTexture(tex5);
ImageComponent ic6 = tex.getImage(TextureCubeMap.NEGATIVE_Y);
Texture2D tex6 = new Texture2D(Texture2D.BASE_LEVEL, Texture2D.RGB, ic6.width, ic6.height);
tex6.setImage(0, ic6);
ap6.setTexture(tex6);
} else {
ap1 = ap2 = ap3 = ap4 = ap5 = ap6 = ap;
}
// 各面の作成
frontShape = new Shape3D(frontGeom, ap1);
backShape = new Shape3D(backGeom, ap2);
rightShape = new Shape3D(rightGeom, ap3);
leftShape = new Shape3D(leftGeom, ap4);
topShape = new Shape3D(topGeom, ap5);
bottomShape = new Shape3D(bottomGeom, ap6);
xDim = x;
yDim = y;
zDim = z;
}
public double getXdimension() {
return xDim;
}
public double getYdimension() {
return yDim;
}
public double getZdimension() {
return zDim;
}
@Override
public Shape3D getShape(int partid) {
switch (partid) {
case FRONT:
return frontShape;
case BACK:
return backShape;
case RIGHT:
return rightShape;
case LEFT:
return leftShape;
case TOP:
return topShape;
case BOTTOM:
return bottomShape;
}
return null;
}
public Node cloneTree() {
Appearance ap = getAppearance();
if (ap != null) {
ap = (Appearance)ap.cloneNodeComponent();
}
Box b = new Box(xDim, yDim, zDim, ap);
return b;
}
}