GameLib is a collection of libraries for creating applications in Cakelisp.
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

#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);
}
}
}