irrlicht/source/Irrlicht.NET/IMaterialRenderer.cpp

128 lines
3.5 KiB
C++

// Copyright (C) 2002-2006 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#include "IMaterialRenderer.h"
#include "NativeConverter.h"
namespace Irrlicht
{
namespace Video
{
IMaterialRendererServices::IMaterialRendererServices( irr::video::IMaterialRendererServices* realServices,
Irrlicht::Video::IVideoDriver* videoDriver )
: materialRendererServices(realServices), TheVideoDriver(videoDriver)
{
}
void IMaterialRendererServices::SetBasicRenderStates( Material material, Material lastMaterial,
bool resetAllRenderStates )
{
if (materialRendererServices)
materialRendererServices->setBasicRenderStates( irr::NativeConverter::getNativeMaterial( material ),
irr::NativeConverter::getNativeMaterial( lastMaterial ), resetAllRenderStates );
}
bool IMaterialRendererServices::SetVertexShaderConstant( String* name, float data __gc [], int count )
{
bool ret = false;
try
{
float* f = new float[data->get_Count()];
for( int i = 0; i < data->get_Count(); ++i )
f[i] = data[i];
char* str = (char*)(void*)
System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(name);
if (materialRendererServices)
ret = materialRendererServices->setVertexShaderConstant( str, f, count );
delete [] f;
System::Runtime::InteropServices::Marshal::FreeHGlobal(str);
}
catch(...)
{
System::Console::Out->WriteLine("Error while setting vertex shader constant: {0}", name);
}
return ret;
}
void IMaterialRendererServices::SetVertexShaderConstant( float data __gc [], int startRegister, int constantAmount )
{
try
{
float* f = new float[data->get_Count()];
for (int i=0; i<data->get_Count(); ++i)
f[i] = data[i];
materialRendererServices->setVertexShaderConstant(f, startRegister, constantAmount);
delete [] f;
}
catch(Exception* e)
{
System::Console::Out->WriteLine("Error while setting vertex shader constant: constantAmount:{0}, startRegister:{1}, ({2})", __box(constantAmount), __box(startRegister), e);
}
}
bool IMaterialRendererServices::SetPixelShaderConstant( String* name, float data __gc [], int count )
{
bool ret = false;
try
{
float* f = new float[data->get_Count()];
for( int i = 0; i < data->get_Count(); i++ )
f[i] = data[i];
char* str = (char*)(void*)
System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(name);
if (materialRendererServices)
ret = materialRendererServices->setPixelShaderConstant( str, f, count );
delete [] f;
System::Runtime::InteropServices::Marshal::FreeHGlobal(str);
}
catch(...)
{
System::Console::Out->WriteLine("Error while setting pixel shader constant: {0}", name );
}
return ret;
}
void IMaterialRendererServices::SetPixelShaderConstant( float data __gc [], int startRegister, int constantAmount )
{
try
{
float* f = new float[data->get_Count()];
for( int i = 0; i < data->get_Count(); i++ )
f[i] = data[i];
materialRendererServices->setPixelShaderConstant( f, startRegister, constantAmount );
delete [] f;
}
catch(Exception* e)
{
System::Console::Out->WriteLine("Error while setting pixel shader constant: constantAmount:{0}, startRegister:{1}, ({2})", __box(constantAmount), __box(startRegister), e);
}
}
Irrlicht::Video::IVideoDriver* IMaterialRendererServices::get_VideoDriver()
{
return TheVideoDriver;
}
}
}