smth wrong with LF. the tile 4 at the right cannot change its material color
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