/*
* This file is part of the Haven & Hearth game client.
* Copyright (C) 2009 Fredrik Tolf <fredrik@dolda2000.com>, and
* Björn Johannessen <johannessen.bjorn@gmail.com>
*
* Redistribution and/or modification of this file is subject to the
* terms of the GNU Lesser General Public License, version 3, as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Other parts of this source tree adhere to other copying
* rights. Please see the file `COPYING' in the root directory of the
* source tree for details.
*
* A copy the GNU Lesser General Public License is distributed along
* with the source tree of which this file is a part in the file
* `doc/LPGL-3'. If it is missing for any reason, please see the Free
* Software Foundation's website at <http://www.fsf.org/>, or write
* to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA
*/
package haven;
public class Following extends Moving {
long tgt;
double lastv = 0.0;
Indir<Resource> xfres;
String xfname;
GLState xf = null, lpxf = null;
Gob lxfb = null;
Skeleton.Pose lpose = null;
public Following(Gob gob, long tgt, Indir<Resource> xfres, String xfname) {
super(gob);
this.tgt = tgt;
this.xfres = xfres;
this.xfname = xfname;
}
public Coord3f getc() {
Gob tgt = gob.glob.oc.getgob(this.tgt);
if(tgt == null)
return(gob.getrc());
return(tgt.getc());
}
public double getv() {
Gob tgt = gob.glob.oc.getgob(this.tgt);
if(tgt != null) {
Moving mv = tgt.getattr(Moving.class);
if(mv == null)
lastv = 0.0;
else
lastv = mv.getv();
}
return(lastv);
}
public Gob tgt() {
return(gob.glob.oc.getgob(this.tgt));
}
private Skeleton.Pose getpose(Gob tgt) {
if(tgt == null)
return(null);
return(tgt.getattr(Drawable.class).getpose());
}
public GLState xf() {
synchronized(this) {
Gob tgt = tgt();
Skeleton.Pose cpose = getpose(tgt);
GLState pxf = xf(tgt);
if((xf == null) || (cpose != lpose) || (lpxf != pxf)) {
if(tgt == null) {
xf = null;
lpose = null;
lxfb = null;
lpxf = null;
return(null);
}
Skeleton.BoneOffset bo = xfres.get().layer(Skeleton.BoneOffset.class, xfname);
if(bo == null)
throw(new RuntimeException("No such boneoffset in " + xfres.get() + ": " + xfname));
if(pxf != null)
xf = GLState.compose(pxf, bo.forpose(cpose));
else
xf = GLState.compose(tgt.loc, bo.forpose(cpose));
lpxf = pxf;
lxfb = tgt;
lpose = cpose;
}
}
return(xf);
}
public static GLState xf(Gob gob) {
if(gob == null)
return(null);
Following flw = gob.getattr(Following.class);
if(flw == null)
return(null);
return(flw.xf());
}
}