- experiemental code to process interpolation calcs in a background thread
Requires a new setting to be turned on in glest.ini: ThreadedInterpolation=true
This commit is contained in:
parent
13a1630e69
commit
cde5a52fd3
|
@ -142,11 +142,40 @@ void GameCamera::update(){
|
||||||
}
|
}
|
||||||
|
|
||||||
Quad2i GameCamera::computeVisibleQuad() const{
|
Quad2i GameCamera::computeVisibleQuad() const{
|
||||||
|
/*
|
||||||
|
class cacheLookup {
|
||||||
|
public:
|
||||||
|
cacheLookup(float fov,float hAng,Vec3f pos) {
|
||||||
|
this->fov = fov;
|
||||||
|
this->hAng = hAng;
|
||||||
|
this->pos = pos;
|
||||||
|
}
|
||||||
|
std::string getString() const {
|
||||||
|
std::ostringstream streamOut;
|
||||||
|
streamOut << fov << "_" << hAng << "_" << pos.getString();
|
||||||
|
return streamOut.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
float fov;
|
||||||
|
float hAng;
|
||||||
|
Vec3f pos;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
cacheLookup lookup(fov, hAng,pos);
|
||||||
|
string lookupKey = lookup.getString();
|
||||||
|
|
||||||
|
static std::map<string, Quad2i> cacheQuad;
|
||||||
|
if(cacheQuad.find(lookupKey) != cacheQuad.end()) {
|
||||||
|
return cacheQuad[lookupKey];
|
||||||
|
}
|
||||||
|
//
|
||||||
|
*/
|
||||||
|
|
||||||
float nearDist = 20.f;
|
float nearDist = 20.f;
|
||||||
float dist = pos.y > 20.f ? pos.y * 1.2f : 20.f;
|
float dist = pos.y > 20.f ? pos.y * 1.2f : 20.f;
|
||||||
float farDist = 90.f * (pos.y > 20.f ? pos.y / 15.f : 1.f);
|
float farDist = 90.f * (pos.y > 20.f ? pos.y / 15.f : 1.f);
|
||||||
float fov = Config::getInstance().getFloat("CameraFov","45");
|
//float fov = Config::getInstance().getFloat("CameraFov","45");
|
||||||
|
|
||||||
#ifdef USE_STREFLOP
|
#ifdef USE_STREFLOP
|
||||||
Vec2f v(streflop::sinf(degToRad(180 - hAng)), streflop::cosf(degToRad(180 - hAng)));
|
Vec2f v(streflop::sinf(degToRad(180 - hAng)), streflop::cosf(degToRad(180 - hAng)));
|
||||||
|
@ -177,6 +206,10 @@ Quad2i GameCamera::computeVisibleQuad() const{
|
||||||
if (hAng >= 225 && hAng <= 315) {
|
if (hAng >= 225 && hAng <= 315) {
|
||||||
return Quad2i(p2, p4, p1, p3);
|
return Quad2i(p2, p4, p1, p3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cacheQuad[lookupKey] = Quad2i(p4, p3, p2, p1);
|
||||||
|
// return cacheQuad[lookupKey];
|
||||||
|
|
||||||
return Quad2i(p4, p3, p2, p1);
|
return Quad2i(p4, p3, p2, p1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -259,8 +259,12 @@ Renderer::Renderer(){
|
||||||
|
|
||||||
allowRotateUnits = config.getBool("AllowRotateUnits","0");
|
allowRotateUnits = config.getBool("AllowRotateUnits","0");
|
||||||
|
|
||||||
|
interpolateThread = NULL;
|
||||||
|
// Run interpolation calcs in a background thread if enabled
|
||||||
|
if(config.getBool("ThreadedInterpolation","false") == true) {
|
||||||
interpolateThread = new InterpolateTaskThread(this);
|
interpolateThread = new InterpolateTaskThread(this);
|
||||||
interpolateThread->start();
|
interpolateThread->start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer::~Renderer(){
|
Renderer::~Renderer(){
|
||||||
|
@ -1380,7 +1384,7 @@ void Renderer::renderObjects() {
|
||||||
const Vec3f &v= o->getConstPos();
|
const Vec3f &v= o->getConstPos();
|
||||||
|
|
||||||
//ambient and diffuse color is taken from cell color
|
//ambient and diffuse color is taken from cell color
|
||||||
//!!!float fowFactor= fowTex->getPixmap()->getPixelf(pos.x/Map::cellScale, pos.y/Map::cellScale);
|
//float fowFactor= fowTex->getPixmap()->getPixelf(pos.x/Map::cellScale, pos.y/Map::cellScale);
|
||||||
float fowFactor= fowTex->getPixmap()->getPixelf(mapPos.x,mapPos.y);
|
float fowFactor= fowTex->getPixmap()->getPixelf(mapPos.x,mapPos.y);
|
||||||
|
|
||||||
Vec4f color= Vec4f(Vec3f(fowFactor), 1.f);
|
Vec4f color= Vec4f(Vec3f(fowFactor), 1.f);
|
||||||
|
@ -1404,7 +1408,7 @@ void Renderer::renderObjects() {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//renderObject(RenderEntity(o,mapPos),baseFogColor);
|
//renderObject(RenderEntity(o,mapPos),baseFogColor);
|
||||||
vctEntity.push_back(RenderEntity(o,mapPos));
|
vctEntity.push_back(RenderEntity(retObject,o,mapPos,NULL));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1420,7 +1424,16 @@ void Renderer::renderObjects() {
|
||||||
|
|
||||||
void Renderer::interpolateTask(std::vector<RenderEntity> &vctEntity) {
|
void Renderer::interpolateTask(std::vector<RenderEntity> &vctEntity) {
|
||||||
for(int idx=0; idx < vctEntity.size(); ++idx) {
|
for(int idx=0; idx < vctEntity.size(); ++idx) {
|
||||||
prepareObjectForRender(vctEntity[idx]);
|
RenderEntity &entity = vctEntity[idx];
|
||||||
|
if(entity.type == retObject) {
|
||||||
|
prepareObjectForRender(entity);
|
||||||
|
}
|
||||||
|
else if(entity.type == retUnit) {
|
||||||
|
prepareUnitForRender(entity);
|
||||||
|
}
|
||||||
|
else if(entity.type == retUnitFast) {
|
||||||
|
prepareUnitFastForRender(entity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1472,28 +1485,14 @@ void Renderer::renderObjectList(std::vector<RenderEntity> &vctEntity,const Vec3f
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::prepareObjectForRender(RenderEntity &entity) {
|
void Renderer::prepareObjectForRender(RenderEntity &entity) {
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
||||||
|
|
||||||
Object *o = entity.o;
|
Object *o = entity.o;
|
||||||
if(o != NULL) {
|
if(o != NULL) {
|
||||||
|
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
||||||
const Model *objModel= o->getModel();
|
const Model *objModel= o->getModel();
|
||||||
|
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
||||||
|
|
||||||
if(objModel != NULL) {
|
if(objModel != NULL) {
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
||||||
|
|
||||||
objModel->updateInterpolationData(0.f, true);
|
objModel->updateInterpolationData(0.f, true);
|
||||||
|
}
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
}
|
||||||
|
|
||||||
entity.setState(resInterpolated);
|
entity.setState(resInterpolated);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::renderObject(RenderEntity &entity,const Vec3f &baseFogColor) {
|
void Renderer::renderObject(RenderEntity &entity,const Vec3f &baseFogColor) {
|
||||||
|
@ -1662,6 +1661,7 @@ void Renderer::renderWater(){
|
||||||
assertGl();
|
assertGl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//!!!
|
||||||
void Renderer::renderUnits(){
|
void Renderer::renderUnits(){
|
||||||
Unit *unit;
|
Unit *unit;
|
||||||
const World *world= game->getWorld();
|
const World *world= game->getWorld();
|
||||||
|
@ -1684,7 +1684,7 @@ void Renderer::renderUnits(){
|
||||||
}
|
}
|
||||||
glActiveTexture(baseTexUnit);
|
glActiveTexture(baseTexUnit);
|
||||||
|
|
||||||
modelRenderer->begin(true, true, true, &meshCallbackTeamColor);
|
std::vector<RenderEntity> vctEntity;
|
||||||
|
|
||||||
for(int i=0; i<world->getFactionCount(); ++i){
|
for(int i=0; i<world->getFactionCount(); ++i){
|
||||||
meshCallbackTeamColor.setTeamTexture(world->getFaction(i)->getTexture());
|
meshCallbackTeamColor.setTeamTexture(world->getFaction(i)->getTexture());
|
||||||
|
@ -1692,6 +1692,7 @@ void Renderer::renderUnits(){
|
||||||
unit= world->getFaction(i)->getUnit(j);
|
unit= world->getFaction(i)->getUnit(j);
|
||||||
if(world->toRenderUnit(unit, visibleQuad)) {
|
if(world->toRenderUnit(unit, visibleQuad)) {
|
||||||
|
|
||||||
|
/*
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
|
||||||
|
@ -1725,6 +1726,9 @@ void Renderer::renderUnits(){
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
unit->setVisible(true);
|
unit->setVisible(true);
|
||||||
|
*/
|
||||||
|
|
||||||
|
vctEntity.push_back(RenderEntity(retUnit,NULL,Vec2i(),unit));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1732,6 +1736,9 @@ void Renderer::renderUnits(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
modelRenderer->begin(true, true, true, &meshCallbackTeamColor);
|
||||||
|
renderUnitList(vctEntity);
|
||||||
modelRenderer->end();
|
modelRenderer->end();
|
||||||
|
|
||||||
//restore
|
//restore
|
||||||
|
@ -1742,6 +1749,102 @@ void Renderer::renderUnits(){
|
||||||
assertGl();
|
assertGl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Renderer::renderUnitList(std::vector<RenderEntity> &vctEntity) {
|
||||||
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] vctEntity.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,vctEntity.size());
|
||||||
|
|
||||||
|
// Run interpolation threaded if the thread is created
|
||||||
|
if(interpolateThread != NULL) {
|
||||||
|
interpolateThread->setTaskSignalled(&vctEntity);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
interpolateTask(vctEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] vctEntity.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,vctEntity.size());
|
||||||
|
|
||||||
|
std::map<int,bool> entityPendingLookup;
|
||||||
|
|
||||||
|
int renderedUnitCount = 0;
|
||||||
|
for(bool done = false; done == false;) {
|
||||||
|
done = true;
|
||||||
|
for(int idx=0; idx < vctEntity.size(); ++idx) {
|
||||||
|
// already done, don't waste time
|
||||||
|
if(entityPendingLookup[idx] == true) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
RenderEntity &entity = vctEntity[idx];
|
||||||
|
if(entity.getState() == resInterpolated) {
|
||||||
|
done = false;
|
||||||
|
|
||||||
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] idx = %d\n",__FILE__,__FUNCTION__,__LINE__,idx);
|
||||||
|
|
||||||
|
renderUnit(entity);
|
||||||
|
entityPendingLookup[idx] = true;
|
||||||
|
renderedUnitCount++;
|
||||||
|
|
||||||
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] idx = %d renderedObjectCount = %d\n",__FILE__,__FUNCTION__,__LINE__,idx,renderedObjectCount);
|
||||||
|
}
|
||||||
|
else if(entity.getState() == resNone) {
|
||||||
|
done = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(done == false) {
|
||||||
|
sleep(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] vctEntity.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,vctEntity.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Renderer::renderUnit(RenderEntity &entity) {
|
||||||
|
Unit *unit = entity.unit;
|
||||||
|
if(unit != NULL) {
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
//translate
|
||||||
|
Vec3f currVec= unit->getCurrVectorFlat();
|
||||||
|
glTranslatef(currVec.x, currVec.y, currVec.z);
|
||||||
|
|
||||||
|
//rotate
|
||||||
|
glRotatef(unit->getRotation(), 0.f, 1.f, 0.f);
|
||||||
|
glRotatef(unit->getVerticalRotation(), 1.f, 0.f, 0.f);
|
||||||
|
|
||||||
|
//dead alpha
|
||||||
|
float alpha= 1.0f;
|
||||||
|
const SkillType *st= unit->getCurrSkill();
|
||||||
|
if(st->getClass()==scDie && static_cast<const DieSkillType*>(st)->getFade()){
|
||||||
|
alpha= 1.0f-unit->getAnimProgress();
|
||||||
|
glDisable(GL_COLOR_MATERIAL);
|
||||||
|
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Vec4f(1.0f, 1.0f, 1.0f, alpha).ptr());
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
glEnable(GL_COLOR_MATERIAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
//render
|
||||||
|
const Model *model= unit->getCurrentModel();
|
||||||
|
//model->updateInterpolationData(unit->getAnimProgress(), unit->isAlive());
|
||||||
|
|
||||||
|
modelRenderer->render(model);
|
||||||
|
triangleCount+= model->getTriangleCount();
|
||||||
|
pointCount+= model->getVertexCount();
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
unit->setVisible(true);
|
||||||
|
|
||||||
|
entity.setState(resRendered);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Renderer::prepareUnitForRender(RenderEntity &entity) {
|
||||||
|
if(entity.unit != NULL) {
|
||||||
|
const Model *model= entity.unit->getCurrentModel();
|
||||||
|
model->updateInterpolationData(entity.unit->getAnimProgress(), entity.unit->isAlive());
|
||||||
|
}
|
||||||
|
entity.setState(resInterpolated);
|
||||||
|
}
|
||||||
|
|
||||||
void Renderer::renderSelectionEffects(){
|
void Renderer::renderSelectionEffects(){
|
||||||
|
|
||||||
const World *world= game->getWorld();
|
const World *world= game->getWorld();
|
||||||
|
@ -2732,14 +2835,17 @@ void Renderer::renderUnitsFast(){
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
glDisable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
|
|
||||||
modelRenderer->begin(false, false, false);
|
std::vector<RenderEntity> vctEntity;
|
||||||
glInitNames();
|
|
||||||
|
// modelRenderer->begin(false, false, false);
|
||||||
|
// glInitNames();
|
||||||
for(int i=0; i<world->getFactionCount(); ++i){
|
for(int i=0; i<world->getFactionCount(); ++i){
|
||||||
glPushName(i);
|
// glPushName(i);
|
||||||
for(int j=0; j<world->getFaction(i)->getUnitCount(); ++j){
|
for(int j=0; j<world->getFaction(i)->getUnitCount(); ++j){
|
||||||
glPushName(j);
|
// glPushName(j);
|
||||||
Unit *unit= world->getFaction(i)->getUnit(j);
|
Unit *unit= world->getFaction(i)->getUnit(j);
|
||||||
if(world->toRenderUnit(unit, visibleQuad)) {
|
if(world->toRenderUnit(unit, visibleQuad)) {
|
||||||
|
/*
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
|
||||||
//debuxar modelo
|
//debuxar modelo
|
||||||
|
@ -2758,17 +2864,110 @@ void Renderer::renderUnitsFast(){
|
||||||
modelRenderer->render(model);
|
modelRenderer->render(model);
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
*/
|
||||||
|
vctEntity.push_back(RenderEntity(retUnitFast,NULL,Vec2i(i,j),unit));
|
||||||
|
|
||||||
}
|
}
|
||||||
glPopName();
|
//glPopName();
|
||||||
}
|
}
|
||||||
glPopName();
|
// glPopName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
modelRenderer->begin(false, false, false);
|
||||||
|
renderUnitFastList(vctEntity);
|
||||||
modelRenderer->end();
|
modelRenderer->end();
|
||||||
|
|
||||||
glPopAttrib();
|
glPopAttrib();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Renderer::renderUnitFastList(std::vector<RenderEntity> &vctEntity) {
|
||||||
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] vctEntity.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,vctEntity.size());
|
||||||
|
|
||||||
|
// Run interpolation threaded if the thread is created
|
||||||
|
if(interpolateThread != NULL) {
|
||||||
|
interpolateThread->setTaskSignalled(&vctEntity);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
interpolateTask(vctEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] vctEntity.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,vctEntity.size());
|
||||||
|
|
||||||
|
std::map<int,bool> entityPendingLookup;
|
||||||
|
|
||||||
|
glInitNames();
|
||||||
|
|
||||||
|
int renderedUnitCount = 0;
|
||||||
|
for(bool done = false; done == false;) {
|
||||||
|
done = true;
|
||||||
|
for(int idx=0; idx < vctEntity.size(); ++idx) {
|
||||||
|
// already done, don't waste time
|
||||||
|
if(entityPendingLookup[idx] == true) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
RenderEntity &entity = vctEntity[idx];
|
||||||
|
if(entity.getState() == resInterpolated) {
|
||||||
|
done = false;
|
||||||
|
|
||||||
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] idx = %d\n",__FILE__,__FUNCTION__,__LINE__,idx);
|
||||||
|
|
||||||
|
renderUnitFast(entity);
|
||||||
|
entityPendingLookup[idx] = true;
|
||||||
|
renderedUnitCount++;
|
||||||
|
|
||||||
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] idx = %d renderedObjectCount = %d\n",__FILE__,__FUNCTION__,__LINE__,idx,renderedObjectCount);
|
||||||
|
}
|
||||||
|
else if(entity.getState() == resNone) {
|
||||||
|
done = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(done == false) {
|
||||||
|
sleep(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] vctEntity.size() = %d\n",__FILE__,__FUNCTION__,__LINE__,vctEntity.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Renderer::renderUnitFast(RenderEntity &entity) {
|
||||||
|
Unit *unit = entity.unit;
|
||||||
|
if(unit != NULL) {
|
||||||
|
glPushName(entity.mapPos.x);
|
||||||
|
glPushName(entity.mapPos.y);
|
||||||
|
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
|
||||||
|
//debuxar modelo
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
//translate
|
||||||
|
Vec3f currVec= unit->getCurrVectorFlat();
|
||||||
|
glTranslatef(currVec.x, currVec.y, currVec.z);
|
||||||
|
|
||||||
|
//rotate
|
||||||
|
glRotatef(unit->getRotation(), 0.f, 1.f, 0.f);
|
||||||
|
|
||||||
|
//render
|
||||||
|
const Model *model= unit->getCurrentModel();
|
||||||
|
//model->updateInterpolationVertices(unit->getAnimProgress(), unit->isAlive());
|
||||||
|
modelRenderer->render(model);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
glPopName();
|
||||||
|
glPopName();
|
||||||
|
|
||||||
|
entity.setState(resRendered);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Renderer::prepareUnitFastForRender(RenderEntity &entity) {
|
||||||
|
if(entity.unit != NULL) {
|
||||||
|
const Model *model= entity.unit->getCurrentModel();
|
||||||
|
model->updateInterpolationVertices(entity.unit->getAnimProgress(), entity.unit->isAlive());
|
||||||
|
}
|
||||||
|
entity.setState(resInterpolated);
|
||||||
|
}
|
||||||
|
|
||||||
//render objects for selection purposes
|
//render objects for selection purposes
|
||||||
void Renderer::renderObjectsFast(){
|
void Renderer::renderObjectsFast(){
|
||||||
const World *world= game->getWorld();
|
const World *world= game->getWorld();
|
||||||
|
@ -2796,13 +2995,14 @@ void Renderer::renderObjectsFast(){
|
||||||
modelRenderer->begin(false, true, false);
|
modelRenderer->begin(false, true, false);
|
||||||
int thisTeamIndex= world->getThisTeamIndex();
|
int thisTeamIndex= world->getThisTeamIndex();
|
||||||
|
|
||||||
|
// std::vector<RenderEntity> vctEntity;
|
||||||
|
|
||||||
PosQuadIterator pqi(map, visibleQuad, Map::cellScale);
|
PosQuadIterator pqi(map, visibleQuad, Map::cellScale);
|
||||||
while(pqi.next()){
|
while(pqi.next()){
|
||||||
const Vec2i pos= pqi.getPos();
|
const Vec2i &pos= pqi.getPos();
|
||||||
|
|
||||||
if(map->isInside(pos)){
|
if(map->isInside(pos)){
|
||||||
|
Vec2i mapPos = Map::toSurfCoords(pos);
|
||||||
SurfaceCell *sc= map->getSurfaceCell(Map::toSurfCoords(pos));
|
SurfaceCell *sc= map->getSurfaceCell(mapPos);
|
||||||
Object *o= sc->getObject();
|
Object *o= sc->getObject();
|
||||||
if(sc->isExplored(thisTeamIndex) && o!=NULL){
|
if(sc->isExplored(thisTeamIndex) && o!=NULL){
|
||||||
|
|
||||||
|
@ -2818,10 +3018,13 @@ void Renderer::renderObjectsFast(){
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
|
// vctEntity.push_back(RenderEntity(o,mapPos));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// modelRenderer->begin(false, true, false);
|
||||||
|
// renderObjectFastList(vctEntity);
|
||||||
modelRenderer->end();
|
modelRenderer->end();
|
||||||
|
|
||||||
glPopAttrib();
|
glPopAttrib();
|
||||||
|
@ -2829,6 +3032,24 @@ void Renderer::renderObjectsFast(){
|
||||||
assertGl();
|
assertGl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Renderer::renderObjectFastList(std::vector<RenderEntity> &vctEntity) {
|
||||||
|
for(int idx=0; idx < vctEntity.size(); ++idx) {
|
||||||
|
RenderEntity &entity = vctEntity[idx];
|
||||||
|
|
||||||
|
const Model *objModel= entity.o->getModel();
|
||||||
|
Vec3f v= entity.o->getPos();
|
||||||
|
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(v.x, v.y, v.z);
|
||||||
|
glRotatef(entity.o->getRotation(), 0.f, 1.f, 0.f);
|
||||||
|
|
||||||
|
modelRenderer->render(objModel);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ==================== gl caps ====================
|
// ==================== gl caps ====================
|
||||||
|
|
||||||
void Renderer::checkGlCaps(){
|
void Renderer::checkGlCaps(){
|
||||||
|
|
|
@ -83,6 +83,12 @@ enum RenderEntityState {
|
||||||
resRendered
|
resRendered
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum RenderEntityType {
|
||||||
|
retObject,
|
||||||
|
retUnit,
|
||||||
|
retUnitFast
|
||||||
|
};
|
||||||
|
|
||||||
class RenderEntity {
|
class RenderEntity {
|
||||||
protected:
|
protected:
|
||||||
Mutex mutex;
|
Mutex mutex;
|
||||||
|
@ -91,20 +97,26 @@ protected:
|
||||||
void CopyAll(const RenderEntity &obj) {
|
void CopyAll(const RenderEntity &obj) {
|
||||||
// Mutex doesn't like being copied.. DON'T do it
|
// Mutex doesn't like being copied.. DON'T do it
|
||||||
// Mutex mutex;
|
// Mutex mutex;
|
||||||
|
this->type = obj.type;
|
||||||
this->state = obj.state;
|
this->state = obj.state;
|
||||||
this->o = obj.o;
|
this->o = obj.o;
|
||||||
this->mapPos = obj.mapPos;
|
this->mapPos = obj.mapPos;
|
||||||
|
this->unit = obj.unit;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
RenderEntity() {
|
RenderEntity() {
|
||||||
|
this->type = retObject;
|
||||||
this->o = NULL;
|
this->o = NULL;
|
||||||
|
this->unit = NULL;
|
||||||
setState(resNone);
|
setState(resNone);
|
||||||
}
|
}
|
||||||
RenderEntity(Object *o, Vec2i &mapPos) {
|
RenderEntity(RenderEntityType type,Object *o, Vec2i mapPos, Unit *unit) {
|
||||||
|
this->type = type;
|
||||||
this->o = o;
|
this->o = o;
|
||||||
this->mapPos = mapPos;
|
this->mapPos = mapPos;
|
||||||
|
this->unit = unit;
|
||||||
setState(resNone);
|
setState(resNone);
|
||||||
}
|
}
|
||||||
RenderEntity(const RenderEntity &obj) {
|
RenderEntity(const RenderEntity &obj) {
|
||||||
|
@ -115,8 +127,10 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RenderEntityType type;
|
||||||
Object *o;
|
Object *o;
|
||||||
Vec2i mapPos;
|
Vec2i mapPos;
|
||||||
|
Unit *unit;
|
||||||
|
|
||||||
RenderEntityState getState() {
|
RenderEntityState getState() {
|
||||||
RenderEntityState result;
|
RenderEntityState result;
|
||||||
|
@ -131,7 +145,6 @@ public:
|
||||||
this->state = value;
|
this->state = value;
|
||||||
mutex.v();
|
mutex.v();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -345,6 +358,10 @@ public:
|
||||||
|
|
||||||
void renderWater();
|
void renderWater();
|
||||||
void renderUnits();
|
void renderUnits();
|
||||||
|
void prepareUnitForRender(RenderEntity &entity);
|
||||||
|
void renderUnitList(std::vector<RenderEntity> &vctEntity);
|
||||||
|
void renderUnit(RenderEntity &entity);
|
||||||
|
|
||||||
void renderSelectionEffects();
|
void renderSelectionEffects();
|
||||||
void renderWaterEffects();
|
void renderWaterEffects();
|
||||||
void renderMinimap();
|
void renderMinimap();
|
||||||
|
@ -390,7 +407,11 @@ private:
|
||||||
|
|
||||||
//selection render
|
//selection render
|
||||||
void renderObjectsFast();
|
void renderObjectsFast();
|
||||||
|
void renderObjectFastList(std::vector<RenderEntity> &vctEntity);
|
||||||
void renderUnitsFast();
|
void renderUnitsFast();
|
||||||
|
void renderUnitFastList(std::vector<RenderEntity> &vctEntity);
|
||||||
|
void renderUnitFast(RenderEntity &entity);
|
||||||
|
void prepareUnitFastForRender(RenderEntity &entity);
|
||||||
|
|
||||||
//gl requirements
|
//gl requirements
|
||||||
void checkGlCaps();
|
void checkGlCaps();
|
||||||
|
|
|
@ -139,7 +139,7 @@ public:
|
||||||
y/= m;
|
y/= m;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string getString() {
|
std::string getString() const {
|
||||||
std::ostringstream streamOut;
|
std::ostringstream streamOut;
|
||||||
streamOut << "x [" << x << "] y [" << y << "]";
|
streamOut << "x [" << x << "] y [" << y << "]";
|
||||||
return streamOut.str();
|
return streamOut.str();
|
||||||
|
@ -313,7 +313,7 @@ public:
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string getString() {
|
std::string getString() const {
|
||||||
std::ostringstream streamOut;
|
std::ostringstream streamOut;
|
||||||
streamOut << "x [" << x << "] y [" << y << "] z [" << z << "]";
|
streamOut << "x [" << x << "] y [" << y << "] z [" << z << "]";
|
||||||
return streamOut.str();
|
return streamOut.str();
|
||||||
|
@ -453,7 +453,7 @@ public:
|
||||||
return x*v.x + y*v.y + z*v.z + w*v.w;
|
return x*v.x + y*v.y + z*v.z + w*v.w;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string getString() {
|
std::string getString() const {
|
||||||
std::ostringstream streamOut;
|
std::ostringstream streamOut;
|
||||||
streamOut << "x [" << x << "] y [" << y << "] z [" << z << "] w [" << w << "]";
|
streamOut << "x [" << x << "] y [" << y << "] z [" << z << "] w [" << w << "]";
|
||||||
return streamOut.str();
|
return streamOut.str();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user