SourceForge: osrpgcreation/osrpgcreation: changeset 64:65adda9a59f3
smth wrong with LF. the tile 4 at the right cannot change its material color
authorkornerr
Sun Nov 01 10:12:35 2009 +0700 (3 weeks ago)
changeset 6465adda9a59f3
parent 63014721b97109
child 658447a7d394dc
smth wrong with LF. the tile 4 at the right cannot change its material color
include/lf/mj/Core.h
include/lf/mj/TileType.h
res/ti/tile.ti
src/lf/mj/Core.cpp
src/lf/mj/TileType.cpp
     1.1 --- a/include/lf/mj/Core.h	Sat Oct 31 23:36:13 2009 +0700
     1.2 +++ b/include/lf/mj/Core.h	Sun Nov 01 10:12:35 2009 +0700
     1.3 @@ -31,7 +31,7 @@
     1.4          scene::C3DCamera *mCam;
     1.5          scene::CSceneNodeController *mCamCtrl;
     1.6          s8 mCtrlType;
     1.7 -        scene::CSceneNode *mSelectedNode;
     1.8 +        TileType *mSelectedTile;
     1.9          u32 mFPS;
    1.10          u32 mPolys;
    1.11          std::vector<core::stringc> mTexs;
     2.1 --- a/include/lf/mj/TileType.h	Sat Oct 31 23:36:13 2009 +0700
     2.2 +++ b/include/lf/mj/TileType.h	Sun Nov 01 10:12:35 2009 +0700
     2.3 @@ -50,7 +50,7 @@
     2.4              return mVisibility;
     2.5          }
     2.6          // Must be references
     2.7 -        virtual void setGroup(const u32 &group);
     2.8 +        virtual void setGroup(const u32 group);
     2.9          void setID(const u32 &id);
    2.10          virtual void setTex(const core::stringc &mat);
    2.11          virtual void setMesh(const core::stringc &mesh);
    2.12 @@ -58,7 +58,7 @@
    2.13          virtual void setRot(const core::vector3df &rot);
    2.14          virtual void setScale(const core::vector3df &scale);
    2.15          virtual void setSelectability(const bool &selectability);
    2.16 -        virtual void setSelected(const bool &selected);
    2.17 +        virtual void setSelected(const bool selected);
    2.18          virtual void setVisibility(const bool &visibility);
    2.19  
    2.20      protected:
     3.1 --- a/res/ti/tile.ti	Sat Oct 31 23:36:13 2009 +0700
     3.2 +++ b/res/ti/tile.ti	Sun Nov 01 10:12:35 2009 +0700
     3.3 @@ -4,16 +4,6 @@
     3.4  [/class]
     3.5  
     3.6  [field]
     3.7 -name = Group
     3.8 -type = u32
     3.9 -[/field]
    3.10 -
    3.11 -[field]
    3.12 -name = Tex
    3.13 -type = core::stringc
    3.14 -[/field]
    3.15 -
    3.16 -[field]
    3.17  name = Mesh
    3.18  type = core::stringc
    3.19  [/field]
    3.20 @@ -28,13 +18,3 @@
    3.21  type = core::vector3df
    3.22  [/field]
    3.23  
    3.24 -[field]
    3.25 -name = Selectability
    3.26 -type = bool
    3.27 -[/field]
    3.28 -
    3.29 -[field]
    3.30 -name = Visibility
    3.31 -type = bool
    3.32 -[/field]
    3.33 -
     4.1 --- a/src/lf/mj/Core.cpp	Sat Oct 31 23:36:13 2009 +0700
     4.2 +++ b/src/lf/mj/Core.cpp	Sun Nov 01 10:12:35 2009 +0700
     4.3 @@ -8,7 +8,7 @@
     4.4  
     4.5  Core::Core() :
     4.6          mWin(0), mRMgr(0), mScn(0), mCam(0),
     4.7 -        mSelectedNode(0),
     4.8 +        mSelectedTile(0),
     4.9          mFPS(0), mPolys(0) {
    4.10      mWin = CLFRender::getInstance().createRenderWindow(
    4.11          core::vector2di(0, 0),
    4.12 @@ -67,25 +67,33 @@
    4.13  }
    4.14  
    4.15  bool Core::canSelect(const TileType *tile) const {
    4.16 -    core::vector3di pos = tile->getPos();
    4.17 +    const core::vector3di pos = tile->getPos();
    4.18      u8 adjTilesNb = 0;
    4.19      for (TIt it = mTiles.begin(); it != mTiles.end(); it++)
    4.20 -        if (*it != tile) {
    4.21 -            core::vector3di posNew = (*it)->getPos();
    4.22 +        // It must not be us and must be visible.
    4.23 +        if (*it != tile && (*it)->getVisibility()) {
    4.24 +            const core::vector3di posNew = (*it)->getPos();
    4.25              // Find out if this tile is above us.
    4.26              if (posNew.Y - pos.Y == 1 &&
    4.27                  fabs(posNew.X - pos.X) <= 1 &&
    4.28 -                fabs(posNew.Z - pos.Z) <= 1)
    4.29 +                fabs(posNew.Z - pos.Z) <= 1) {
    4.30 +                std::cout << "above\n";
    4.31                  return false;
    4.32 -            // Find out if this tile is adjacent to our side;
    4.33 +            }
    4.34 +            // Find out if this tile is adjacent to our side.
    4.35              if (posNew.Y == pos.Y &&
    4.36                  fabs(posNew.Z - pos.Z) <= 1 &&
    4.37 -                fabs(posNew.X - pos.X) == 2)
    4.38 +                fabs(posNew.X - pos.X) == 2) {
    4.39                  adjTilesNb++;
    4.40 +                std::cout << "adj side\n";
    4.41 +            }
    4.42              // We are between two tiles.
    4.43 -            if (adjTilesNb == 2)
    4.44 +            if (adjTilesNb == 2) {
    4.45 +                std::cout << "2 adj sides\n";
    4.46                  return false;
    4.47 +            }
    4.48          }
    4.49 +    std::cout << "return true\n";
    4.50      return true;
    4.51  }
    4.52  
    4.53 @@ -136,11 +144,14 @@
    4.54  }
    4.55  
    4.56  void Core::mousePressed(input::CMouseEvent &e) {
    4.57 -    if (e.getButton() != 1)
    4.58 +    std::cout << "mouse pressed\n";
    4.59 +    if (e.getButton() != 1) {
    4.60 +        std::cout << "not button1\n";
    4.61          return;
    4.62 +    }
    4.63      // Deselect.
    4.64 -    if (mSelectedNode && mHNT.find(mSelectedNode) != mHNT.end())
    4.65 -        mHNT[mSelectedNode]->setSelected(false);
    4.66 +    if (mSelectedTile)
    4.67 +        mSelectedTile->setSelected(false);
    4.68      // Select
    4.69      scene::APickingResults pickResults;
    4.70      core::line3df line = mCam->getPickingLine(
    4.71 @@ -148,28 +159,50 @@
    4.72          mWin->getCursorControl()->getRelativePosition().Y);
    4.73      mScn->getRootSceneNode()->pick(
    4.74          line, true, true, mCam, false, pickResults);
    4.75 -    scene::CSceneNode *newNode = 0;
    4.76 +    TileType *newTile = 0;
    4.77      // There's always only one selected node.
    4.78 -    if (pickResults.size())
    4.79 -        newNode = pickResults[0]->node;
    4.80 +    if (!pickResults.empty() && mHNT.find(pickResults[0]->node) != mHNT.end())
    4.81 +        newTile = mHNT[pickResults[0]->node];
    4.82 +    else
    4.83 +        std::cout << "no pick results\n";
    4.84      // Do not select, if it was previously selected.
    4.85 -    if (mSelectedNode && newNode == mSelectedNode) {
    4.86 -        mSelectedNode = 0;
    4.87 +    if (mSelectedTile && newTile == mSelectedTile) {
    4.88 +        std::cout << "we toggle\n";
    4.89 +        mSelectedTile = 0;
    4.90          return;
    4.91      }
    4.92 -    // Select new one.
    4.93 -    if (newNode) {
    4.94 -        TileType *tile = 0;
    4.95 -        if (mHNT.find(newNode) != mHNT.end())
    4.96 -            tile = mHNT[newNode];
    4.97 -        if (tile && canSelect(mHNT[newNode])) {
    4.98 -            mHNT[newNode]->setSelected(true);
    4.99 -            mSelectedNode = newNode;
   4.100 -            core::vector3di pos = tile->getPos();
   4.101 -            std::cout << "pos(" << pos.X << ", "
   4.102 -                      << pos.Y << ", "
   4.103 -                      << pos.Z << ")\n";
   4.104 +    // If the tiles are in the same group, remove them from scene.
   4.105 +    // Otherwise just select new one.
   4.106 +    if (newTile) {
   4.107 +        core::vector3di pos = newTile->getPos();
   4.108 +        std::cout << "pos(" << pos.X << ", "
   4.109 +                  << pos.Y << ", "
   4.110 +                  << pos.Z << ")\n";
   4.111 +    }
   4.112 +    if (newTile && canSelect(newTile)) {
   4.113 +        if (mSelectedTile &&
   4.114 +            newTile->getGroup() == mSelectedTile->getGroup()) {
   4.115 +
   4.116 +            std::cout << "the same group\n";
   4.117 +            mSelectedTile->setVisibility(false);
   4.118 +            newTile->setVisibility(false);
   4.119 +            mSelectedTile = 0;
   4.120 +            return;
   4.121          }
   4.122 +        if (mSelectedTile &&
   4.123 +            newTile->getGroup() != mSelectedTile->getGroup()) {
   4.124 +
   4.125 +            std::cout << "different groups: "
   4.126 +                      << mSelectedTile->getGroup() << ", "
   4.127 +                      << newTile->getGroup() << std::endl;
   4.128 +        }
   4.129 +        std::cout << "here\nid:" << newTile->getID() << std::endl;
   4.130 +        newTile->setSelected(true);
   4.131 +        mSelectedTile = newTile;
   4.132 +    }
   4.133 +    else {
   4.134 +        std::cout << "other\n";
   4.135 +        mSelectedTile = 0;
   4.136      }
   4.137  }
   4.138  
   4.139 @@ -257,8 +290,11 @@
   4.140              TileInstance *inst = tmpl->instantiate();
   4.141              inst->setPos(ly.positions()[i]);
   4.142              inst->setID(i);
   4.143 -            inst->setTex(mTexs[i % 4]);
   4.144 -            inst->setGroup(i % 8);
   4.145 +            u32 id = i % 4;
   4.146 +            std::cout << "id: " << id << std::endl;
   4.147 +            inst->setTex(mTexs[id]);
   4.148 +            // Group is equal to texture ID.
   4.149 +            inst->setGroup(id);
   4.150              mHNT[inst->getNode()] = inst;
   4.151              mTiles.push_back(inst);
   4.152          }
     5.1 --- a/src/lf/mj/TileType.cpp	Sat Oct 31 23:36:13 2009 +0700
     5.2 +++ b/src/lf/mj/TileType.cpp	Sun Nov 01 10:12:35 2009 +0700
     5.3 @@ -65,7 +65,7 @@
     5.4          setTex(mTex);
     5.5  }
     5.6  
     5.7 -void TileType::setGroup(const u32 &group) {
     5.8 +void TileType::setGroup(const u32 group) {
     5.9      mGroup = group;
    5.10  }
    5.11  
    5.12 @@ -114,14 +114,20 @@
    5.13  
    5.14  }
    5.15  
    5.16 -void TileType::setSelected(const bool &selected) {
    5.17 +void TileType::setSelected(const bool selected) {
    5.18      mSelected = selected;
    5.19 -    if (!mNode)
    5.20 +    if (!mNode) {
    5.21 +        std::cout << "no node\n";
    5.22          return;
    5.23 -    if (mSelected)
    5.24 +    }
    5.25 +    if (mSelected) {
    5.26 +        std::cout << "translucent\n";
    5.27          mNode->getModel()->getMaterial(0)->setRenderFeature(render::ERPF_TRANSLUCENT_ADD);
    5.28 -    else
    5.29 +    }
    5.30 +    else {
    5.31 +        std::cout << "diffuse map\n";
    5.32          mNode->getModel()->getMaterial(0)->setRenderFeature(render::ERPF_DIFFUSEMAP);
    5.33 +    }
    5.34  }
    5.35  
    5.36  void TileType::setTex(const core::stringc &tex) {
    5.37 @@ -142,7 +148,8 @@
    5.38  }
    5.39  
    5.40  void TileType::setVisibility(const bool &visibility) {
    5.41 -
    5.42 +    mVisibility = visibility;
    5.43 +    mNode->setVisible(mVisibility);
    5.44  }
    5.45  
    5.46  } // namespace mj