Irrlicht: как включить тени всех узлов в менеджере сцен? - PullRequest
0 голосов
/ 28 августа 2018

Существует ли одна команда для отметки / включения теней для всех узлов в данном диспетчере пейзажей?

В данный момент я могу отбрасывать тени со всех узлов, но мне приходится постоянно вызывать одну и ту же функцию addShadowVolumeSceneNode (); снова и снова для каждого из узлов сцены. Это нормально для небольшого игрушечного кода, но, поскольку ваш код увеличивается по сложности и размеру, он вполне может быть не идеальным.

Вот код, с которым я играю:

#include <irrlicht.h>
#include "driverChoice.h"

using namespace irr;
using namespace scene;
using namespace core;
using namespace video;

int main()
{
    /* create device */
    IrrlichtDevice *device = createDevice(video::EDT_OPENGL, core::dimension2d<u32>(640, 480), 16, false, true);

    if (device == 0)
        return 1; 

    /* create engine and camera */
    video::IVideoDriver* driver = device->getVideoDriver();
    scene::ISceneManager* smgr = device->getSceneManager();

    smgr->addCameraSceneNode(0, core::vector3df(0,-100,0), core::vector3df(0,0,0));
    smgr->addLightSceneNode(0, core::vector3df(0,0,400), video::SColorf(1.0f, 1.0f, 0.0f, 0.0f), 800.0f);

    /* Add cube */
    scene::IMeshSceneNode* node_cube = smgr->addCubeSceneNode(30);
    smgr->setShadowColor(video::SColor(150,0,0,0));
    node_cube->setPosition(core::vector3df(0,0,-80));
    node_cube->setMaterialFlag(video::EMF_LIGHTING, true);
    node_cube->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
    node_cube->addShadowVolumeSceneNode();

    /* Another cube */
    scene::IMeshSceneNode* node_cube2 = smgr->addCubeSceneNode(20);
    smgr->setShadowColor(video::SColor(150,0,0,0));
    node_cube2->setPosition(core::vector3df(0,0,-45));
    node_cube2->setMaterialFlag(video::EMF_LIGHTING, true);
    node_cube2->setMaterialFlag(video::EMF_BILINEAR_FILTER, true);
    node_cube2->addShadowVolumeSceneNode();

    /* And another cube */
    scene::IMeshSceneNode* node_cube3 = smgr->addCubeSceneNode(10);
    smgr->setShadowColor(video::SColor(150,0,0,0));
    node_cube3->setPosition(core::vector3df(0,0,-20));
    node_cube3->setMaterialFlag(video::EMF_LIGHTING, true);
    node_cube3->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
    node_cube3->addShadowVolumeSceneNode();

    /* Now draw everything and finish */
    u32 frames=0;
    while(device->run())
    {
        driver->beginScene(true, true, video::SColor(0,100,100,100));

        smgr->drawAll();

        driver->endScene();
        if (++frames==100)
        {
            core::stringw str = L"Irrlicht Engine [";
            str += driver->getName();
            str += L"] FPS: ";
            str += (s32)driver->getFPS();

            device->setWindowCaption(str.c_str());
            frames=0;
        }
    }
    device->drop();
    return 0;
}

Спасибо!

1 Ответ

0 голосов
/ 28 августа 2018

Создать заводскую функцию:

scene::IMeshSceneNode* CreateCubeWithShadow(scene::ISceneManager* smgr, const core::vector3df &pos)
{
    scene::IMeshSceneNode* node_cube = smgr->addCubeSceneNode(10);
    node_cube->setPosition(pos);
    node_cube->setMaterialFlag(video::EMF_LIGHTING, true);
    node_cube->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
    node_cube->addShadowVolumeSceneNode();
    return node_cube;
}

Затем вызывайте его всякий раз, когда вам нужен новый узел:

scene::IMeshSceneNode* node_cube1 = CreateCubeWithShadow(smgr, core::vector3df(0,0,-80));
scene::IMeshSceneNode* node_cube2 = CreateCubeWithShadow(smgr, core::vector3df(0,0,-45));
scene::IMeshSceneNode* node_cube3 = CreateCubeWithShadow(smgr, core::vector3df(0,0,-20));

Также нет необходимости вызывать smgr->setShadowColor(video::SColor(150,0,0,0)); для каждого узла, это глобальная настройка.

...