fix corrupted mesh & fix instancing

This commit is contained in:
floralrainfall 2023-07-20 05:11:08 -04:00
parent 4f0ebdffd0
commit a203911dee
16 changed files with 114 additions and 34 deletions

View File

@ -1,5 +1,5 @@
// generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22 // generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22
material materials/BackMaterial { material BackMaterial {
receive_shadows on receive_shadows on
technique { technique {
pass { pass {

View File

@ -1,5 +1,5 @@
// generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22 // generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22
material materials/BottomMaterial { material BottomMaterial {
receive_shadows on receive_shadows on
technique { technique {
pass { pass {

View File

@ -1,5 +1,5 @@
// generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22 // generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22
material materials/FrontMaterial { material FrontMaterial {
receive_shadows on receive_shadows on
technique { technique {
pass { pass {

View File

@ -0,0 +1,16 @@
// generated by blender2ogre 0.8.3 on 2023-07-20 04:32:47
material InstancedMaterial {
receive_shadows on
technique {
pass {
diffuse 0.8 0.8 0.8 1.0
specular 0.5 0.0 0 0 0
rtshader_system {
lighting_stage metal_roughness
texturing_stage late_add_blend
transform_stage instanced
}
}
}
}

View File

@ -1,5 +1,5 @@
// generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22 // generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22
material materials/LeftMaterial { material LeftMaterial {
receive_shadows on receive_shadows on
technique { technique {
pass { pass {

View File

@ -1,5 +1,5 @@
// generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22 // generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22
material materials/RightMaterial { material RightMaterial {
receive_shadows on receive_shadows on
technique { technique {
pass { pass {

View File

@ -1,5 +1,5 @@
// generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22 // generated by blender2ogre 0.8.3 on 2023-07-17 02:58:22
material materials/TopMaterial { material TopMaterial {
receive_shadows on receive_shadows on
technique { technique {
pass { pass {

View File

@ -1,9 +1,26 @@
material materials/PartInstanced/shadow_caster
{
technique
{
pass
{
rtshader_system
{
lighting_stage gbuffer depth
transform_stage instanced
}
}
}
}
material materials/PartInstanced material materials/PartInstanced
{ {
receive_shadows on receive_shadows on
technique technique
{ {
shadow_caster_material materials/PartInstanced/shadow_caster
pass pass
{ {
specular 1 1 1 1 12.5 specular 1 1 1 1 12.5
@ -17,6 +34,7 @@ material materials/PartInstanced
rtshader_system rtshader_system
{ {
lighting_stage per_pixel lighting_stage per_pixel
transform_stage instanced
} }
} }
} }

Binary file not shown.

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- exporter: blender2ogre 0.8.3 --> <!-- exporter: blender2ogre 0.8.3 -->
<!-- export_time: Mon, 17 Jul 2023 06:58:22 +0000 --> <!-- export_time: Thu, 20 Jul 2023 08:20:08 +0000 -->
<!-- previous_export_time: Mon, 17 Jul 2023 06:14:49 +0000 --> <!-- previous_export_time: Mon, 17 Jul 2023 06:58:22 +0000 -->
<scene author="caesium" formatVersion="1.1" > <scene author="caesium" formatVersion="1.1" >
<nodes > <nodes >
<node name="Cube" > <node name="Cube" >
@ -15,22 +15,22 @@
</nodes> </nodes>
<externals > <externals >
<item type="material" > <item type="material" >
<file name="../materials/TopMaterial.material" /> <file name="TopMaterial.material" />
</item> </item>
<item type="material" > <item type="material" >
<file name="../materials/BackMaterial.material" /> <file name="BackMaterial.material" />
</item> </item>
<item type="material" > <item type="material" >
<file name="../materials/BottomMaterial.material" /> <file name="BottomMaterial.material" />
</item> </item>
<item type="material" > <item type="material" >
<file name="../materials/FrontMaterial.material" /> <file name="FrontMaterial.material" />
</item> </item>
<item type="material" > <item type="material" >
<file name="../materials/LeftMaterial.material" /> <file name="LeftMaterial.material" />
</item> </item>
<item type="material" > <item type="material" >
<file name="../materials/RightMaterial.material" /> <file name="RightMaterial.material" />
</item> </item>
</externals> </externals>
<environment > <environment >

Binary file not shown.

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- exporter: blender2ogre 0.8.3 -->
<!-- export_time: Thu, 20 Jul 2023 08:32:47 +0000 -->
<!-- previous_export_time: Mon, 17 Jul 2023 06:58:22 +0000 -->
<scene author="caesium" formatVersion="1.1" >
<nodes >
<node name="Cube_Instanced" >
<position x="0.000000" y="0.000000" z="0.000000" />
<rotation qw="1.000000" qx="0.000000" qy="0.000000" qz="0.000000" />
<scale x="1.000000" y="1.000000" z="1.000000" />
<entity meshFile="Cube_Instanced.mesh" name="Cube_Instanced" >
<userData />
</entity>
</node>
</nodes>
<externals >
<item type="material" >
<file name="InstancedMaterial.material" />
</item>
</externals>
<environment >
<colourBackground b="0.050876" g="0.050876" r="0.050876" />
</environment>
</scene>

View File

@ -32,7 +32,7 @@ int main(int argc, char** argv)
while (window.isVisible()) while (window.isVisible())
{ {
window.statusBar()->showMessage(QString::asprintf("Dt=%f, Rt=%f, FPS=%f", window.ogreWidget->delta, window.ogreWidget->render_time, 1 / window.ogreWidget->delta)); window.statusBar()->showMessage(QString::asprintf("Dt=%f, Rt=%f, Pt=%f, FPS=%f, pFPS=%f", window.ogreWidget->delta, window.ogreWidget->render_time, window.ogreWidget->world->getPhysicsTime(), 1 / window.ogreWidget->delta, 1 / window.ogreWidget->world->getLastPhysicsDelta()));
app.processEvents(); app.processEvents();
window.ogreWidget->render(); window.ogreWidget->render();
world->update(); world->update();

View File

@ -13,7 +13,7 @@ namespace RNR
m_reflectance = 0.0; m_reflectance = 0.0;
setNode(world->getOgreSceneManager()->getRootSceneNode()->createChildSceneNode()); setNode(world->getOgreSceneManager()->getRootSceneNode()->createChildSceneNode());
setObject(world->getOgreSceneManager()->createEntity("meshes/cube.mesh")); setObject(world->getOgreSceneManager()->createEntity("meshes/Cube.mesh"));
getNode()->attachObject(getObject()); getNode()->attachObject(getObject());
updateMatrix(); updateMatrix();
@ -24,9 +24,23 @@ namespace RNR
m_matrix = m_cframe.getMatrix(); m_matrix = m_cframe.getMatrix();
m_position = m_cframe.getPosition(); m_position = m_cframe.getPosition();
getNode()->setOrientation(Ogre::Quaternion(m_cframe.getRotation())); if(getNode())
getNode()->setPosition(m_position); {
getNode()->setScale(m_size); getNode()->setOrientation(Ogre::Quaternion(m_cframe.getRotation()));
getNode()->setPosition(m_position);
getNode()->setScale(m_size);
}
if(getObject() && dynamic_cast<Ogre::InstancedEntity*>(getObject()))
{
Ogre::InstancedEntity* object = (Ogre::InstancedEntity*)getObject();
object->setOrientation(Ogre::Quaternion(m_cframe.getRotation()));
object->setPosition(m_position);
object->setScale(m_size);
object->updateTransforms();
}
Ogre::Entity* entity = (Ogre::Entity*)getObject(); Ogre::Entity* entity = (Ogre::Entity*)getObject();
for(auto& subentity : entity->getSubEntities()) for(auto& subentity : entity->getSubEntities())

View File

@ -8,14 +8,14 @@ namespace RNR
Workspace::Workspace() : ModelInstance() Workspace::Workspace() : ModelInstance()
{ {
setName("Workspace"); setName("Workspace");
m_batchMode = BATCH_STATIC_GEOMETRY; m_batchMode = BATCH_INSTANCED;
m_worldspawn = world->getOgreSceneManager()->getRootSceneNode()->createChildSceneNode(); m_worldspawn = world->getOgreSceneManager()->getRootSceneNode()->createChildSceneNode();
switch(m_batchMode) switch(m_batchMode)
{ {
case BATCH_INSTANCED: case BATCH_INSTANCED:
m_instanceManager = world->getOgreSceneManager()->createInstanceManager("workspaceInstanceManager", "fonts/Cube.mesh", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::InstanceManager::InstancingTechnique::HWInstancingBasic, 255); m_instanceManager = world->getOgreSceneManager()->createInstanceManager("workspaceInstanceManager", "meshes/Cube_Instanced.mesh", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::InstanceManager::InstancingTechnique::HWInstancingBasic, 255);
break; break;
case BATCH_STATIC_GEOMETRY: case BATCH_STATIC_GEOMETRY:
m_geom = world->getOgreSceneManager()->createStaticGeometry("workspaceGeom"); m_geom = world->getOgreSceneManager()->createStaticGeometry("workspaceGeom");
@ -37,11 +37,13 @@ namespace RNR
{ {
case BATCH_INSTANCED: case BATCH_INSTANCED:
{ {
Ogre::Entity* childEntity = (Ogre::Entity*)childAdded->getObject(); Ogre::InstancedEntity* replica = m_instanceManager->createInstancedEntity(BrickColor::material(part->getBrickColor())->getName());
Ogre::InstancedEntity* replica = m_instanceManager->createInstancedEntity("materials/PartInstanced"); part->updateMatrix();
replica->setPosition(part->getPosition()); replica->setPosition(part->getCFrame().getPosition());
replica->setOrientation(part->getCFrame().getRotation()); replica->setOrientation(part->getCFrame().getRotation());
replica->setScale(part->getSize()); replica->setScale(part->getSize());
replica->setCastShadows(true);
m_worldspawn->attachObject(replica);
childAdded->setObject(replica); childAdded->setObject(replica);
child_node->setVisible(false); child_node->setVisible(false);
} }
@ -55,6 +57,7 @@ namespace RNR
m_geomDirty = true; m_geomDirty = true;
break; break;
case BATCH_DONT: case BATCH_DONT:
child_node->setVisible(true);
break; break;
} }
world->registerPhysicsPart(part); world->registerPhysicsPart(part);

View File

@ -64,6 +64,7 @@ namespace RNR
m_runPhysics = true; m_runPhysics = true;
m_physicsTimer = new Ogre::Timer(); m_physicsTimer = new Ogre::Timer();
m_physicsThread = std::thread(physicsThread, this); m_physicsThread = std::thread(physicsThread, this);
m_physicsTime = 0.0;
m_tmb = new TopMenuBar(this); m_tmb = new TopMenuBar(this);
@ -168,16 +169,20 @@ namespace RNR
m_inputManager->frame(); m_inputManager->frame();
m_tmb->frame(); m_tmb->frame();
m_lastDelta = timestep; m_lastDelta = timestep;
physicsIterateLock.lock(); if(m_runService && m_runService->getRunning() && !m_runService->getPaused())
for(int j = m_dynamicsWorld->getNumCollisionObjects() - 1; j >= 0; j--)
{ {
btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[j]; physicsIterateLock.lock();
if(!obj->isActive()) for(int j = m_dynamicsWorld->getNumCollisionObjects() - 1; j >= 0; j--)
continue; {
PartInstance* part = (PartInstance*)obj->getUserPointer(); btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[j];
part->updateMatrix(); if(!obj->isActive())
continue;
PartInstance* part = (PartInstance*)obj->getUserPointer();
part->updateMatrix();
}
update();
physicsIterateLock.unlock();
} }
physicsIterateLock.unlock();
} }
void World::preStep() void World::preStep()
@ -243,7 +248,7 @@ namespace RNR
btVector3 localInertia = btVector3(0,0,0); btVector3 localInertia = btVector3(0,0,0);
if(mass) if(mass)
partShape->calculateLocalInertia(mass, localInertia); partShape->calculateLocalInertia(mass, localInertia);
btDefaultMotionState* partMotionState = new btDefaultMotionState(partTransform); btDefaultMotionState* partMotionState = new btDefaultMotionState(partTransform);
btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, partMotionState, partShape, localInertia); btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, partMotionState, partShape, localInertia);
btRigidBody* body = new btRigidBody(rbInfo); btRigidBody* body = new btRigidBody(rbInfo);