86 lines
1.7 KiB
ActionScript 3
86 lines
1.7 KiB
ActionScript 3
class PersistentGfxScript {
|
|
Object@ obj;
|
|
ParticleSystemNode@ gfx;
|
|
Region@ prevParent;
|
|
bool objRotate = false;
|
|
|
|
PersistentGfxScript(Node& node) {
|
|
node.visible = false;
|
|
}
|
|
|
|
~PersistentGfxScript() {
|
|
if(gfx !is null) {
|
|
gfx.stop();
|
|
@gfx = null;
|
|
}
|
|
}
|
|
|
|
void stop(Node& node) {
|
|
if(gfx !is null) {
|
|
gfx.stop();
|
|
@gfx = null;
|
|
}
|
|
|
|
@obj = null;
|
|
@prevParent = null;
|
|
node.markForDeletion();
|
|
}
|
|
|
|
void establish(Node& node, Object@ Obj, string psName, double scale) {
|
|
@obj = Obj;
|
|
@gfx = playParticleSystem(psName, obj.position, obj.radius * scale);
|
|
@prevParent = obj.region;
|
|
gfx.hintParentObject(prevParent, false);
|
|
node.visible = obj !is null;
|
|
gfx.visible = obj.visible || obj.known;
|
|
}
|
|
|
|
void establish(Node& node, vec3d at, string psName, double scale, Object@ parent) {
|
|
@gfx = playParticleSystem(psName, at, scale);
|
|
gfx.hintParentObject(parent, false);
|
|
node.visible = true;
|
|
}
|
|
|
|
void rotate(quaterniond rot) {
|
|
if(gfx !is null)
|
|
gfx.emitRot = rot;
|
|
}
|
|
|
|
void setObjectRotation(bool value) {
|
|
objRotate = value;
|
|
}
|
|
|
|
bool preRender(Node& node) {
|
|
if(gfx is null)
|
|
return false;
|
|
|
|
if(obj !is null) {
|
|
if(!obj.valid) {
|
|
stop(node);
|
|
return false;
|
|
}
|
|
|
|
if(obj.region !is prevParent) {
|
|
@prevParent = obj.region;
|
|
gfx.hintParentObject(prevParent, false);
|
|
}
|
|
|
|
//TODO: Make less awful
|
|
bool visible = obj.visible || obj.known;
|
|
gfx.visible = visible;
|
|
|
|
gfx.position = obj.position;
|
|
if(objRotate)
|
|
gfx.emitRot = obj.rotation;
|
|
gfx.rebuildTransform();
|
|
|
|
gfx.velocity = obj.velocity;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//We don't actually need to render anything ourselves, we just manage a particle effect
|
|
//void render(Node& node) {
|
|
//}
|
|
};
|