Open source Star Ruler 2 source code!

This commit is contained in:
Lucas de Vries
2018-07-17 14:15:37 +02:00
commit cc307720ff
4342 changed files with 2365070 additions and 0 deletions
@@ -0,0 +1,84 @@
#include "anim_node_sync.h"
#include "scene/node.h"
#include "obj/object.h"
#include "empire.h"
#include "main/references.h"
extern double frameLen_s, frameTime_s;
namespace scene {
void NodeSyncAnimator::animate(Node* node) {
Object* obj = node->obj;
if(obj) {
auto* player = Empire::getPlayerEmpire();
bool vis = false;
vis = obj->isVisibleTo(player) && obj->position.distanceToSQ(devices.render->cam_pos) < (node->distanceCutoff * obj->radius * obj->radius);
bool wasVisible = node->visible;
if(!vis && node->getFlag(NF_Memorable) && (node->remembered || obj->isKnownTo(player))) {
vis = true;
node->remembered = true;
}
else if(vis) {
node->remembered = false;
}
if(!vis && !wasVisible && node->getFlag(NF_AnimOnlyVisible)) {
node->visible = false;
return;
}
if(obj->isFocus()) {
//TODO: This should be handled better/centrally
obj->setFlag(objFocus, false);
}
double interpPct = 1.0;
if(vis && wasVisible) {
if(obj->lastTick > node->lastUpdate + 1.0/60.0) {
interpPct = (frameTime_s - node->lastUpdate)/(obj->lastTick - node->lastUpdate);
node->position = node->position.interpolate(obj->position, interpPct);
}
else {
//Interpolate to a predicted position based on physics data
double tDiff = frameTime_s - obj->lastTick;
vec3d predicted = obj->position + (obj->velocity + obj->acceleration * (tDiff * 0.5)) * tDiff;
//node->position = node->position.interpolate(predicted, (frameTime_s - node->lastUpdate) / tDiff);
node->position = predicted;
interpPct = tDiff / (node->lastUpdate - obj->lastTick);
}
}
else {
double tDiff = frameTime_s - obj->lastTick;
node->position = obj->position + (obj->velocity + obj->acceleration * (tDiff * 0.5)) * tDiff;
}
node->lastUpdate = frameTime_s;
node->visible = vis;
//Some updates only need performed for visible objects
if(vis || !node->getFlag(NF_AnimOnlyVisible)) {
if(!node->remembered && !node->getFlag(NF_CustomColor))
if(Empire* owner = obj->owner)
node->color = owner->color;
if(wasVisible)
node->rotation = node->rotation.slerp(obj->rotation, interpPct);
else
node->rotation = obj->rotation;
node->rebuildTransformation();
}
}
}
NodeSyncAnimator syncAnimator;
NodeSyncAnimator* NodeSyncAnimator::getSingleton() {
return &syncAnimator;
}
};