
http://rapidshare.com/files/41942562/0_ ... lastic.rar
Yes. This is wrong... (You have many cameras in your project?)Masterhawk wrote:Well, it seems to work for the most parts, but I still have the problem with a wrong shadow...
It does not behave like in your demo...I can bring it to the "front" with a few camera moves...
This isn't right, is it?
Code: Select all
class CGE_Shaders:public video::IShaderConstantSetCallBack
{
public:
virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
{
video::IVideoDriver* driver = services->getVideoDriver();
core::vector3df LightPosition = core::vector3df(0.0f,0.0f,4.0f);
services->setVertexShaderConstant("LightPosition", reinterpret_cast<f32*>(&LightPosition), 3);
video::SColorf Color1(0.2,0.0904,0,1.0);
services->setVertexShaderConstant("Color1", reinterpret_cast<f32*>(&Color1), 4);
video::SColorf Color2(0.8,0.8,0.8,1.0);
services->setVertexShaderConstant("Color2", reinterpret_cast<f32*>(&Color2), 4);
float Scale = 0.02;
services->setVertexShaderConstant("Scale", reinterpret_cast<float*>(&Scale), 1);
float ErosionFactor = 0.35;
services->setVertexShaderConstant("ErosionFactor", reinterpret_cast<float*>(&ErosionFactor), 1);
float IntensityFactor1 = 0.75;
services->setVertexShaderConstant("IntensityFactor1", reinterpret_cast<float*>(&IntensityFactor1), 1);
float IntensityFactor2 = 1.95;
services->setVertexShaderConstant("IntensityFactor2", reinterpret_cast<float*>(&IntensityFactor2), 1);
}
};
Code: Select all
while(device->run())
{
driver->beginScene(true, true, video::SColor(255,255,0,0));
// Set Active Camera 1 !
node->setMaterialType((video::E_MATERIAL_TYPE)Plastic);
smgr->drawAll();
// Set Active Camera 2 !
node->setMaterialType((video::E_MATERIAL_TYPE)Plastic);
node->render();
driver->endScene();
}
Code: Select all
Camera = irrSceneMgr->addCameraSceneNode(0,vector3df(0.0f,0.0f,0.0f),vector3df(100.0f,0.0f,0.0f));
OrbCamCtrl = new IOrbitCamCtrl(Camera,GetBodyPos(CurrPlayer->Ball->body),irrDevice);
OrbCamCtrl->setAngularVelocity(params.mousecfg.AngularVelocity);
OrbCamCtrl->setInvertYAxis(params.mousecfg.InvertY);
Code: Select all
void CGame::MainLoop()
{
if(OrbCamCtrl->isEnabled())
irrDevice->getCursorControl()->setPosition(0.5f,0.5f); //Mouse zentrieren
OrbCamCtrl->PreRender();
HandleInput();
// Update newton 100 times / second
if (irrDevice->getTimer()->getTime() > lasttick + 10)
{
lasttick = irrDevice->getTimer()->getTime();
NewtonUpdate(nWorld, 0.01f);
}
Render();
if(CurrPlayer)
{
OrbCamCtrl->UpdateCam(MouseDiff.X,MouseDiff.Y,CamZoom,GetBodyPos(CurrPlayer->Ball->body));
//Sync the VelLine with the cam angle (-PI/2): to kill the offset
CurrPlayer->ControlLine->SetAngleZ(-(OrbCamCtrl->getTheta()*DEGTORAD)-PI/2);
}
MouseDiff.X=0;
MouseDiff.Y=0;
CamZoom=0.f;
}
void CGame::Render()
{
irrDriver->beginScene(true, true, SColor(0,200,200,200));
if (isBodyNotMoving(CurrPlayer->Ball->body)) //&& Player1 an der Reihe
{
HandleFinished();
if(stopped_Time == 0.f) //Init the Delaytime
{
stopped_Time = irrDevice->getTimer()->getRealTime();
DelayTime = 0.f;
}
else
DelayTime = (irrDevice->getTimer()->getRealTime() - stopped_Time)/1000.f;
if(ReadyToSwitch && (DelayTime>2)) //Delaytime: The time the ball stands still
{
ReadyToSwitch = false;
CurrPlayer->setLastPos(GetBodyPos(CurrPlayer->Ball->body));
lastPos = CurrPlayer->getLastPos();
CurrPlayer = PlayerCtrl->getNextPlayer();
if(CurrPlayer)
{
CurrPlayer->ControlLine->setVisible(true);
CurrPlayer->lockHit(false);
}
stopped_Time=0.f;
}
matrix4 mat1;
irrDriver->setTransform(ETS_WORLD,mat1);
if(CurrPlayer)
{
//CurrPlayer->ControlLine->Draw(irrDriver,GetBodyPos(CurrPlayer->Ball->body));//ControlLine->Set
CurrPlayer->ControlLine->Update(GetBodyPos(CurrPlayer->Ball->body));
}
else
//irrDevice->closeDevice();
CourseActive = false;
}
irrSceneMgr->setActiveCamera(OrbCamCtrl->getCamera());
Camera->updateAbsolutePosition();
//CurrPlayer->Ball->node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType1);
irrSceneMgr->drawAll();
//Updates the powerbar
if(CurrPlayer)
HUD->powerbar_Update(CurrPlayer->ControlLine->GetStrength());
irrGUIEnv->drawAll();
irrDriver->endScene();
int fps = irrDriver->getFPS();
if (lastFPS != fps)
{
core::stringw str = L"Minigolf 3D ALPHA #1(Singleplayer) - Masterhawk studios 2007 [";
str += irrDriver->getName();
str += "] FPS:";
str += fps;
irrDevice->setWindowCaption(str.c_str());
lastFPS = fps;
}
}
Code: Select all
public:
MyShaderCallBack(IrrlichtDevice* aDevice,bool useHighLevelShaders)
{
device=aDevice;
UseHighLevelShaders=useHighLevelShaders;
}
virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
{
video::IVideoDriver* driver = services->getVideoDriver();
core::matrix4 invWorld = driver->getTransform(video::ETS_WORLD);
invWorld.makeInverse();
services->setVertexShaderConstant("mInvWorld", invWorld.pointer(), 16);
core::matrix4 worldViewProj;
worldViewProj = driver->getTransform(video::ETS_PROJECTION);
worldViewProj *= driver->getTransform(video::ETS_VIEW);
worldViewProj *= driver->getTransform(video::ETS_WORLD);
services->setVertexShaderConstant("mWorldViewProj", worldViewProj.pointer() , 16);
core::vector3df pos = device->getSceneManager()->getActiveCamera()->getAbsolutePosition();
services->setVertexShaderConstant("Camera_Position", reinterpret_cast<f32*>(&pos), 3);
video::SColorf col(1.0,0.9031,0.1536,1.0);
services->setVertexShaderConstant("Color", reinterpret_cast<f32*>(&col), 4);
}
Code: Select all
//Loading shaders
bool UseHighLevelShaders=true;
c8* vsFileName = 0; // filename for the vertex shader
c8* psFileName = 0; // filename for the pixel shader
switch(driverType)
{
case video::EDT_DIRECT3D9:
if (UseHighLevelShaders)
{
psFileName = "./shaders/Plastic.hlsl";
vsFileName = psFileName; // both shaders are in the same file
}
break;
case video::EDT_OPENGL:
if (UseHighLevelShaders)
{
psFileName = "./shaders/Plastic.frag";
vsFileName = "./shaders/Plastic.vert";
}
break;
}
//check if shaders supported
if (!irrDriver->queryFeature(video::EVDF_PIXEL_SHADER_1_1) &&
!irrDriver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1))
{
irrDevice->getLogger()->log("WARNING: Pixel shaders disabled "\
"because of missing driver/hardware support.");
psFileName = 0;
}
if (!irrDriver->queryFeature(video::EVDF_VERTEX_SHADER_1_1) &&
!irrDriver->queryFeature(video::EVDF_ARB_VERTEX_PROGRAM_1))
{
irrDevice->getLogger()->log("WARNING: Vertex shaders disabled "\
"because of missing driver/hardware support.");
vsFileName = 0;
}
// create materials
video::IGPUProgrammingServices* gpu = irrDriver->getGPUProgrammingServices();
newMaterialType1 = 0;
newMaterialType2 = 0;
if (gpu)
{
MyShaderCallBack* mc = new MyShaderCallBack(irrDevice,UseHighLevelShaders);
// create the shaders depending on if the user wanted high level
// or low level shaders:
if (UseHighLevelShaders)
{
// create material from high level shaders (hlsl or glsl)
newMaterialType1 = gpu->addHighLevelShaderMaterialFromFiles(
vsFileName, "vertexMain", video::EVST_VS_1_1,
psFileName, "pixelMain", video::EPST_PS_2_0,
mc, video::EMT_SOLID);
newMaterialType2 = gpu->addHighLevelShaderMaterialFromFiles(
vsFileName, "vertexMain", video::EVST_VS_1_1,
psFileName, "pixelMain", video::EPST_PS_2_0,
mc, video::EMT_TRANSPARENT_ADD_COLOR);
}
else
{
// create material from low level shaders (asm or arb_asm)
newMaterialType1 = gpu->addShaderMaterialFromFiles(vsFileName,
psFileName, mc, video::EMT_SOLID);
newMaterialType2 = gpu->addShaderMaterialFromFiles(vsFileName,
psFileName, mc, video::EMT_TRANSPARENT_ADD_COLOR);
}
mc->drop();
}
Code: Select all
tmp->node = irrSceneMgr->addSphereSceneNode(10.f,32);
tmp->node->setMaterialTexture(0, irrDriver->getTexture(skin));
tmp->node->setMaterialFlag(video::EMF_LIGHTING, false);
tmp->node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType1);