Better water

This commit is contained in:
2025-07-07 00:16:48 +03:00
parent c72b1cf35e
commit 4a790a060a
9 changed files with 139 additions and 84 deletions

View File

@@ -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;