diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/client/camera.cpp | 2 | ||||
-rw-r--r-- | src/client/content_cao.cpp | 30 | ||||
-rw-r--r-- | src/client/mapblock_mesh.cpp | 4 | ||||
-rw-r--r-- | src/client/mesh.cpp | 2 | ||||
-rw-r--r-- | src/client/render/core.cpp | 14 | ||||
-rw-r--r-- | src/client/renderingengine.cpp | 2 | ||||
-rw-r--r-- | src/client/wieldmesh.cpp | 20 | ||||
-rw-r--r-- | src/client/wieldmesh.h | 2 | ||||
-rw-r--r-- | src/irrlichttypes_extrabloated.h | 1 |
9 files changed, 52 insertions, 25 deletions
diff --git a/src/client/camera.cpp b/src/client/camera.cpp index dce94495b..255ca1238 100644 --- a/src/client/camera.cpp +++ b/src/client/camera.cpp @@ -63,7 +63,7 @@ Camera::Camera(MapDrawControl &draw_control, Client *client, RenderingEngine *re // all other 3D scene nodes and before the GUI. m_wieldmgr = smgr->createNewSceneManager(); m_wieldmgr->addCameraSceneNode(); - m_wieldnode = new WieldMeshSceneNode(m_wieldmgr, -1, false); + m_wieldnode = new WieldMeshSceneNode(m_wieldmgr, -1, true); m_wieldnode->setItem(ItemStack(), m_client); m_wieldnode->drop(); // m_wieldmgr grabbed it diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 255eff52a..ff6eeb7bd 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -251,7 +251,7 @@ void TestCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) u16 indices[] = {0,1,2,2,3,0}; buf->append(vertices, 4, indices, 6); // Set material - buf->getMaterial().setFlag(video::EMF_LIGHTING, false); + buf->getMaterial().setFlag(video::EMF_LIGHTING, true); buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false); buf->getMaterial().setTexture(0, tsrc->getTextureForMesh("rat.png")); buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false); @@ -643,14 +643,14 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) }; auto setSceneNodeMaterial = [this] (scene::ISceneNode *node) { - node->setMaterialFlag(video::EMF_LIGHTING, false); + node->setMaterialFlag(video::EMF_LIGHTING, true); node->setMaterialFlag(video::EMF_BILINEAR_FILTER, false); node->setMaterialFlag(video::EMF_FOG_ENABLE, true); + node->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); node->setMaterialType(m_material_type); if (m_enable_shaders) { node->setMaterialFlag(video::EMF_GOURAUD_SHADING, false); - node->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); } }; @@ -695,15 +695,15 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) u16 indices[] = {0,1,2,2,3,0}; buf->append(vertices, 4, indices, 6); // Set material - buf->getMaterial().setFlag(video::EMF_LIGHTING, false); + buf->getMaterial().setFlag(video::EMF_LIGHTING, true); buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false); buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true); + buf->getMaterial().setFlag(video::EMF_NORMALIZE_NORMALS, true); buf->getMaterial().MaterialType = m_material_type; if (m_enable_shaders) { buf->getMaterial().EmissiveColor = c; buf->getMaterial().setFlag(video::EMF_GOURAUD_SHADING, false); - buf->getMaterial().setFlag(video::EMF_NORMALIZE_NORMALS, true); } // Add to mesh @@ -726,7 +726,8 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) u16 indices[] = {0,1,2,2,3,0}; buf->append(vertices, 4, indices, 6); // Set material - buf->getMaterial().setFlag(video::EMF_LIGHTING, false); + buf->getMaterial().setFlag(video::EMF_LIGHTING, true); + buf->getMaterial().setFlag(video::EMF_NORMALIZE_NORMALS, true); buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false); buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true); buf->getMaterial().MaterialType = m_material_type; @@ -734,7 +735,6 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) if (m_enable_shaders) { buf->getMaterial().EmissiveColor = c; buf->getMaterial().setFlag(video::EMF_GOURAUD_SHADING, false); - buf->getMaterial().setFlag(video::EMF_NORMALIZE_NORMALS, true); } // Add to mesh @@ -744,6 +744,10 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) m_meshnode = m_smgr->addMeshSceneNode(mesh, m_matrixnode); m_meshnode->grab(); mesh->drop(); + + //m_meshnode->setAutomaticCulling(scene::EAC_OFF); + scene::IShadowVolumeSceneNode *shadVol = m_meshnode->addShadowVolumeSceneNode(); + if (shadVol) shadVol->setOptimization(scene::ESV_NONE); } else if (m_prop.visual == "cube") { grabMatrixNode(); scene::IMesh *mesh = createCubeMesh(v3f(BS,BS,BS)); @@ -756,6 +760,10 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) m_prop.backface_culling); setSceneNodeMaterial(m_meshnode); + + //m_meshnode->setAutomaticCulling(scene::EAC_OFF); + scene::IShadowVolumeSceneNode *shadVol = m_meshnode->addShadowVolumeSceneNode(); + if (shadVol) shadVol->setOptimization(scene::ESV_NONE); } else if (m_prop.visual == "mesh") { grabMatrixNode(); scene::IAnimatedMesh *mesh = m_client->getMesh(m_prop.mesh, true); @@ -782,6 +790,10 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) m_animated_meshnode->setMaterialFlag(video::EMF_BACK_FACE_CULLING, m_prop.backface_culling); + + //m_animated_meshnode->setAutomaticCulling(scene::EAC_OFF); + scene::IShadowVolumeSceneNode *shadVol = m_animated_meshnode->addShadowVolumeSceneNode(); + if (shadVol) shadVol->setOptimization(scene::ESV_NONE); } else errorstream<<"GenericCAO::addToScene(): Could not load mesh "<<m_prop.mesh<<std::endl; } else if (m_prop.visual == "wielditem" || m_prop.visual == "item") { @@ -1374,6 +1386,7 @@ void GenericCAO::updateTextures(std::string mod) material.setFlag(video::EMF_LIGHTING, true); material.setFlag(video::EMF_BILINEAR_FILTER, false); material.setFlag(video::EMF_BACK_FACE_CULLING, m_prop.backface_culling); + material.setFlag(video::EMF_NORMALIZE_NORMALS, true); // don't filter low-res textures, makes them look blurry // player models have a res of 64 @@ -1417,8 +1430,9 @@ void GenericCAO::updateTextures(std::string mod) video::SMaterial& material = m_meshnode->getMaterial(i); material.MaterialType = m_material_type; material.MaterialTypeParam = 0.5f; - material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_LIGHTING, true); material.setFlag(video::EMF_BILINEAR_FILTER, false); + material.setFlag(video::EMF_NORMALIZE_NORMALS, true); material.setTexture(0, tsrc->getTextureForMesh(texturestring)); material.getTextureMatrix(0).makeIdentity(); diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index 23db42c55..a4f43425c 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -756,10 +756,12 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): // Create material video::SMaterial material; - material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_LIGHTING, true); material.setFlag(video::EMF_BACK_FACE_CULLING, true); material.setFlag(video::EMF_BILINEAR_FILTER, false); material.setFlag(video::EMF_FOG_ENABLE, true); + material.setFlag(video::EMF_GOURAUD_SHADING, true); + material.setFlag(video::EMF_NORMALIZE_NORMALS, true); material.setTexture(0, p.layer.texture); if (m_enable_shaders) { diff --git a/src/client/mesh.cpp b/src/client/mesh.cpp index 4bf07effa..f901566cd 100644 --- a/src/client/mesh.cpp +++ b/src/client/mesh.cpp @@ -406,7 +406,7 @@ scene::IMesh* convertNodeboxesToMesh(const std::vector<aabb3f> &boxes, for (u16 j = 0; j < 6; j++) { scene::IMeshBuffer *buf = new scene::SMeshBuffer(); - buf->getMaterial().setFlag(video::EMF_LIGHTING, false); + buf->getMaterial().setFlag(video::EMF_LIGHTING, true); buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false); dst_mesh->addMeshBuffer(buf); buf->drop(); diff --git a/src/client/render/core.cpp b/src/client/render/core.cpp index 5e87f58fc..7bac9192c 100644 --- a/src/client/render/core.cpp +++ b/src/client/render/core.cpp @@ -23,11 +23,19 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/shadows/dynamicshadowsrender.h" #include "settings.h" -RenderingCore::RenderingCore(IrrlichtDevice *_device, Client *_client, Hud *_hud, +RenderingCore::RenderingCore(IrrlichtDevice *_device, Client *_client, Hud *_hud, ShadowRenderer *_shadow_renderer, RenderPipeline *_pipeline, v2f _virtual_size_scale) - : device(_device), client(_client), hud(_hud), shadow_renderer(_shadow_renderer), + : device(_device), client(_client), hud(_hud), shadow_renderer(_shadow_renderer), pipeline(_pipeline), virtual_size_scale(_virtual_size_scale) { + auto light_node = device->getSceneManager()->addLightSceneNode(); + // FIXME: light should be directional, but when enabled, there are massive z-fighting issues + // light_node->getLightData().Type = video::ELT_DIRECTIONAL; + // TODO: sun angle + // TODO: reasonable values for ambient, diffuse, specular + light_node->setPosition(v3f(0, 700, 0)); + light_node->setRotation(v3f(90, 0, 0)); + light_node->setRadius(1000); } RenderingCore::~RenderingCore() @@ -55,4 +63,4 @@ void RenderingCore::draw(video::SColor _skycolor, bool _show_hud, bool _show_min v2u32 RenderingCore::getVirtualSize() const { return virtual_size; -}
\ No newline at end of file +} diff --git a/src/client/renderingengine.cpp b/src/client/renderingengine.cpp index 74151423f..da2553fde 100644 --- a/src/client/renderingengine.cpp +++ b/src/client/renderingengine.cpp @@ -126,7 +126,7 @@ RenderingEngine::RenderingEngine(IEventReceiver *receiver) params.WindowSize = core::dimension2d<u32>(screen_w, screen_h); params.AntiAlias = fsaa; params.Fullscreen = fullscreen; - params.Stencilbuffer = false; + params.Stencilbuffer = true; params.Vsync = vsync; params.EventReceiver = receiver; params.HighPrecisionFPU = true; diff --git a/src/client/wieldmesh.cpp b/src/client/wieldmesh.cpp index 5030ea575..980e3308c 100644 --- a/src/client/wieldmesh.cpp +++ b/src/client/wieldmesh.cpp @@ -222,6 +222,9 @@ WieldMeshSceneNode::WieldMeshSceneNode(scene::ISceneManager *mgr, s32 id, bool l m_meshnode->setVisible(false); dummymesh->drop(); // m_meshnode grabbed it + scene::IShadowVolumeSceneNode *shadVol = m_meshnode->addShadowVolumeSceneNode(); + if (shadVol) shadVol->setOptimization(scene::ESV_NONE); + m_shadow = RenderingEngine::get_shadow_renderer(); if (m_shadow) { @@ -392,8 +395,7 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che // overlay is white, if present m_colors.emplace_back(true, video::SColor(0xFFFFFFFF)); // initialize the color - if (!m_lighting) - setColor(video::SColor(0xFFFFFFFF)); + setColor(video::SColor(0xFFFFFFFF)); return; } @@ -467,8 +469,7 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che } // initialize the color - if (!m_lighting) - setColor(video::SColor(0xFFFFFFFF)); + setColor(video::SColor(0xFFFFFFFF)); return; } else { if (!def.inventory_image.empty()) { @@ -483,8 +484,7 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che m_colors.emplace_back(true, video::SColor(0xFFFFFFFF)); // initialize the color - if (!m_lighting) - setColor(video::SColor(0xFFFFFFFF)); + setColor(video::SColor(0xFFFFFFFF)); return; } @@ -494,7 +494,9 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che void WieldMeshSceneNode::setColor(video::SColor c) { - assert(!m_lighting); + if (m_lighting) + return; + scene::IMesh *mesh = m_meshnode->getMesh(); if (!mesh) return; @@ -651,7 +653,7 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) material.setFlag(video::EMF_BILINEAR_FILTER, false); material.setFlag(video::EMF_TRILINEAR_FILTER, false); material.setFlag(video::EMF_BACK_FACE_CULLING, cull_backface); - material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_LIGHTING, true); } rotateMeshXZby(mesh, -45); @@ -696,7 +698,7 @@ scene::SMesh *getExtrudedMesh(ITextureSource *tsrc, material.setFlag(video::EMF_BILINEAR_FILTER, false); material.setFlag(video::EMF_TRILINEAR_FILTER, false); material.setFlag(video::EMF_BACK_FACE_CULLING, true); - material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_LIGHTING, true); material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; material.MaterialTypeParam = 0.5f; } diff --git a/src/client/wieldmesh.h b/src/client/wieldmesh.h index d1eeb64f5..8a3d6d9c2 100644 --- a/src/client/wieldmesh.h +++ b/src/client/wieldmesh.h @@ -75,7 +75,7 @@ struct ItemMesh class WieldMeshSceneNode : public scene::ISceneNode { public: - WieldMeshSceneNode(scene::ISceneManager *mgr, s32 id = -1, bool lighting = false); + WieldMeshSceneNode(scene::ISceneManager *mgr, s32 id = -1, bool lighting = true); virtual ~WieldMeshSceneNode(); void setCube(const ContentFeatures &f, v3f wield_scale); diff --git a/src/irrlichttypes_extrabloated.h b/src/irrlichttypes_extrabloated.h index b03ba7955..797497ff8 100644 --- a/src/irrlichttypes_extrabloated.h +++ b/src/irrlichttypes_extrabloated.h @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <IImage.h> #include <IrrlichtDevice.h> #include <IMeshSceneNode.h> +#include <ILightSceneNode.h> #include <IDummyTransformationSceneNode.h> #include <SMesh.h> #include <ISceneManager.h> |