You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.8 KiB
106 lines
3.8 KiB
#include "OgreHlmsManager.h"
|
|
#include "OgreHlmsPbs.h"
|
|
#include "OgreHlmsPbsDatablock.h"
|
|
#include "OgreHlmsSamplerblock.h"
|
|
#include "OgreItem.h"
|
|
#include "OgreMesh2.h"
|
|
#include "OgreMeshManager.h"
|
|
#include "OgreMeshManager2.h"
|
|
#include "OgreRoot.h"
|
|
#include "OgreSceneManager.h"
|
|
#include "OgreTextureFilters.h"
|
|
#include "OgreTextureGpuManager.h"
|
|
|
|
// For testing only. Copied from Ogre samples, and modified.
|
|
|
|
void ogreCreatePbsSpheres(Ogre::Root* root, Ogre::SceneManager* sceneManager)
|
|
{
|
|
int numSpheres = 0;
|
|
Ogre::HlmsManager* hlmsManager = root->getHlmsManager();
|
|
|
|
assert(dynamic_cast<Ogre::HlmsPbs*>(hlmsManager->getHlms(Ogre::HLMS_PBS)));
|
|
|
|
Ogre::HlmsPbs* hlmsPbs = static_cast<Ogre::HlmsPbs*>(hlmsManager->getHlms(Ogre::HLMS_PBS));
|
|
|
|
const int numX = 8;
|
|
const int numZ = 8;
|
|
|
|
const float armsLength = 1.f;
|
|
const float startX = (numX - 1) / 2.0f;
|
|
const float startZ = (numZ - 1) / 2.0f;
|
|
|
|
Ogre::TextureGpuManager* textureMgr = root->getRenderSystem()->getTextureGpuManager();
|
|
Ogre::SceneNode* rootSceneNode = sceneManager->getRootSceneNode();
|
|
|
|
const Ogre::String meshNameV2 = "Sphere.mesh";
|
|
// const Ogre::String meshNameV2 = "Suzanne.mesh";
|
|
{
|
|
Ogre::MeshPtr v2Mesh = Ogre::MeshManager::getSingleton().load(
|
|
meshNameV2, Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME);
|
|
}
|
|
|
|
for (int x = 0; x < numX; ++x)
|
|
{
|
|
for (int z = 0; z < numZ; ++z)
|
|
{
|
|
Ogre::String datablockName = "Test" + Ogre::StringConverter::toString(numSpheres++);
|
|
Ogre::HlmsPbsDatablock* datablock = static_cast<Ogre::HlmsPbsDatablock*>(
|
|
hlmsPbs->createDatablock(datablockName, datablockName, Ogre::HlmsMacroblock(),
|
|
Ogre::HlmsBlendblock(), Ogre::HlmsParamVec()));
|
|
|
|
// Reflection texture
|
|
{
|
|
Ogre::TextureGpu* texture = textureMgr->createOrRetrieveTexture(
|
|
"SaintPetersBasilica.dds", Ogre::GpuPageOutStrategy::Discard,
|
|
Ogre::TextureFlags::PrefersLoadingFromFileAsSRGB, Ogre::TextureTypes::TypeCube,
|
|
Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME,
|
|
Ogre::TextureFilter::TypeGenerateDefaultMipmaps);
|
|
|
|
datablock->setTexture(Ogre::PBSM_REFLECTION, texture);
|
|
}
|
|
|
|
// TODO: Does not work. Figure out how to set diffuse map in code
|
|
// // Diffuse texture
|
|
// {
|
|
// Ogre::TextureGpu* texture = textureMgr->createOrRetrieveTexture(
|
|
// "MonkeyTexture.dds", Ogre::GpuPageOutStrategy::Discard,
|
|
// Ogre::TextureFlags::PrefersLoadingFromFileAsSRGB, Ogre::TextureTypes::Type2D,
|
|
// Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME,
|
|
// Ogre::TextureFilter::TypeGenerateDefaultMipmaps);
|
|
// datablock->setTexture(Ogre::PBSM_DIFFUSE, texture);
|
|
// }
|
|
|
|
datablock->setDiffuse(Ogre::Vector3(0.0f, 1.0f, 0.0f));
|
|
|
|
datablock->setRoughness(std::max(0.02f, x / std::max(1.0f, (float)(numX - 1))));
|
|
datablock->setFresnel(Ogre::Vector3(z / std::max(1.0f, (float)(numZ - 1))), false);
|
|
|
|
Ogre::Item* item = nullptr;
|
|
{
|
|
item = sceneManager->createItem(
|
|
meshNameV2, Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME,
|
|
Ogre::SCENE_DYNAMIC);
|
|
}
|
|
|
|
// // TODO this is a hack that relies on ogre-load-mesh being called some time before
|
|
// this
|
|
// // This is because "sphere.mesh" is an old-style mesh which I need a converter for or
|
|
// something Ogre::Item* item = sceneManager->createItem(
|
|
// "Suzanne.mesh Imported",
|
|
// Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME, Ogre::SCENE_DYNAMIC);
|
|
|
|
// if (z % 2 == 0)
|
|
item->setDatablock(datablock);
|
|
// else
|
|
// item->setDatablock("MonkeyFur");
|
|
item->setVisibilityFlags(0x000000002);
|
|
|
|
Ogre::SceneNode* sceneNode = ((Ogre::SceneNode*)rootSceneNode->createChild());
|
|
if (!sceneNode)
|
|
return;
|
|
sceneNode->setPosition(
|
|
Ogre::Vector3(armsLength * x - startX, -3.0f, armsLength * z - startZ));
|
|
sceneNode->attachObject(item);
|
|
}
|
|
}
|
|
}
|
|
|