// * This code is licensed under:
// * JHPlot License, Version 1.2
// * - for license details see http://hepforge.cedar.ac.uk/jhepwork/
// *
// * Copyright (c) 2007 by S.Chekanov (chekanov@mail.desy.de).
// * All rights reserved.
// * Statement: This package is rewrite of the Browser3D. It's free. I do not know
// * the author name.
package jhplot.v3d;
// Object3d.java
import java.awt.Color;
import java.awt.Graphics;
import java.io.Serializable;
public class Object3d extends Position implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
String name;
Model3d md;
Vector3d vert[], overt[], norm[], onorm[];
Vector3d center, ocenter;
Face3d face[];
int nvert, cvert, nface, cface;
public Object3d(Model3d md, int nvert, int nface)
{
name = null;
this.md = md;
this.nvert = nvert;
this.nface = nface;
if (nvert <= 4 || nface <= 4)
return;
vert = new Vector3d[nvert];
overt = new Vector3d[nvert];
norm = new Vector3d[nface];
onorm = new Vector3d[nface];
center = new Vector3d();
ocenter = new Vector3d();
face = new Face3d[nface];
cvert = cface = 0;
}
public Object3d(String name, Model3d md, int nvert, int nface)
{
this(md, nvert, nface);
this.name = name;
}
public int addVertex(Vector3d v)
{
return addVertex(v.x, v.y, v.z);
}
public int addVertex(float x, float y, float z)
{
if (cvert >= nvert)
return -1;
vert[cvert] = new Vector3d(x,y,z);
overt[cvert] = new Vector3d(x,y,z);
return cvert++;
}
public int addFace(int nvert, Color c)
{
return addFace(nvert, c.getRed(), c.getGreen(), c.getBlue());
}
public int addFace(int nvert, int red, int green, int blue)
{
if (cface >= nface)
return -1;
face[cface] = new Face3d(this,nvert,red,green,blue);
return cface++;
}
public int addFace(int nvert)
{
int i = addFace(nvert, 0, 0, 0);
face[i].dummy = true;
return i;
}
public void setName(String name)
{
this.name = name;
}
public void setColor(Color c)
{
setColor(c.getRed(), c.getGreen(), c.getBlue());
}
public void setColor(int red, int green, int blue)
{
if (cvert != nvert || cface != nface)
return;
for (int i = 0; i < nface; i++)
face[i].setColor(red, green, blue);
}
void setDummy(boolean dummy)
{
for (int i = 0; i < nface; i++)
face[i].setDummy(dummy);
}
void transformToModelSpace()
{
if (cvert != nvert || cface != nface)
return;
Matrix3d m = new Matrix3d();
m.mul(rot);
m.mul(scale);
m.mul(trans);
m.transform(ocenter,center);
m.transform(overt,vert,nvert);
m.unit();
m.mul(rot);
m.transform(onorm,norm,nface);
}
void transformToCameraSpace()
{
if (cvert != nvert || cface != nface)
return;
Matrix3d m = new Matrix3d();
m.mul(rot);
m.mul(scale);
m.mul(trans);
m.mul(md.rot);
m.mul(md.scale);
m.mul(md.trans);
m.transform(ocenter,center);
m.transform(overt,vert,nvert);
m.unit();
m.mul(rot);
m.mul(md.rot);
m.transform(onorm,norm,nface);
}
void transformToScreenSpace()
{
if (cvert != nvert || cface != nface)
return;
Matrix3d m = new Matrix3d();
m.mul(rot);
m.mul(scale);
m.mul(trans);
m.mul(md.rot);
m.mul(md.scale);
m.mul(md.trans);
m.transform(ocenter,center);
m.mul(md.mat);
m.transform(overt,vert,nvert);
m.unit();
m.mul(rot);
m.mul(md.rot);
m.transform(onorm,norm,nface);
if (md.persp)
{
for (int i = 0; i < nface; i++)
face[i].computeCenter();
float hw = md.width / 2;
float hh = md.height / 2;
float zt = md.zTarget;
for (int i = 0; i < nvert; i++)
{
Vector3d v = vert[i];
if (v.z < 0)
{
float p = zt / v.z;
v.x = hw + v.x * p;
v.y = hh - v.y * p;
}
else
setDummy(true);
}
}
}
void paint(Graphics g)
{
if (cvert != nvert || cface != nface)
return;
for (int i = 0; i < nface; i++)
{
Face3d f = face[i];
if (f.visible())
f.paint(g);
}
}
int inside(int x, int y)
{
if (cvert != nvert || cface != nface)
return -1;
for (int i = 0; i < nface; i++)
{
Face3d f = face[i];
if (f.visible())
if (f.inside(x,y))
return i;
}
return -1;
}
void computeCenter()
{
Vector3d c = ocenter;
c.set(0, 0, 0);
for (int i = 0; i < nvert; i++)
c.add(overt[i]);
c.div(nvert);
}
void colectNormals()
{
if (cvert != nvert || cface != nface)
return;
computeCenter();
for (int i = 0; i < nface; i++)
{
Face3d f = face[i];
Vector3d v = new Vector3d(ocenter);
v.sub(f.vert[0]);
if (v.dot(f.normal) > 0)
f.normal.mul(-1.0f);
onorm[i] = f.normal;
f.normal = norm[i] = new Vector3d();
}
}
}
Ads help maintain this website.