Better water
This commit is contained in:
@@ -92,19 +92,23 @@ void Water::init()
|
||||
float w = 1000.0f;
|
||||
// mWindow->addListener(this);
|
||||
create_cameras();
|
||||
#if 0
|
||||
Ogre::MeshPtr water_plane =
|
||||
Ogre::MeshManager::getSingleton().createPlane(
|
||||
"water",
|
||||
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
|
||||
mWaterPlane, w, w, 100, 100, true, 1, 100, 100,
|
||||
Ogre::Vector3::UNIT_Z);
|
||||
#endif
|
||||
if (!Ogre::MeshLodGenerator::getSingletonPtr())
|
||||
new Ogre::MeshLodGenerator();
|
||||
|
||||
#if 0
|
||||
Ogre::LodConfig lod_config(water_plane);
|
||||
lod_config.createGeneratedLodLevel(w, 0.5f);
|
||||
lod_config.createGeneratedLodLevel(w * 2.0, 0.25f);
|
||||
Ogre::MeshLodGenerator::getSingleton().generateLodLevels(lod_config);
|
||||
#endif
|
||||
|
||||
Ogre::Vector3 positions[] = { { 0, 0, 0 }, { 0, 0, -1 }, { 0, 0, 1 },
|
||||
{ -1, 0, 0 }, { 1, 0, 0 }, { -1, 0, -1 },
|
||||
@@ -117,6 +121,7 @@ void Water::init()
|
||||
auto mat2 = Ogre::MaterialManager::getSingleton().getByName("Water/Below");
|
||||
mat2->load();
|
||||
mat2->setReceiveShadows(false);
|
||||
#if 0
|
||||
|
||||
for (i = 0; i < (int)sizeof(positions) / (int)sizeof(positions[0]);
|
||||
i++) {
|
||||
@@ -133,6 +138,14 @@ void Water::init()
|
||||
water_lod1->setVisibilityFlags(WATER_MASK);
|
||||
mWaterMeshes.push_back(water_lod1);
|
||||
}
|
||||
#endif
|
||||
Ogre::Entity *water_ent = mScnMgr->createEntity("Ocean", "sea.glb");
|
||||
water_ent->setVisibilityFlags(WATER_MASK);
|
||||
water_ent->setCastShadows(true);
|
||||
water_ent->setMaterialName("Water/Above");
|
||||
water_ent->setMaterial(mat);
|
||||
mWaterNode->attachObject(water_ent);
|
||||
mWaterMeshes.push_back(water_ent);
|
||||
}
|
||||
|
||||
void Water::createWater(Ogre::RenderWindow * window, Ogre::Camera *camera)
|
||||
@@ -150,13 +163,18 @@ void Water::createWater(Ogre::RenderWindow * window, Ogre::Camera *camera)
|
||||
void Water::updateWater(float delta)
|
||||
{
|
||||
int i;
|
||||
if (mCameraPosition.squaredDistance(mCameraNode->getPosition()) >
|
||||
200.0f * 200.0f) {
|
||||
mCameraPosition = mCameraNode->getPosition();
|
||||
Ogre::Vector3 waterPosition = mCameraPosition;
|
||||
waterPosition.y = 0;
|
||||
mWaterNode->setPosition(waterPosition);
|
||||
}
|
||||
Ogre::Vector3 mCameraPos = mCameraNode->_getDerivedPosition();
|
||||
Ogre::Vector3 waterPos = mWaterNode->_getDerivedPosition();
|
||||
mCameraPos.y = 0;
|
||||
waterPos.y = 0;
|
||||
|
||||
Ogre::Vector3 d = mCameraPos - waterPos;
|
||||
// Ogre::Vector3 waterPosition = mCameraPos;
|
||||
// mWaterNode->setPosition(waterPosition);
|
||||
if (d.squaredLength() < 100.0f * 100.0f)
|
||||
mWaterNode->translate(d * 3.0f * delta);
|
||||
else
|
||||
mWaterNode->translate(d);
|
||||
if (mAbove) {
|
||||
if (mCameraNode->getPosition().y < 0) {
|
||||
mAbove = false;
|
||||
|
||||
Reference in New Issue
Block a user