diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index dc971706..658f7928 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -143,6 +143,8 @@ const float Renderer::maxLightDist= 1000.f; const int MIN_FPS_NORMAL_RENDERING = 15; const int MIN_FPS_NORMAL_RENDERING_TOP_THRESHOLD = 25; +const int OBJECT_SELECT_OFFSET=100000000; + // ==================== constructor and destructor ==================== Renderer::Renderer() { @@ -3420,7 +3422,7 @@ Vec3f Renderer::computeScreenPosition(const Vec3f &worldPos) { return screenPos; } -void Renderer::computeSelected( Selection::UnitContainer &units, +void Renderer::computeSelected( Selection::UnitContainer &units, const Object *&obj, const bool withObjectSelection, const Vec2i &posDown, const Vec2i &posUp) { //declarations @@ -3448,6 +3450,9 @@ void Renderer::computeSelected( Selection::UnitContainer &units, //render units to find which ones should be selected renderUnitsFast(); + if(withObjectSelection){ + renderObjectsFast(false,true); + } //pop matrices glMatrixMode(GL_PROJECTION); @@ -3458,10 +3463,23 @@ void Renderer::computeSelected( Selection::UnitContainer &units, if(selCount > 0) { VisibleQuadContainerCache &qCache = getQuadCache(); for(int i=1; i <= selCount; ++i) { - int visibleUnitIndex= selectBuffer[i*4-1]; - Unit *unit = qCache.visibleQuadUnitList[visibleUnitIndex]; - if(unit != NULL && unit->isAlive()) { - units.push_back(unit); + int index= selectBuffer[i*4-1]; + if(index>=OBJECT_SELECT_OFFSET) + { + Object *object = qCache.visibleObjectList[index-OBJECT_SELECT_OFFSET]; + if(object != NULL && object) { + obj=object; + if(withObjectSelection) { + break; + } + } + } + else + { + Unit *unit = qCache.visibleQuadUnitList[index]; + if(unit != NULL && unit->isAlive()) { + units.push_back(unit); + } } } } @@ -3560,7 +3578,7 @@ void Renderer::renderShadowsToTexture(const int renderFps){ //render 3d renderUnitsFast(true); - renderObjectsFast(); + renderObjectsFast(true,false); //read color buffer glBindTexture(GL_TEXTURE_2D, shadowMapHandle); @@ -3956,7 +3974,7 @@ void Renderer::renderUnitsFast(bool renderingShadows) { } //render objects for selection purposes -void Renderer::renderObjectsFast() { +void Renderer::renderObjectsFast(bool renderingShadows, bool resourceOnly) { const World *world= game->getWorld(); const Map *map= world->getMap(); @@ -3970,39 +3988,49 @@ void Renderer::renderObjectsFast() { visibleIndex < qCache.visibleObjectList.size(); ++visibleIndex) { Object *o = qCache.visibleObjectList[visibleIndex]; - Model *objModel= o->getModelPtr(); - const Vec3f &v= o->getConstPos(); if(modelRenderStarted == false) { modelRenderStarted = true; - glPushAttrib(GL_ENABLE_BIT| GL_TEXTURE_BIT); + glDisable(GL_LIGHTING); - glAlphaFunc(GL_GREATER, 0.5f); + if (renderingShadows == false){ + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_TEXTURE_2D); + } + else { + glPushAttrib(GL_ENABLE_BIT| GL_TEXTURE_BIT); + glAlphaFunc(GL_GREATER, 0.5f); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - //set color to the texture alpha - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); + //set color to the texture alpha + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); - //set alpha to the texture alpha - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); - - modelRenderer->begin(false, true, false); + //set alpha to the texture alpha + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); + } + modelRenderer->begin(false, renderingShadows, false); + glInitNames(); } - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glTranslatef(v.x, v.y, v.z); - glRotatef(o->getRotation(), 0.f, 1.f, 0.f); + if(!resourceOnly || o->getResource()!= NULL){ + Model *objModel= o->getModelPtr(); + const Vec3f &v= o->getConstPos(); + glPushName(OBJECT_SELECT_OFFSET+visibleIndex); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(v.x, v.y, v.z); + glRotatef(o->getRotation(), 0.f, 1.f, 0.f); - modelRenderer->render(objModel); - - glPopMatrix(); + modelRenderer->render(objModel); + glPopMatrix(); + glPopName(); + } } if(modelRenderStarted == true) { diff --git a/source/glest_game/graphics/renderer.h b/source/glest_game/graphics/renderer.h index 6904f5bc..91a26200 100644 --- a/source/glest_game/graphics/renderer.h +++ b/source/glest_game/graphics/renderer.h @@ -380,7 +380,7 @@ public: //computing bool computePosition(const Vec2i &screenPos, Vec2i &worldPos); - void computeSelected(Selection::UnitContainer &units, const Vec2i &posDown, const Vec2i &posUp); + void computeSelected(Selection::UnitContainer &units, const Object *&obj, const bool withObjectSelection, const Vec2i &posDown, const Vec2i &posUp); //gl wrap string getGlInfo(); @@ -451,7 +451,7 @@ private: void checkExtension(const string &extension, const string &msg); //selection render - void renderObjectsFast(); + void renderObjectsFast(bool renderingShadows = false, bool resourceOnly = false); void renderUnitsFast(bool renderingShadows = false); //gl requirements diff --git a/source/glest_game/gui/gui.cpp b/source/glest_game/gui/gui.cpp index 43e52b95..f8fbf4b0 100644 --- a/source/glest_game/gui/gui.cpp +++ b/source/glest_game/gui/gui.cpp @@ -907,11 +907,12 @@ void Gui::computeSelected(bool doubleClick, bool force){ if( force || ( lastQuadCalcFrame+selectionCalculationFrameSkip < game->getTotalRenderFps() ) ){ lastQuadCalcFrame=game->getTotalRenderFps(); + const Object* obj=NULL; if(selectionQuad.isEnabled() && selectionQuad.getPosUp().dist(selectionQuad.getPosDown())getPos(); return true; } + else if(obj!=NULL) { + targetUnit= NULL; + targetPos= obj->getMapPos(); + return true; + } else { targetUnit= NULL; if(renderer.computePosition(screenPos, targetPos)) {