void xEditTerrainHeight::_Update(Event * sender) { Terrain * terrain = Environment::Instance()->GetTerrain(); if (!terrain) return ; int op = xApp::Instance()->GetOperator(); if (op != xTerrainOp::eOp_Terrain) return ; Point2f pt = IMouse::Instance()->GetPositionUnit(); if (pt.x < 0 || pt.y < 0 || pt.x > 1 || pt.y > 1) return ; Ray ray = World::Instance()->MainCamera()->GetViewportRay(pt.x, pt.y); mBrush.position = terrain->GetPosition(ray); if (!IMouse::Instance()->KeyPressed(MKC_BUTTON0)) return ; _UpdateGeometry(); }
RayCheckInfo RayCheck(Ray ray, float dist) { RayCheckInfo info; Terrain * terriain = Environment::Instance()->GetTerrain(); Vec3 pos = terriain->GetPosition(ray); if (pos != Vec3::Zero && pos.DistanceSq(ray.origin) < dist * dist) { info.bPicked = true; info.vPosition = pos; } return info; }
void WaterBlock::Init(Water* water, int x, int z) { Shudown(); mWater = water; mIndexX = x; mIndexZ = z; Terrain * terrain = Environment::Instance()->GetTerrain(); int startX = kBlockGridSize * x; int startZ = kBlockGridSize * z; int sizeZ = water->GetSizeZ() - 1; WaterIdentityVertex wiv; Array<unsigned short> indexArray; for (int j = startZ; j < startZ + kBlockGridSize; ++j) { for (int i = startX; i < startX + kBlockGridSize; ++i) { char flag = mWater->GetData(i, j); if (flag == 1) { int _x = i; int _y = sizeZ - j; Vec3 p0 = terrain->GetPosition(_x + 0, _y + 0); Vec3 p1 = terrain->GetPosition(_x + 1, _y + 0); Vec3 p2 = terrain->GetPosition(_x + 0, _y + 1); Vec3 p3 = terrain->GetPosition(_x + 1, _y + 1); int i0 = wiv.Add(_x + 0, _y + 0, p0); int i1 = wiv.Add(_x + 1, _y + 0, p1); int i2 = wiv.Add(_x + 0, _y + 1, p2); int i3 = wiv.Add(_x + 1, _y + 1, p3); indexArray.PushBack(i0); indexArray.PushBack(i1); indexArray.PushBack(i2); indexArray.PushBack(i3); mBound.Merge(p0); mBound.Merge(p1); mBound.Merge(p2); mBound.Merge(p3); } } } if (indexArray.Size() == 0) return ; mRenderOp = new RenderOp(); mRenderOp->iPrimCount = indexArray.Size() - 2; mRenderOp->ePrimType = PRIM_TRIANGLELIST; int iVertexCount = wiv.vertArray.Size(); int iIndexCount = mRenderOp->iPrimCount * 3; VertexDeclarationPtr vdecl = mWater->GetVertexDecl(); VertexBufferPtr vb = VideoBufferManager::Instance()->CreateVertexBuffer(iVertexCount * sizeof(Vec3), sizeof(Vec3)); Vec3 * vert = (Vec3 *)vb->Lock(0, 0, LOCK_DISCARD); { for (int i = 0; i < iVertexCount; ++i) { vert[i] = wiv.vertArray[i].position; } } vb->Unlock(); mRenderOp->vxStream.SetDeclaration(vdecl); mRenderOp->vxStream.Bind(0, vb, sizeof(Vec3)); mRenderOp->vxStream.SetCount(iVertexCount); IndexBufferPtr ib = VideoBufferManager::Instance()->CreateIndexBuffer(iIndexCount * sizeof(short)); short * idx = (short *)ib->Lock(0, 0, LOCK_DISCARD); { for (int i = 0; i < indexArray.Size(); i += 4) { *idx++ = indexArray[i + 0]; *idx++ = indexArray[i + 1]; *idx++ = indexArray[i + 2]; *idx++ = indexArray[i + 2]; *idx++ = indexArray[i + 1]; *idx++ = indexArray[i + 3]; } } ib->Unlock(); mRenderOp->ixStream.Bind(ib, 0); mRenderOp->ixStream.SetCount(iIndexCount); }