Changes in 1.6 TA

- PixelBlend16 and PixelBlend16_simd are working for the new rules.
	- bugfix. CLightSceneNode didn't correctly update it's attributes
	
		Lighting Linear Attenuation.	= 1.f / radius
		
		The Example loadirr files set the lightscene radius to 1000.f but
		stays on the previous default attentuation with the older radius 100 -> 1.f / 100
		so the examples looks golden-brown.
		
		Now the radius is correctly!! set to the attenuation of 1.f/1000.f because the
		file doesn't have special attenuation. and now it looks more yellow.
		can anybody show me a correct screenshot for this file;-)? Niko?
		
		Or is this behavior the default lighting?. then it would be
		a fixed constant linear attenuation of 0.01f;-). Please clearify
		For now i didn't fixed it
		
		
		I encountered this behavior because i ( burning video ) used the original radius
		for calculations and so i've found that radius != 1.f / linearAttenuation but
		in the LightSceneNode this formula was used.. confused;-)
		

	- vector template and equals tests
		as working with the test suits i cleaned the template behavior (mixed types are
		used in the templates) and added all missing special math function with their coressponding type
		I also set the equal test for s32 to behave like the f32 routine.

		The function equals always implements a weak test.		
		that means a tolerance MUST always be used if you use the equal function. default is 1.
		you can set it to zero a==b-> equals ( a, b, 0 ) but do it explicit like you have to
		for floating compare. This is important when irrlicht is going to use special hardware
		math acceleration on a per function base, like sse2, or the other way round fixpoint.
	
	- VideoDriver drawPixel
		The HW renderes are using the alpha components for blending.
		The Software Renderes and image loaders are using CImage::setPixel copy. 
		so setPixel is engaged to either blends or copy the pixel
		default: false
	- Burningvideo
		added RenderMaterial EMT_SPHERE_MAP
			pushed burningsvideo to 0.43
		added RenderMaterial EMT_REFLECTION_2_LAYER
			pushed burningsvideo to 0.44
		set	EMT_TRANSPARENT_ALPHA_CHANNEL_REF
			to use AlphaRef 0.5 like Direct3D
			
		One Note: in OpenGL there is know difference between sphere_map and reflection layer
		both using GL_TEXTURE_GEN_MODE GL_SPHERE_MAP, whereas in d3d one time using camera_normal
		on sphere and reflection on refletcion_layer.
		
		The visual difference is that on sphere map the "image is not moving" when you rotate the 
		viewer. For Buring i took the opengl visual. always moving
				

	- rename quake3 SEntity to IEntity to be confom with IShader
		even IShader and IEntity are none pure virtual interfaces
		like most irrlicht objects


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@2207 dfc29bdd-3216-0410-991c-e03cc46cb475
master
engineer_apple 2009-02-10 15:08:23 +00:00
parent df30597294
commit 2340f9b849
69 changed files with 652 additions and 795 deletions

View File

@ -1,3 +1,64 @@
Changes in 1.6 TA
- PixelBlend16 and PixelBlend16_simd are working for the new rules;-)
- bugfix. CLightSceneNode didn't correctly update it's attributes
Lighting Linear Attenuation. = 1.f / radius
The Example loadirr files set the lightscene radius to 1000.f but
stays on the previous default attentuation with the older radius 100 -> 1.f / 100
so the examples looks golden-brown.
Now the radius is correctly!! set to the attenuation of 1.f/1000.f because the
file doesn't have special attenuation. and now it looks more yellow.
can anybody show me a correct screenshot for this file;-)? Niko?
Or is this behavior the default lighting?. then it would be
a fixed constant linear attenuation of 0.01f;-). Please clearify
For now i didn't fixed it
I encountered this behavior because i ( burning video ) used the original radius
for calculations and so i've found that radius != 1.f / linearAttenuation but
in the LightSceneNode this formula was used.. confused;-)
- vector template and equals tests
as working with the test suits i cleaned the template behavior (mixed types are
used in the templates) and added all missing special math function with their coressponding type
I also set the equal test for s32 to behave like the f32 routine.
The function equals always implements a weak test.
that means a tolerance MUST always be used if you use the equal function. default is 1.
you can set it to zero a==b-> equals ( a, b, 0 ) but do it explicit like you have to
for floating compare. This is important when irrlicht is going to use special hardware
math acceleration on a per function base, like sse2, or the other way round fixpoint.
- VideoDriver drawPixel
The HW renderes are using the alpha components for blending.
The Software Renderes and image loaders are using CImage::setPixel copy.
so setPixel is engaged to either blends or copy the pixel
default: false
- Burningvideo
added RenderMaterial EMT_SPHERE_MAP
pushed burningsvideo to 0.43
added RenderMaterial EMT_REFLECTION_2_LAYER
pushed burningsvideo to 0.44
set EMT_TRANSPARENT_ALPHA_CHANNEL_REF
to use AlphaRef 0.5 like Direct3D
One Note: in OpenGL there is know difference between sphere_map and reflection layer
both using GL_TEXTURE_GEN_MODE GL_SPHERE_MAP, whereas in d3d one time using camera_normal
on sphere and reflection on refletcion_layer.
The visual difference is that on sphere map the "image is not moving" when you rotate the
viewer. For Buring i took the opengl visual. always moving
- rename quake3 SEntity to IEntity to be confom with IShader
even IShader and IEntity are none pure virtual interfaces
like most irrlicht objects
--------------------------------------------------------------
Changes in 1.6 TA
- fixed createMeshWith2TCoords
normals were missing during copy.
@ -1533,7 +1594,7 @@ Font improvements:
Texture scaling bugfix, support for alpha blending, new option to normalise weights,
animation code optimization, fixed memory leak
- ROUNDING_ERROR is now ROUNDING_ERROR_32 or ROUNDING_ERROR_64
- ROUNDING_ERROR is now ROUNDING_ERROR_f32 or ROUNDING_ERROR_f64
- Material ZBuffer flag changed to a u32 value
Reason: change ( off or on ) to , off, lequal, equal

View File

@ -311,7 +311,7 @@ int IRRCALLCONV main(int argc, char* argv[])
{
quake3::tQ3EntityList &entityList = mesh->getEntityList ();
quake3::SEntity search;
quake3::IEntity search;
search.name = "info_player_deathmatch";
s32 index = entityList.binary_search ( search );

View File

@ -2,7 +2,7 @@
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
Name="17. HelloWorld for Windows Mobile on PC"
Name="17.HelloWorld for Windows Mobile on PC"
ProjectGUID="{2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}"
RootNamespace="My17HelloWorldforWindowsMobileonPC"
Keyword="Win32Proj"

View File

@ -73,7 +73,7 @@ public:
CMyLightManager(ISceneManager* sceneManager)
: Mode(NO_MANAGEMENT), RequestedMode(NO_MANAGEMENT),
SceneManager(sceneManager), SceneLightList(0),
CurrentRenderPass(0), CurrentSceneNode(0)
CurrentRenderPass(ESNRP_NONE), CurrentSceneNode(0)
{ }
virtual ~CMyLightManager(void) { }

View File

@ -30,8 +30,8 @@ struct GameData
{
GameData ( const string<c16> &startupDir);
void setDefault ();
s32 save ( const string<c16> filename );
s32 load ( const string<c16> filename );
s32 save ( const string<c16> &filename );
s32 load ( const string<c16> &filename );
s32 debugState;
s32 gravityState;
@ -50,6 +50,8 @@ struct GameData
vector3df PlayerPosition;
vector3df PlayerRotation;
tQ3EntityList Variable;
Q3LevelLoadParameter loadParam;
SIrrlichtCreationParameters deviceParam;
funcptr_createDeviceEx createExDevice;
@ -81,7 +83,11 @@ void GameData::setDefault ()
GammaValue = 1.f;
// default deviceParam;
#if defined ( _IRR_WINDOWS_ )
deviceParam.DriverType = EDT_DIRECT3D9;
#else
deviceParam.DriverType = EDT_OPENGL;
#endif
deviceParam.WindowSize.Width = 800;
deviceParam.WindowSize.Height = 600;
deviceParam.Fullscreen = false;
@ -93,6 +99,7 @@ void GameData::setDefault ()
// default Quake3 loadParam
loadParam.defaultLightMapMaterial = EMT_LIGHTMAP;
loadParam.defaultModulate = EMFN_MODULATE_1X;
loadParam.defaultFilter = EMF_ANISOTROPIC_FILTER;
loadParam.verbose = 1;
loadParam.mergeShaderBuffer = 1; // merge meshbuffers with same material
loadParam.cleanUnResolvedMeshes = 1; // should unresolved meshes be cleaned. otherwise blue texture
@ -111,27 +118,62 @@ void GameData::setDefault ()
}
/*!
Load the current game State
Load the current game State from a typical quake3 cfg file
*/
s32 GameData::load ( const string<c16> filename )
s32 GameData::load ( const string<c16> &filename )
{
if ( 0 == Device )
return 0;
//! the quake3 mesh loader can also handle *.shader and *.cfg file
IQ3LevelMesh* mesh = (IQ3LevelMesh*) Device->getSceneManager()->getMesh ( filename );
if ( 0 == mesh )
return 0;
tQ3EntityList &entityList = mesh->getEntityList ();
stringc s;
u32 pos;
for ( u32 e = 0; e != entityList.size (); ++e )
{
//dumpShader ( s, &entityList[e], false );
//printf ( s.c_str () );
for ( u32 g = 0; g != entityList[e].getGroupSize (); ++g )
{
const SVarGroup *group = entityList[e].getGroup ( g );
for ( u32 index = 0; index < group->Variable.size (); ++index )
{
const SVariable &v = group->Variable[index];
pos = 0;
if ( v.name == "playerposition" )
{
PlayerPosition = getAsVector3df ( v.content, pos );
}
else
if ( v.name == "playerrotation" )
{
PlayerRotation = getAsVector3df ( v.content, pos );
}
}
}
}
return 1;
}
/*!
Store the current game State
Store the current game State in a quake3 configuration file
*/
s32 GameData::save ( const string<c16> filename )
s32 GameData::save ( const string<c16> &filename )
{
return 0;
if ( 0 == Device )
return 0;
c8 buf[128];
u32 i;
// Store current Archive for restart
@ -142,7 +184,7 @@ s32 GameData::save ( const string<c16> filename )
CurrentArchiveList.push_back ( fs->getFileArchive ( i )->getArchiveName() );
}
// Store Player Position
// Store Player Position and Rotation
ICameraSceneNode * camera = Device->getSceneManager()->getActiveCamera ();
if ( camera )
{
@ -154,11 +196,16 @@ s32 GameData::save ( const string<c16> filename )
if ( 0 == file )
return 0;
c8 buf[128];
snprintf ( buf, 128, "playerposition %.f %.f %.f\nplayerrotation %.f %.f %.f\n",
PlayerPosition.X, PlayerPosition.Y, PlayerPosition.Z,
PlayerRotation.X, PlayerRotation.Y, PlayerRotation.Z);
PlayerPosition.X, PlayerPosition.Z, PlayerPosition.Y,
PlayerRotation.X, PlayerRotation.Z, PlayerRotation.Y);
file->write ( buf, (s32) strlen ( buf ) );
for ( i = 0; i != fs->getFileArchiveCount(); ++i )
{
snprintf ( buf, 128, "archive %s\n",stringc ( fs->getFileArchive ( i )->getArchiveName() ).c_str () );
file->write ( buf, (s32) strlen ( buf ) );
}
file->drop ();
return 1;
}
@ -1045,7 +1092,7 @@ void CQuake3EventHandler::LoadMap ( const stringw &mapName, s32 collision )
/*
Now construct Models from Entity List
*/
Q3ModelFactory ( Game->loadParam, Game->Device, Mesh, ItemParent );
Q3ModelFactory ( Game->loadParam, Game->Device, Mesh, ItemParent, false );
}

View File

@ -504,7 +504,8 @@ void Q3ShaderFactory ( Q3LevelLoadParameter &loadParam,
void Q3ModelFactory ( Q3LevelLoadParameter &loadParam,
IrrlichtDevice *device,
IQ3LevelMesh* masterMesh,
ISceneNode *parent
ISceneNode *parent,
bool showShaderName
)
{
if ( 0 == masterMesh )
@ -516,7 +517,7 @@ void Q3ModelFactory ( Q3LevelLoadParameter &loadParam,
char buf[128];
const SVarGroup *group;
SEntity search;
IEntity search;
s32 index;
s32 lastIndex;
@ -526,7 +527,7 @@ void Q3ModelFactory ( Q3LevelLoadParameter &loadParam,
f = fopen ( "entity.txt", "wb" );
for ( index = 0; (u32) index < entityList.size (); ++index )
{
const SEntity *entity = &entityList[ index ];
const IEntity *entity = &entityList[ index ];
s = entity->name;
dumpShader ( s, entity );
fwrite ( s.c_str(), 1, s.size(), f );
@ -544,7 +545,6 @@ void Q3ModelFactory ( Q3LevelLoadParameter &loadParam,
u32 nodeCount = 0;
tTexArray textureArray;
bool showShaderName = true;
IGUIFont *font = 0;
if ( showShaderName )
font = device->getGUIEnvironment()->getFont("fontlucida.png");
@ -562,7 +562,6 @@ void Q3ModelFactory ( Q3LevelLoadParameter &loadParam,
p = getAsVector3df ( entity[index].getGroup(1)->get ( "origin" ), pos );
nodeCount += 1;
showShaderName = true;
for ( u32 g = 0; g < 2; ++g )
{
if ( 0 == itemElement->model[g] || itemElement->model[g][0] == 0 )
@ -618,7 +617,7 @@ void Q3ModelFactory ( Q3LevelLoadParameter &loadParam,
node->addAnimator ( anim );
anim->drop ();
}
continue;
if ( itemElement->special & SPECIAL_SFX_BOUNCE )
{
//anim = smgr->createFlyStraightAnimator (
@ -693,7 +692,7 @@ s32 Q3StartPosition ( IQ3LevelMesh* mesh,
tQ3EntityList &entityList = mesh->getEntityList ();
SEntity search;
IEntity search;
search.name = "info_player_start"; // "info_player_deathmatch";
// find all entities in the multi-list

View File

@ -96,7 +96,8 @@ void Q3ShaderFactory ( Q3LevelLoadParameter &loadParam,
void Q3ModelFactory ( Q3LevelLoadParameter &loadParam,
IrrlichtDevice *device,
IQ3LevelMesh* masterMesh,
ISceneNode *parent
ISceneNode *parent,
bool showShaderName
);
/*!

View File

@ -64,7 +64,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "21.Quake3Explorer_vc8", "21
{E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "17. HelloWorld for Windows Mobile on PC", "17.HelloWorld_Mobile\17. HelloWorld for Windows Mobile on PC_v8.vcproj", "{2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "17.HelloWorld for Windows Mobile on PC", "17.HelloWorld_Mobile\17. HelloWorld for Windows Mobile on PC_v8.vcproj", "{2A29B6B1-AFC4-46C7-9944-7052AAE66F7B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@ -63,7 +63,7 @@ bool CMainMenu::run(bool& outFullscreen, bool& outMusic, bool& outShadows,
box->addItem(L"OpenGL 1.5");
box->addItem(L"Direct3D 8.1");
box->addItem(L"Direct3D 9.0c");
box->addItem(L"Burning's Video 0.42");
box->addItem(L"Burning's Video 0.44");
box->addItem(L"Irrlicht Software Renderer 1.0");
box->setSelected(selected);
@ -111,7 +111,7 @@ bool CMainMenu::run(bool& outFullscreen, bool& outMusic, bool& outShadows,
modelNode->setMaterialTexture(0, driver->getTexture("../../media/faerie2.bmp"));
modelNode->setMaterialFlag(video::EMF_LIGHTING, true);
modelNode->getMaterial(0).Shininess = 50.f;
//modelNode->getMaterial(0).NormalizeNormals = true;
modelNode->getMaterial(0).NormalizeNormals = true;
modelNode->setMD2Animation(scene::EMAT_STAND);
}

View File

@ -76,7 +76,7 @@ public:
virtual SColor getPixel(u32 x, u32 y) const = 0;
//! Sets a pixel
virtual void setPixel(u32 x, u32 y, const SColor &color ) = 0;
virtual void setPixel(u32 x, u32 y, const SColor &color, bool blend = false ) = 0;
//! Returns the color format
virtual ECOLOR_FORMAT getColorFormat() const = 0;
@ -114,7 +114,7 @@ public:
const core::rect<s32>* clipRect = 0) =0;
//! copies this surface into another, scaling it to fit, appyling a box filter
virtual void copyToScalingBoxFilter(IImage* target, s32 bias = 0) = 0;
virtual void copyToScalingBoxFilter(IImage* target, s32 bias = 0, bool blend = false) = 0;
//! fills the surface with black or white
virtual void fill(const SColor &color) =0;

View File

@ -184,7 +184,7 @@ namespace scene
\return Mesh without redundant vertices. If you no longer need
the cloned mesh, you should call IMesh::drop(). See
IReferenceCounted::drop() for more information. */
virtual IMesh* createMeshWelded(IMesh* mesh, f32 tolerance=core::ROUNDING_ERROR_32) const = 0;
virtual IMesh* createMeshWelded(IMesh* mesh, f32 tolerance=core::ROUNDING_ERROR_f32) const = 0;
//! Get amount of polygons in mesh.
/** \param mesh Input mesh

View File

@ -39,6 +39,7 @@ namespace quake3
Q3LevelLoadParameter ()
:defaultLightMapMaterial ( video::EMT_LIGHTMAP_M4 ),
defaultModulate ( video::EMFN_MODULATE_4X ),
defaultFilter ( video::EMF_BILINEAR_FILTER ),
patchTesselation ( 8 ),
verbose ( 0 ),
startTime ( 0 ), endTime ( 0 ),
@ -59,6 +60,7 @@ namespace quake3
video::E_MATERIAL_TYPE defaultLightMapMaterial;
video::E_MODULATE_FUNC defaultModulate;
video::E_MATERIAL_FLAG defaultFilter;
s32 patchTesselation;
s32 verbose;
u32 startTime;
@ -121,6 +123,7 @@ namespace quake3
return v;
}
/*
extract substrings
*/
@ -570,7 +573,7 @@ namespace quake3
// string database. "a" = "Hello", "b" = "1234.6"
struct SVarGroup
{
SVarGroup () {}
SVarGroup () { Variable.setAllocStrategy ( core::ALLOC_STRATEGY_SAFE ); }
virtual ~SVarGroup () {}
u32 isDefined ( const c8 * name, const c8 * content = 0 ) const
@ -656,6 +659,13 @@ namespace quake3
//return name < other.name;
}
const u32 getGroupSize () const
{
if ( 0 == VarGroup )
return 0;
return VarGroup->VariableGroup.size ();
}
const SVarGroup * getGroup ( u32 stage ) const
{
if ( 0 == VarGroup || stage >= VarGroup->VariableGroup.size () )
@ -673,9 +683,9 @@ namespace quake3
core::stringc name;
};
typedef IShader SEntity;
typedef IShader IEntity;
typedef core::array < SEntity > tQ3EntityList;
typedef core::array < IEntity > tQ3EntityList;
/*
dump shader like original layout, regardless of internal data holding
@ -722,7 +732,10 @@ namespace quake3
}
inline core::stringc & dumpShader ( core::stringc &dest, const IShader * shader )
/*!
dump a Shader or an Entity
*/
inline core::stringc & dumpShader ( core::stringc &dest, const IShader * shader, bool entity = false )
{
if ( 0 == shader )
return dest;
@ -736,17 +749,18 @@ namespace quake3
dumpVarGroup ( dest, group, core::clamp( (int)i, 0, 2 ) );
}
if ( size <= 1 )
if ( !entity )
{
dest.append ( "{\n" );
if ( size <= 1 )
{
dest.append ( "{\n" );
}
dest.append ( "}\n" );
}
dest.append ( "}\n" );
return dest;
}
/*
quake3 doesn't care much about tga & jpg
load one or multiple files stored in name started at startPos to the texture array textures

View File

@ -32,8 +32,9 @@ namespace core
//! Rounding error constant often used when comparing f32 values.
const f32 ROUNDING_ERROR_32 = 0.000001f;
const f64 ROUNDING_ERROR_64 = 0.00000001;
const s32 ROUNDING_ERROR_S32 = 1;
const f32 ROUNDING_ERROR_f32 = 0.000001f;
const f64 ROUNDING_ERROR_f64 = 0.00000001;
#ifdef PI // make sure we don't collide with a define
#undef PI
@ -155,17 +156,17 @@ namespace core
}
//! returns if a equals b, taking possible rounding errors into account
inline bool equals(const f64 a, const f64 b, const f64 tolerance = ROUNDING_ERROR_64)
inline bool equals(const f64 a, const f64 b, const f64 tolerance = ROUNDING_ERROR_f64)
{
return (a + tolerance >= b) && (a - tolerance <= b);
}
//! returns if a equals b, taking possible rounding errors into account
inline bool equals(const f32 a, const f32 b, const f32 tolerance = ROUNDING_ERROR_32)
inline bool equals(const f32 a, const f32 b, const f32 tolerance = ROUNDING_ERROR_f32)
{
return (a + tolerance >= b) && (a - tolerance <= b);
}
#if 0
//! returns if a equals b, not using any rounding tolerance
inline bool equals(const s32 a, const s32 b)
{
@ -177,34 +178,34 @@ namespace core
{
return (a == b);
}
#endif
//! returns if a equals b, taking an explicit rounding tolerance into account
inline bool equals(const s32 a, const s32 b, const s32 tolerance)
inline bool equals(const s32 a, const s32 b, const s32 tolerance = ROUNDING_ERROR_S32)
{
return (a + tolerance >= b) && (a - tolerance <= b);
}
//! returns if a equals b, taking an explicit rounding tolerance into account
inline bool equals(const u32 a, const u32 b, const u32 tolerance)
inline bool equals(const u32 a, const u32 b, const s32 tolerance = ROUNDING_ERROR_S32)
{
return (a + tolerance >= b) && (a - tolerance <= b);
}
//! returns if a equals zero, taking rounding errors into account
inline bool iszero(const f64 a, const f64 tolerance = ROUNDING_ERROR_64)
inline bool iszero(const f64 a, const f64 tolerance = ROUNDING_ERROR_f64)
{
return fabs(a) <= tolerance;
}
//! returns if a equals zero, taking rounding errors into account
inline bool iszero(const f32 a, const f32 tolerance = ROUNDING_ERROR_32)
inline bool iszero(const f32 a, const f32 tolerance = ROUNDING_ERROR_f32)
{
return fabsf(a) <= tolerance;
}
//! returns if a equals not zero, taking rounding errors into account
inline bool isnotzero(const f32 a, const f32 tolerance = ROUNDING_ERROR_32)
inline bool isnotzero(const f32 a, const f32 tolerance = ROUNDING_ERROR_f32)
{
return fabsf(a) > tolerance;
}
@ -325,7 +326,7 @@ namespace core
}
//! conditional set based on mask and arithmetic shift
REALINLINE u16 if_c_a_else_b ( const s16 condition, const s16 a, const s16 b )
REALINLINE u16 if_c_a_else_b ( const s16 condition, const u16 a, const u16 b )
{
return ( ( -condition >> 15 ) & ( a ^ b ) ) ^ b;
}
@ -379,6 +380,12 @@ namespace core
return sqrt ( f );
}
// calculate: sqrt ( x )
REALINLINE s32 squareroot(const s32 f)
{
return (s32) sqrt ( (f32) f );
}
// calculate: 1 / sqrt ( x )
REALINLINE f64 reciprocal_squareroot(const f64 x)
{
@ -411,6 +418,12 @@ namespace core
#endif
}
// calculate: 1 / sqrt ( x )
REALINLINE s32 reciprocal_squareroot(const s32 s)
{
return (s32) ( 1.f / sqrtf ( (f32) s ) );
}
// calculate: 1 / x
REALINLINE f32 reciprocal ( const f32 f )
{
@ -444,6 +457,12 @@ namespace core
#endif
}
// calculate: 1 / x
REALINLINE f64 reciprocal ( const f64 f )
{
return 1.0 / f;
}
// calculate: 1 / x, low precision allowed
REALINLINE f32 reciprocal_approxim ( const f32 f )

View File

@ -848,7 +848,7 @@ namespace core
f64 rotx, roty, X, Z;
if (fabs(C)>ROUNDING_ERROR_64)
if (fabs(C)>ROUNDING_ERROR_f64)
{
const T invC = (T)(1.0/C);
rotx = mat(2,2) * invC;

View File

@ -131,10 +131,10 @@ class plane3d
{
const T d = Normal.dotProduct(point) + D;
if (d < -ROUNDING_ERROR_32)
if (d < -ROUNDING_ERROR_f32)
return ISREL3D_BACK;
if (d > ROUNDING_ERROR_32)
if (d > ROUNDING_ERROR_f32)
return ISREL3D_FRONT;
return ISREL3D_PLANAR;
@ -157,7 +157,7 @@ class plane3d
bool existsIntersection(const plane3d<T>& other) const
{
vector3d<T> cross = other.Normal.crossProduct(Normal);
return cross.getLength() > core::ROUNDING_ERROR_32;
return cross.getLength() > core::ROUNDING_ERROR_f32;
}
//! Intersects this plane with another.
@ -174,7 +174,7 @@ class plane3d
const T fn11 = other.Normal.getLength();
const f64 det = fn00*fn11 - fn01*fn01;
if (fabs(det) < ROUNDING_ERROR_64 )
if (fabs(det) < ROUNDING_ERROR_f64 )
return false;
const f64 invdet = 1.0 / det;

View File

@ -76,7 +76,7 @@ namespace core
// functions
//! returns if this vector equals the other one, taking floating point rounding errors into account
bool equals(const vector3d<T>& other, const T tolerance = (T)ROUNDING_ERROR_32 ) const
bool equals(const vector3d<T>& other, const T tolerance = (T)ROUNDING_ERROR_f32 ) const
{
return core::equals(X, other.X, tolerance) &&
core::equals(Y, other.Y, tolerance) &&
@ -140,14 +140,7 @@ namespace core
\return Reference to this vector after normalization. */
vector3d<T>& normalize()
{
#if 0
f32 length = (f32)(X*X + Y*Y + Z*Z);
if (core::equals(length, 0.f))
return *this;
length = core::reciprocal_squareroot ( (f32)length );
#else
const T length = core::reciprocal_squareroot ( (T) (X*X + Y*Y + Z*Z) );
#endif
const f64 length = core::reciprocal_squareroot ( (f64) (X*X + Y*Y + Z*Z) );
X = (T)(X * length);
Y = (T)(Y * length);

View File

@ -297,7 +297,7 @@ void CGUIColorSelectDialog::buildColorRing( const core::dimension2d<u32> & dim,
if ( supersample > 1 )
{
video::CImage * filter = new video::CImage(video::ECF_A8R8G8B8, dim );
RawTexture->copyToScalingBoxFilter(filter, 0);
RawTexture->copyToScalingBoxFilter(filter);
RawTexture->drop();
RawTexture = filter;
}

View File

@ -1220,7 +1220,7 @@ u32 CImage::getBitsPerPixelFromFormat(ECOLOR_FORMAT format)
}
//! sets a pixel
void CImage::setPixel(u32 x, u32 y, const SColor &color )
void CImage::setPixel(u32 x, u32 y, const SColor &color, bool blend )
{
if (x >= (u32)Size.Width || y >= (u32)Size.Height)
return;
@ -1250,7 +1250,7 @@ void CImage::setPixel(u32 x, u32 y, const SColor &color )
case ECF_A8R8G8B8:
{
u32 * dest = (u32*) ((u8*) Data + ( y * Pitch ) + ( x << 2 ));
*dest = color.color;
*dest = blend ? PixelBlend32 ( *dest, color.color ) : color.color;
} break;
}
}
@ -1437,7 +1437,7 @@ void CImage::copyToScaling(IImage* target)
}
//! copies this surface into another, scaling it to fit it.
void CImage::copyToScalingBoxFilter(IImage* target, s32 bias)
void CImage::copyToScalingBoxFilter(IImage* target, s32 bias, bool blend)
{
const core::dimension2d<u32> destSize = target->getDimension();
@ -1457,7 +1457,8 @@ void CImage::copyToScalingBoxFilter(IImage* target, s32 bias)
sx = 0.f;
for ( u32 x = 0; x != destSize.Width; ++x )
{
target->setPixel( x, y, getPixelBox( core::floor32(sx), core::floor32(sy), fx, fy, bias ) );
target->setPixel( x, y,
getPixelBox( core::floor32(sx), core::floor32(sy), fx, fy, bias ), blend );
sx += sourceXStep;
}
sy += sourceYStep;
@ -1504,13 +1505,16 @@ inline SColor CImage::getPixelBox( s32 x, s32 y, s32 fx, s32 fy, s32 bias ) cons
{
for ( s32 dy = 0; dy != fy; ++dy )
{
c = getPixel( x + dx , y + dy );
c = getPixel( core::s32_min ( x + dx, Size.Width - 1 ) ,
core::s32_min ( y + dy, Size.Height - 1 )
);
a += c.getAlpha();
r += c.getRed();
g += c.getGreen();
b += c.getBlue();
}
}
s32 sdiv = s32_log2_s32(fx * fy);

View File

@ -79,7 +79,7 @@ public:
virtual SColor getPixel(u32 x, u32 y) const;
//! sets a pixel
virtual void setPixel(u32 x, u32 y, const SColor &color );
virtual void setPixel(u32 x, u32 y, const SColor &color, bool blend = false );
//! returns the color format
virtual ECOLOR_FORMAT getColorFormat() const;
@ -105,7 +105,7 @@ public:
const core::rect<s32>* clipRect = 0);
//! copies this surface into another, scaling it to fit, appyling a box filter
virtual void copyToScalingBoxFilter(IImage* target, s32 bias = 0);
virtual void copyToScalingBoxFilter(IImage* target, s32 bias = 0, bool blend = false);
//! fills the surface with black or white
virtual void fill(const SColor &color);

View File

@ -28,7 +28,6 @@ CLightSceneNode::CLightSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
LightData.SpecularColor = color.getInterpolated(video::SColor(255,255,255,255),0.7f);
setRadius(radius);
doLightRecalc();
}
@ -129,6 +128,7 @@ void CLightSceneNode::setRadius(f32 radius)
{
LightData.Radius=radius;
LightData.Attenuation.set(0.f, 1.f/radius, 0.f);
doLightRecalc();
}
@ -177,7 +177,6 @@ bool CLightSceneNode::getCastShadow() const
void CLightSceneNode::doLightRecalc()
{
//LightData.Type = video::ELT_DIRECTIONAL;
if ((LightData.Type == video::ELT_SPOT) || (LightData.Type == video::ELT_DIRECTIONAL))
{
LightData.Direction = core::vector3df(.0f,.0f,1.0f);
@ -223,18 +222,28 @@ void CLightSceneNode::deserializeAttributes(io::IAttributes* in, io::SAttributeR
LightData.AmbientColor = in->getAttributeAsColorf("AmbientColor");
LightData.DiffuseColor = in->getAttributeAsColorf("DiffuseColor");
LightData.SpecularColor = in->getAttributeAsColorf("SpecularColor");
//TODO: clearify Radius and Linear Attenuation
#if 0
setRadius ( in->getAttributeAsFloat("Radius") );
#else
LightData.Radius = in->getAttributeAsFloat("Radius");
#endif
if (in->existsAttribute("Attenuation")) // might not exist in older files
LightData.Attenuation = in->getAttributeAsVector3d("Attenuation");
if (in->existsAttribute("OuterCone")) // might not exist in older files
LightData.OuterCone = in->getAttributeAsFloat("OuterCone");
if (in->existsAttribute("InnerCone")) // might not exist in older files
LightData.InnerCone = in->getAttributeAsFloat("InnerCone");
if (in->existsAttribute("Falloff")) // might not exist in older files
LightData.Falloff = in->getAttributeAsFloat("Falloff");
LightData.Radius = in->getAttributeAsFloat("Radius");
LightData.CastShadows = in->getAttributeAsBool("CastShadows");
LightData.Type = (video::E_LIGHT_TYPE)in->getAttributeAsEnumeration("LightType", video::LightTypeNames);
doLightRecalc ();
ILightSceneNode::deserializeAttributes(in, options);
}

View File

@ -104,7 +104,7 @@ public:
virtual IMesh* createMeshUniquePrimitives(IMesh* mesh) const;
//! Creates a copy of the mesh, which will have all duplicated vertices removed, i.e. maximal amount of vertices are shared via indexing.
virtual IMesh* createMeshWelded(IMesh *mesh, f32 tolerance=core::ROUNDING_ERROR_32) const;
virtual IMesh* createMeshWelded(IMesh *mesh, f32 tolerance=core::ROUNDING_ERROR_f32) const;
//! Returns amount of polygons in mesh.
virtual s32 getPolyCount(scene::IMesh* mesh) const;

View File

@ -923,7 +923,7 @@ void CNullDriver::makeColorKeyTexture(video::ITexture* texture,
if (texture->getColorFormat() == ECF_A1R5G5B5)
{
s16 *p = (s16*)texture->lock();
u16 *p = (u16*)texture->lock();
if (!p)
{
@ -932,14 +932,14 @@ void CNullDriver::makeColorKeyTexture(video::ITexture* texture,
}
const core::dimension2d<u32> dim = texture->getSize();
const s32 pitch = texture->getPitch() / 2;
const u32 pitch = texture->getPitch() / 2;
// color with alpha disabled (i.e. fully transparent)
const s16 refZeroAlpha = (0x7fff & color.toA1R5G5B5());
const u16 refZeroAlpha = (0x7fff & color.toA1R5G5B5());
const s32 pixels = pitch * dim.Height;
const u32 pixels = pitch * dim.Height;
for (s32 pixel = 0; pixel < pixels; ++ pixel)
for (u32 pixel = 0; pixel < pixels; ++ pixel)
{
// If the colour matches the reference colour, ignoring alphas,
// set the alpha to zero.
@ -958,7 +958,7 @@ void CNullDriver::makeColorKeyTexture(video::ITexture* texture,
}
else
{
s32 *p = (s32*)texture->lock();
u32 *p = (u32*)texture->lock();
if (!p)
{
@ -967,13 +967,13 @@ void CNullDriver::makeColorKeyTexture(video::ITexture* texture,
}
core::dimension2d<u32> dim = texture->getSize();
s32 pitch = texture->getPitch() / 4;
u32 pitch = texture->getPitch() / 4;
// color with alpha disabled (fully transparent)
const s32 refZeroAlpha = 0x00ffffff & color.color;
const u32 refZeroAlpha = 0x00ffffff & color.color;
const s32 pixels = pitch * dim.Height;
for (s32 pixel = 0; pixel < pixels; ++ pixel)
const u32 pixels = pitch * dim.Height;
for (u32 pixel = 0; pixel < pixels; ++ pixel)
{
// If the colour matches the reference colour, ignoring alphas,
// set the alpha to zero.
@ -1013,7 +1013,7 @@ void CNullDriver::makeColorKeyTexture(video::ITexture* texture,
if (texture->getColorFormat() == ECF_A1R5G5B5)
{
s16 *p = (s16*)texture->lock();
u16 *p = (u16*)texture->lock();
if (!p)
{
@ -1021,15 +1021,15 @@ void CNullDriver::makeColorKeyTexture(video::ITexture* texture,
return;
}
s32 pitch = texture->getPitch() / 2;
u32 pitch = texture->getPitch() / 2;
const s16 key16Bit = 0x7fff & p[colorKeyPixelPos.Y*pitch + colorKeyPixelPos.X];
const u16 key16Bit = 0x7fff & p[colorKeyPixelPos.Y*pitch + colorKeyPixelPos.X];
colorKey = video::A1R5G5B5toA8R8G8B8(key16Bit);
}
else
{
s32 *p = (s32*)texture->lock();
u32 *p = (u32*)texture->lock();
if (!p)
{
@ -1037,7 +1037,7 @@ void CNullDriver::makeColorKeyTexture(video::ITexture* texture,
return;
}
s32 pitch = texture->getPitch() / 4;
u32 pitch = texture->getPitch() / 4;
colorKey = 0x00ffffff & p[colorKeyPixelPos.Y*pitch + colorKeyPixelPos.X];
}

View File

@ -1386,22 +1386,6 @@ void CQ3LevelMesh::getConfiguration( io::IReadFile* file )
Entity.getLast().name = file->getFileName();
}
// entity only has only one valid level.. and no assoziative name..
void CQ3LevelMesh::scriptcallback_config( SVarGroupList *& grouplist, eToken token )
{
if ( token == Q3_TOKEN_END_LIST || 0 == grouplist->VariableGroup[0].Variable.size () )
return;
grouplist->grab();
SEntity element;
element.VarGroup = grouplist;
element.id = Entity.size();
element.name = "configuration";
Entity.push_back( element );
}
//! get's an interface to the entities
tQ3EntityList & CQ3LevelMesh::getEntityList()
@ -1620,6 +1604,33 @@ void CQ3LevelMesh::ReleaseEntity()
}
// config in simple (quake3) and advanced style
void CQ3LevelMesh::scriptcallback_config( SVarGroupList *& grouplist, eToken token )
{
IShader element;
if ( token == Q3_TOKEN_END_LIST )
{
if ( 0 == grouplist->VariableGroup[0].Variable.size() )
return;
element.name = grouplist->VariableGroup[0].Variable[0].name;
}
else
{
if ( grouplist->VariableGroup.size() != 2 )
return;
element.name = "configuration";
}
grouplist->grab();
element.VarGroup = grouplist;
element.id = Entity.size();
Entity.push_back( element );
}
// entity only has only one valid level.. and no assoziative name..
void CQ3LevelMesh::scriptcallback_entity( SVarGroupList *& grouplist, eToken token )
{
@ -1628,7 +1639,7 @@ void CQ3LevelMesh::scriptcallback_entity( SVarGroupList *& grouplist, eToken tok
grouplist->grab();
SEntity element;
IEntity element;
element.VarGroup = grouplist;
element.id = Entity.size();
element.name = grouplist->VariableGroup[1].get( "classname" );
@ -1641,13 +1652,9 @@ void CQ3LevelMesh::scriptcallback_entity( SVarGroupList *& grouplist, eToken tok
//!. script callback for shaders
void CQ3LevelMesh::scriptcallback_shader( SVarGroupList *& grouplist,eToken token )
{
if ( token != Q3_TOKEN_END_LIST )
if ( token != Q3_TOKEN_END_LIST || grouplist->VariableGroup[0].Variable.size()==0)
return;
// TODO: There might be something wrong with this fix, but it avoids a core dump...
if (grouplist->VariableGroup[0].Variable.size()==0)
return;
// end fix
IShader element;

View File

@ -419,7 +419,7 @@ namespace scene
u32 sourcesize;
u32 index;
core::stringc token;
u32 tokenresult;
eToken tokenresult;
};
SQ3Parser Parser;

View File

@ -379,6 +379,8 @@ void CQuake3ShaderSceneNode::render()
material.MaterialTypeParam = blendfunc.param0;
material.TextureLayer[0].TextureWrap = q.TextureAddressMode;
//material.TextureLayer[0].TrilinearFilter = 1;
//material.TextureLayer[0].AnisotropicFilter = 0xFF;
material.setTextureMatrix( 0, textureMatrix );
driver->setMaterial( material );

View File

@ -815,7 +815,7 @@ void CSoftwareDriver::draw2DLine(const core::position2d<s32>& start,
//! Draws a pixel
void CSoftwareDriver::drawPixel(u32 x, u32 y, const SColor & color)
{
((CImage*)BackBuffer)->setPixel(x, y, color);
((CImage*)BackBuffer)->setPixel(x, y, color, true);
}

View File

@ -163,6 +163,9 @@ void CBurningVideoDriver::setCurrentShader()
EBurningFFShader shader = zMaterialTest ? ETR_TEXTURE_GOURAUD : ETR_TEXTURE_GOURAUD_NOZ;
TransformationFlag[ ETS_TEXTURE_0] &= ~(ETF_TEXGEN_CAMERA_NORMAL|ETF_TEXGEN_CAMERA_REFLECTION);
LightSpace.Flags &= ~VERTEXTRANSFORM;
switch ( Material.org.MaterialType )
{
case EMT_ONETEXTURE_BLEND:
@ -170,6 +173,8 @@ void CBurningVideoDriver::setCurrentShader()
break;
case EMT_TRANSPARENT_ALPHA_CHANNEL_REF:
Material.org.MaterialTypeParam = 0.5f;
// fall through
case EMT_TRANSPARENT_ALPHA_CHANNEL:
if ( texture0 && texture0->hasAlpha () )
{
@ -214,8 +219,14 @@ void CBurningVideoDriver::setCurrentShader()
shader = ETR_TEXTURE_GOURAUD_DETAIL_MAP;
break;
case EMT_SPHERE_MAP:
TransformationFlag[ ETS_TEXTURE_0] |= ETF_TEXGEN_CAMERA_REFLECTION; // ETF_TEXGEN_CAMERA_NORMAL;
LightSpace.Flags |= VERTEXTRANSFORM;
break;
case EMT_REFLECTION_2_LAYER:
shader = ETR_INVALID;
shader = ETR_TEXTURE_GOURAUD_LIGHTMAP_M1;
TransformationFlag[ ETS_TEXTURE_1] |= ETF_TEXGEN_CAMERA_REFLECTION;
LightSpace.Flags |= VERTEXTRANSFORM;
break;
default:
@ -292,7 +303,7 @@ bool CBurningVideoDriver::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
void CBurningVideoDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matrix4& mat)
{
Transformation[state] = mat;
TransformationFlag[state] = mat.isIdentity();
core::setbit_cond ( TransformationFlag[state], mat.isIdentity(), ETF_IDENTITY );
switch ( state )
{
@ -301,11 +312,11 @@ void CBurningVideoDriver::setTransform(E_TRANSFORMATION_STATE state, const core:
Transformation[ETS_PROJECTION],
Transformation[ETS_VIEW]
);
TransformationFlag [ ETS_VIEW_INVERSE ] = 0;
getCameraPosWorldSpace ();
break;
case ETS_WORLD:
if ( TransformationFlag[state] )
if ( TransformationFlag[state] & ETF_IDENTITY )
{
Transformation[ETS_CURRENT] = Transformation[ETS_VIEW_PROJECTION];
}
@ -318,6 +329,12 @@ void CBurningVideoDriver::setTransform(E_TRANSFORMATION_STATE state, const core:
}
TransformationFlag[ETS_CURRENT] = 0;
break;
case ETS_TEXTURE_0:
case ETS_TEXTURE_1:
case ETS_TEXTURE_2:
case ETS_TEXTURE_3:
if ( 0 == (TransformationFlag[state] & ETF_IDENTITY ) )
LightSpace.Flags |= VERTEXTRANSFORM;
default:
break;
}
@ -335,9 +352,10 @@ bool CBurningVideoDriver::beginScene(bool backBuffer, bool zBuffer,
if (backBuffer && BackBuffer)
BackBuffer->fill(color);
if (DepthBuffer && zBuffer)
if (zBuffer && DepthBuffer)
DepthBuffer->clear();
memset ( TransformationFlag, 0, sizeof ( TransformationFlag ) );
return true;
}
@ -744,12 +762,12 @@ inline f32 CBurningVideoDriver::texelarea2 ( const s4DVertex **v, s32 tex ) cons
/*!
*/
inline void CBurningVideoDriver::select_polygon_mipmap ( s4DVertex *v, u32 vIn, s32 tex )
inline void CBurningVideoDriver::select_polygon_mipmap ( s4DVertex *v, u32 vIn, u32 tex, const core::dimension2du& texSize )
{
f32 f[2];
f[0] = (f32) MAT_TEXTURE ( tex )->getSize().Width;
f[1] = (f32) MAT_TEXTURE ( tex )->getSize().Height;
f[0] = (f32) texSize.Width - 0.25f;
f[1] = (f32) texSize.Height - 0.25f;
#ifdef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT
for ( u32 g = 0; g != vIn; g += 2 )
@ -766,12 +784,12 @@ inline void CBurningVideoDriver::select_polygon_mipmap ( s4DVertex *v, u32 vIn,
#endif
}
inline void CBurningVideoDriver::select_polygon_mipmap2 ( s4DVertex **v, s32 tex ) const
inline void CBurningVideoDriver::select_polygon_mipmap2 ( s4DVertex **v, u32 tex, const core::dimension2du& texSize ) const
{
f32 f[2];
f[0] = (f32) MAT_TEXTURE ( tex )->getSize().Width;
f[1] = (f32) MAT_TEXTURE ( tex )->getSize().Height;
f[0] = (f32) texSize.Width - 0.25f;
f[1] = (f32) texSize.Height - 0.25f;
#ifdef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT
(v[0] + 1 )->Tex[tex].x = v[0]->Tex[tex].x * ( v[0] + 1 )->Pos.w * f[0];
@ -800,7 +818,8 @@ const SVSize CBurningVideoDriver::vSize[] =
{
{ VERTEX4D_FORMAT_TEXTURE_1 | VERTEX4D_FORMAT_COLOR_1, sizeof(S3DVertex), 1 },
{ VERTEX4D_FORMAT_TEXTURE_2 | VERTEX4D_FORMAT_COLOR_1, sizeof(S3DVertex2TCoords),2 },
{ VERTEX4D_FORMAT_TEXTURE_2 | VERTEX4D_FORMAT_COLOR_1, sizeof(S3DVertexTangents),2 }
{ VERTEX4D_FORMAT_TEXTURE_2 | VERTEX4D_FORMAT_COLOR_1, sizeof(S3DVertexTangents),2 },
{ VERTEX4D_FORMAT_TEXTURE_2 | VERTEX4D_FORMAT_COLOR_1, sizeof(S3DVertex), 2 },
};
@ -828,24 +847,61 @@ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex,
dest = (s4DVertex *) ( (u8*) VertexCache.mem.data + ( destIndex << ( SIZEOF_SVERTEX_LOG2 + 1 ) ) );
// transform Model * World * Camera * Projection * NDCSpace matrix
Transformation [ ETS_CURRENT].transformVect ( &dest->Pos.x, ((S3DVertex*) source )->Pos );
const S3DVertex *base = ((S3DVertex*) source );
Transformation [ ETS_CURRENT].transformVect ( &dest->Pos.x, base->Pos );
#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR
// light Vertex
#ifdef SOFTWARE_DRIVER_2_LIGHTING
lightVertex ( dest, ((S3DVertex*) source ) );
#if defined (SOFTWARE_DRIVER_2_LIGHTING) || defined ( SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM )
// vertex normal in light space
if ( Material.org.Lighting || (LightSpace.Flags & VERTEXTRANSFORM) )
{
if ( TransformationFlag[ETS_WORLD] & ETF_IDENTITY )
{
LightSpace.normal.set ( base->Normal.X, base->Normal.Y, base->Normal.Z, 1.f );
LightSpace.vertex.set ( base->Pos.X, base->Pos.Y, base->Pos.Z, 1.f );
}
else
{
Transformation[ETS_WORLD].rotateVect ( &LightSpace.normal.x, base->Normal );
if ( LightSpace.Flags & NORMALIZE )
LightSpace.normal.normalize_xyz();
// vertex in light space
if ( LightSpace.Flags & ( POINTLIGHT | FOG | SPECULAR | VERTEXTRANSFORM) )
Transformation[ETS_WORLD].transformVect ( &LightSpace.vertex.x, base->Pos );
}
}
#endif
#if defined ( SOFTWARE_DRIVER_2_USE_VERTEX_COLOR )
// apply lighting model
#if defined (SOFTWARE_DRIVER_2_LIGHTING)
if ( Material.org.Lighting )
{
lightVertex ( dest, base->Color.color );
}
else
{
dest->Color[0].setA8R8G8B8 ( base->Color.color );
}
#else
dest->Color[0].setA8R8G8B8 ( ((S3DVertex*) source )->Color.color );
dest->Color[0].setA8R8G8B8 ( base->Color.color );
#endif
#endif
// transfer texture coordinates
const core::vector2d<f32> *srcT = &((S3DVertex*) source )->TCoords;
// Texture Transform
#if !defined ( SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM )
irr::memcpy32_small ( &dest->Tex[0],&base->TCoords,
vSize[VertexCache.vType].TexSize << 3 // * ( sizeof ( f32 ) * 2 )
);
#else
if ( TransformationFlag [ ETS_TEXTURE_0 ] && TransformationFlag [ ETS_TEXTURE_1 ] )
if ( 0 == (LightSpace.Flags & VERTEXTRANSFORM) )
{
irr::memcpy32_small ( &dest->Tex[0],srcT,
vSize[VertexCache.vType].TexSize * ( sizeof ( f32 ) * 2 )
irr::memcpy32_small ( &dest->Tex[0],&base->TCoords,
vSize[VertexCache.vType].TexSize << 3 // * ( sizeof ( f32 ) * 2 )
);
}
else
@ -862,33 +918,61 @@ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex,
*/
u32 t;
f32 tx1, ty1;
sVec4 n;
sVec2 srcT;
for ( t = 0; t != vSize[VertexCache.vType].TexSize; ++t )
{
const core::matrix4& M = Transformation [ ETS_TEXTURE_0 + t ];
// texgen
if ( TransformationFlag [ ETS_TEXTURE_0 + t ] & (ETF_TEXGEN_CAMERA_NORMAL|ETF_TEXGEN_CAMERA_REFLECTION) )
{
n.x = LightSpace.campos.x - LightSpace.vertex.x;
n.y = LightSpace.campos.x - LightSpace.vertex.y;
n.z = LightSpace.campos.x - LightSpace.vertex.z;
n.normalize_xyz();
n.x += LightSpace.normal.x;
n.y += LightSpace.normal.y;
n.z += LightSpace.normal.z;
n.normalize_xyz();
const f32 *view = Transformation[ETS_VIEW].pointer();
if ( TransformationFlag [ ETS_TEXTURE_0 + t ] & ETF_TEXGEN_CAMERA_REFLECTION )
{
srcT.x = 0.5f * ( 1.f + (n.x * view[0] + n.y * view[4] + n.z * view[8] ));
srcT.y = 0.5f * ( 1.f + (n.x * view[1] + n.y * view[5] + n.z * view[9] ));
}
else
{
srcT.x = 0.5f * ( 1.f + (n.x * view[0] + n.y * view[1] + n.z * view[2] ));
srcT.y = 0.5f * ( 1.f + (n.x * view[4] + n.y * view[5] + n.z * view[6] ));
}
}
else
{
irr::memcpy32_small ( &srcT,(&base->TCoords) + t,
sizeof ( f32 ) * 2 );
}
switch ( Material.org.TextureLayer[t].TextureWrap )
{
case ETC_REPEAT:
default:
dest->Tex[t].x = M[0] * srcT[t].X + M[4] * srcT[t].Y + M[8];
dest->Tex[t].y = M[1] * srcT[t].X + M[5] * srcT[t].Y + M[9];
dest->Tex[t].x = M[0] * srcT.x + M[4] * srcT.y + M[8];
dest->Tex[t].y = M[1] * srcT.x + M[5] * srcT.y + M[9];
break;
case ETC_CLAMP:
case ETC_CLAMP_TO_EDGE:
tx1 = M[0] * srcT[t].X + M[4] * srcT[t].Y + M[8];
ty1 = M[1] * srcT[t].X + M[5] * srcT[t].Y + M[9];
dest->Tex[t].x = tx1 <= 0.f ? 0.f : tx1 >= 1.f ? 1.f : tx1;
dest->Tex[t].y = ty1 <= 0.f ? 0.f : ty1 >= 1.f ? 1.f : ty1;
//dest->Tex[t].x = core::clamp ( M[0] * src[t].X + M[4] * src[t].Y + M[8], 0.f, 1.f );
//dest->Tex[t].y = core::clamp ( M[1] * src[t].X + M[5] * src[t].Y + M[9], 0.f, 1.f );
dest->Tex[t].x = core::clamp ( (f32) ( M[0] * srcT.x + M[4] * srcT.y + M[8] ), 0.f, 1.f );
dest->Tex[t].y = core::clamp ( (f32) ( M[1] * srcT.x + M[5] * srcT.y + M[9] ), 0.f, 1.f );
break;
}
}
}
#endif
dest[0].flag = dest[1].flag = vSize[VertexCache.vType].Format;
@ -1033,7 +1117,7 @@ REALINLINE void CBurningVideoDriver::VertexCache_get ( s4DVertex ** face )
/*!
*/
REALINLINE void CBurningVideoDriver::VertexCache_get2 ( s4DVertex ** face )
REALINLINE void CBurningVideoDriver::VertexCache_getbypass ( s4DVertex ** face )
{
const u32 i0 = core::if_c_a_else_0 ( VertexCache.pType != scene::EPT_TRIANGLE_FAN, VertexCache.indicesRun );
@ -1074,7 +1158,10 @@ void CBurningVideoDriver::VertexCache_reset ( const void* vertices, u32 vertexCo
VertexCache.indicesIndex = 0;
VertexCache.indicesRun = 0;
VertexCache.vType = vType;
if ( Material.org.MaterialType == video::EMT_REFLECTION_2_LAYER )
VertexCache.vType = 3;
else
VertexCache.vType = vType;
VertexCache.pType = pType;
VertexCache.iType = iType == EIT_16BIT ? 1 : 2;
@ -1116,6 +1203,7 @@ void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vert
s32 lodLevel;
u32 i;
u32 g;
video::CSoftwareTexture2* tex;
for ( i = 0; i < (u32) primitiveCount; ++i )
{
@ -1143,15 +1231,15 @@ void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vert
for ( g = 0; g != vSize[VertexCache.vType].TexSize; ++g )
//for ( g = 0; g != BURNING_MATERIAL_MAX_TEXTURES; ++g )
{
if ( 0 == MAT_TEXTURE ( g ) )
if ( 0 == (tex = MAT_TEXTURE ( g )) )
{
CurrentShader->setTextureParam(g, 0, 0);
continue;
}
lodLevel = s32_log2_f32 ( texelarea2 ( face, g ) * dc_area );
CurrentShader->setTextureParam(g, MAT_TEXTURE ( g ), lodLevel);
select_polygon_mipmap2 ( (s4DVertex**) face, g );
CurrentShader->setTextureParam(g, tex, lodLevel);
select_polygon_mipmap2 ( (s4DVertex**) face, g, tex->getSize() );
}
@ -1261,16 +1349,15 @@ void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vert
//for ( g = 0; g != BURNING_MATERIAL_MAX_TEXTURES; ++g )
for ( g = 0; g != vSize[VertexCache.vType].TexSize; ++g )
{
if ( 0 == MAT_TEXTURE ( g ) )
if ( 0 == (tex = MAT_TEXTURE ( g )) )
{
CurrentShader->setTextureParam(g, 0, 0);
continue;
}
lodLevel = s32_log2_f32 ( texelarea ( CurrentOut.data, g ) / dc_area );
CurrentShader->setTextureParam(g, MAT_TEXTURE ( g ), lodLevel);
select_polygon_mipmap ( CurrentOut.data, vOut, g );
CurrentShader->setTextureParam(g, tex, lodLevel);
select_polygon_mipmap ( CurrentOut.data, vOut, g, tex->getSize() );
}
// re-tesselate ( triangle-fan, 0-1-2,0-2-3.. )
@ -1309,37 +1396,47 @@ void CBurningVideoDriver::setAmbientLight(const SColorf& color)
//! adds a dynamic light
s32 CBurningVideoDriver::addDynamicLight(const SLight& dl)
{
(void) CNullDriver::addDynamicLight( dl );
SBurningShaderLight l;
l.org = dl;
// l.org = dl;
l.Type = dl.Type;
l.LightIsOn = true;
l.AmbientColor.setColorf ( l.org.AmbientColor );
l.DiffuseColor.setColorf ( l.org.DiffuseColor );
l.SpecularColor.setColorf ( l.org.SpecularColor );
l.AmbientColor.setColorf ( dl.AmbientColor );
l.DiffuseColor.setColorf ( dl.DiffuseColor );
l.SpecularColor.setColorf ( dl.SpecularColor );
switch ( dl.Type )
{
case video::ELT_DIRECTIONAL:
l.posLightSpace.x = -l.org.Direction.X;
l.posLightSpace.y = -l.org.Direction.Y;
l.posLightSpace.z = -l.org.Direction.Z;
l.posLightSpace.w = 1.f;
l.pos.x = -dl.Direction.X;
l.pos.y = -dl.Direction.Y;
l.pos.z = -dl.Direction.Z;
l.pos.w = 1.f;
break;
case ELT_POINT:
case ELT_SPOT:
LightSpace.Flags |= POINTLIGHT;
l.posLightSpace.x = l.org.Position.X;
l.posLightSpace.y = l.org.Position.Y;
l.posLightSpace.z = l.org.Position.Z;
l.posLightSpace.w = 1.f;
l.constantAttenuation = l.org.Attenuation.X;
l.linearAttenuation = l.org.Attenuation.Y;
l.quadraticAttenuation = l.org.Attenuation.Z;
l.pos.x = dl.Position.X;
l.pos.y = dl.Position.Y;
l.pos.z = dl.Position.Z;
l.pos.w = 1.f;
/*
l.radius = (1.f / dl.Attenuation.Y) * (1.f / dl.Attenuation.Y);
l.constantAttenuation = dl.Attenuation.X;
l.linearAttenuation = dl.Attenuation.Y;
l.quadraticAttenuation = dl.Attenuation.Z;
*/
l.radius = dl.Radius * dl.Radius;
l.constantAttenuation = dl.Attenuation.X;
l.linearAttenuation = 1.f / dl.Radius;
l.quadraticAttenuation = dl.Attenuation.Z;
break;
}
LightSpace.Light.push_back ( l );
(void) CNullDriver::addDynamicLight( l.org );
return LightSpace.Light.size() - 1;
}
@ -1379,10 +1476,10 @@ void CBurningVideoDriver::setMaterial(const SMaterial& material)
#endif
#ifdef SOFTWARE_DRIVER_2_LIGHTING
Material.AmbientColor.setA8R8G8B8 ( Material.org.AmbientColor.color );
Material.DiffuseColor.setA8R8G8B8 ( Material.org.DiffuseColor.color );
Material.EmissiveColor.setA8R8G8B8 ( Material.org.EmissiveColor.color );
Material.SpecularColor.setA8R8G8B8 ( Material.org.SpecularColor.color );
Material.AmbientColor.setR8G8B8 ( Material.org.AmbientColor.color );
Material.DiffuseColor.setR8G8B8 ( Material.org.DiffuseColor.color );
Material.EmissiveColor.setR8G8B8 ( Material.org.EmissiveColor.color );
Material.SpecularColor.setR8G8B8 ( Material.org.SpecularColor.color );
core::setbit_cond ( LightSpace.Flags, Material.org.Shininess != 0.f, SPECULAR );
core::setbit_cond ( LightSpace.Flags, Material.org.FogEnable, FOG );
@ -1404,76 +1501,54 @@ void CBurningVideoDriver::setFog(SColor color, bool linearFog, f32 start,
LightSpace.FogColor.setA8R8G8B8 ( color.color );
}
/*!
Camera Position in World Space
*/
void CBurningVideoDriver::getCameraPosWorldSpace ()
{
Transformation[ETS_VIEW_INVERSE] = Transformation[ ETS_VIEW ];
Transformation[ETS_VIEW_INVERSE].makeInverse ();
TransformationFlag[ETS_VIEW_INVERSE] = 0;
const f32 *M = Transformation[ETS_VIEW_INVERSE].pointer ();
/* The viewpoint is at (0., 0., 0.) in eye space.
Turning this into a vector [0 0 0 1] and multiply it by
the inverse of the view matrix, the resulting vector is the
object space location of the camera.
*/
LightSpace.campos.x = M[12];
LightSpace.campos.y = M[13];
LightSpace.campos.z = M[14];
LightSpace.campos.w = 1.f;
}
/*!
applies lighting model
*/
void CBurningVideoDriver::lightVertex ( s4DVertex *dest, const S3DVertex *source )
void CBurningVideoDriver::lightVertex ( s4DVertex *dest, u32 vertexargb )
{
// apply lighting model
if ( !Material.org.Lighting )
{
// should use the DiffuseColor but using pre-lit vertex color
dest->Color[0].setA8R8G8B8 ( source->Color.color );
return;
}
sVec4 dColor;
sVec3 dColor;
dColor = LightSpace.Global_AmbientLight;
dColor += Material.EmissiveColor;
dColor.add ( Material.EmissiveColor );
if ( Lights.size () == 0 )
{
dColor.saturate();
dest->Color[0] = dColor;
dColor.saturate( dest->Color[0], vertexargb);
return;
}
sVec4 vertexLightSpace;
sVec4 normalLightSpace;
sVec4 eyeLightSpace;
// vertex normal in light space
Transformation[ETS_WORLD].rotateVect ( &normalLightSpace.x, source->Normal );
if ( LightSpace.Flags & NORMALIZE )
normalLightSpace.normalize_xyz();
// vertex in light space
if ( LightSpace.Flags & ( POINTLIGHT | FOG | SPECULAR ) )
Transformation[ETS_WORLD].transformVect ( &vertexLightSpace.x, source->Pos );
// eye in in light space
if ( LightSpace.Flags & ( FOG | SPECULAR ) )
{
if ( !TransformationFlag [ETS_VIEW_INVERSE] )
{
Transformation[ETS_VIEW_INVERSE] = Transformation[ ETS_VIEW ];
Transformation[ETS_VIEW_INVERSE].makeInverse ();
TransformationFlag[ETS_VIEW_INVERSE] = 1;
}
const f32 *M = Transformation[ETS_VIEW_INVERSE].pointer ();
/* The viewpoint is at (0., 0., 0.) in eye space.
Turning this into a vector [0 0 0 1] and multiply it by
the inverse of the view matrix, the resulting vector is the
object space location of the camera.
*/
eyeLightSpace.x = M[12];
eyeLightSpace.y = M[13];
eyeLightSpace.z = M[14];
eyeLightSpace.w = 1.f;
}
sVec4 ambient;
sVec4 diffuse;
sVec4 specular;
sVec3 ambient;
sVec3 diffuse;
sVec3 specular;
// the universe started in darkness..
ambient.set ( 0.f, 0.f, 0.f, 0.f );
diffuse.set ( 0.f, 0.f, 0.f, 0.f );
specular.set ( 0.f, 0.f, 0.f, 0.f );
ambient.set ( 0.f, 0.f, 0.f );
diffuse.set ( 0.f, 0.f, 0.f );
specular.set ( 0.f, 0.f, 0.f );
u32 i;
@ -1487,90 +1562,78 @@ void CBurningVideoDriver::lightVertex ( s4DVertex *dest, const S3DVertex *source
{
const SBurningShaderLight &light = LightSpace.Light[i];
switch ( light.org.Type )
// accumulate ambient
ambient.add ( light.AmbientColor );
switch ( light.Type )
{
case video::ELT_SPOT:
case video::ELT_POINT:
// surface to light
vp.x = light.posLightSpace.x - vertexLightSpace.x;
vp.y = light.posLightSpace.y - vertexLightSpace.y;
vp.z = light.posLightSpace.z - vertexLightSpace.z;
vp.x = light.pos.x - LightSpace.vertex.x;
vp.y = light.pos.y - LightSpace.vertex.y;
vp.z = light.pos.z - LightSpace.vertex.z;
len = vp.get_length_xyz_square();
if ( light.org.Radius * light.org.Radius < len )
if ( light.radius < len )
continue;
len = core::squareroot ( len );
attenuation = light.constantAttenuation +
( 1.f - (len * light.linearAttenuation) );
/*
attenuation = light.constantAttenuation +
light.linearAttenuation * attenuation +
light.quadraticAttenuation * attenuation * attenuation;
*/
// accumulate ambient
ambient += light.AmbientColor * attenuation;
attenuation = light.constantAttenuation + ( 1.f - ( len * light.linearAttenuation ) );
// build diffuse reflection
//angle between normal and light vector
vp *= core::reciprocal ( len );
dot = normalLightSpace.dot_xyz ( vp );
vp.mulReciprocal ( len );
dot = LightSpace.normal.dot_xyz ( vp );
if ( dot < 0.f )
continue;
// diffuse component
diffuse += light.DiffuseColor * ( dot * attenuation );
diffuse.mulAdd ( light.DiffuseColor, dot * attenuation );
if ( !(LightSpace.Flags & SPECULAR) )
continue;
// build specular
// surface to view
lightHalf.x = eyeLightSpace.x - vertexLightSpace.x;
lightHalf.y = eyeLightSpace.y - vertexLightSpace.y;
lightHalf.z = eyeLightSpace.z - vertexLightSpace.z;
lightHalf.x = LightSpace.campos.x - LightSpace.vertex.x;
lightHalf.y = LightSpace.campos.y - LightSpace.vertex.y;
lightHalf.z = LightSpace.campos.z - LightSpace.vertex.z;
lightHalf.normalize_xyz();
lightHalf += vp;
lightHalf.normalize_xyz();
// specular
dot = normalLightSpace.dot_xyz ( lightHalf );
dot = LightSpace.normal.dot_xyz ( lightHalf );
if ( dot < 0.f )
continue;
//specular += light.SpecularColor * ( powf ( Material.org.Shininess ,dot ) * attenuation );
specular += light.SpecularColor * ( dot * attenuation );
specular.mulAdd ( light.SpecularColor, dot * attenuation );
break;
case video::ELT_DIRECTIONAL:
// accumulate ambient
ambient += light.AmbientColor;
//angle between normal and light vector
dot = normalLightSpace.dot_xyz ( light.posLightSpace );
dot = LightSpace.normal.dot_xyz ( light.pos );
if ( dot < 0.f )
continue;
// diffuse component
diffuse += light.DiffuseColor * dot;
if ( !(LightSpace.Flags & SPECULAR) )
continue;
diffuse.mulAdd ( light.DiffuseColor, dot );
break;
}
}
// sum up lights
dColor += ambient * Material.AmbientColor;
dColor += diffuse * Material.DiffuseColor;
dColor += specular * Material.SpecularColor;
dColor.saturate();
dColor.mulAdd (ambient, Material.AmbientColor );
dColor.mulAdd (diffuse, Material.DiffuseColor);
dColor.mulAdd (specular, Material.SpecularColor);
dest->Color[0] = dColor;
dColor.saturate ( dest->Color[0], vertexargb );
}
#endif
@ -1612,7 +1675,7 @@ void CBurningVideoDriver::draw2DLine(const core::position2d<s32>& start,
//! Draws a pixel
void CBurningVideoDriver::drawPixel(u32 x, u32 y, const SColor & color)
{
((CImage*)BackBuffer)->setPixel(x, y, color);
((CImage*)BackBuffer)->setPixel(x, y, color, true);
}
//! draw an 2d rectangle
@ -1851,16 +1914,22 @@ void CBurningVideoDriver::draw3DLine(const core::vector3df& start,
const wchar_t* CBurningVideoDriver::getName() const
{
#ifdef BURNINGVIDEO_RENDERER_BEAUTIFUL
return L"Burning's Video 0.42 beautiful";
return L"Burning's Video 0.44 beautiful";
#elif defined ( BURNINGVIDEO_RENDERER_ULTRA_FAST )
return L"Burning's Video 0.42 ultra fast";
return L"Burning's Video 0.44 ultra fast";
#elif defined ( BURNINGVIDEO_RENDERER_FAST )
return L"Burning's Video 0.42 fast";
return L"Burning's Video 0.44 fast";
#else
return L"Burning's Video 0.42";
return L"Burning's Video 0.44";
#endif
}
//! Returns the graphics card vendor name.
core::stringc CBurningVideoDriver::getVendorInfo()
{
return "Burning's Video: Ing. Thomas Alten (c) 2006-2009";
}
//! Returns type of video driver
E_DRIVER_TYPE CBurningVideoDriver::getDriverType() const
@ -1936,12 +2005,6 @@ u32 CBurningVideoDriver::getMaximalPrimitiveCount() const
return 0xFFFFFFFF;
}
//! Returns the graphics card vendor name.
core::stringc CBurningVideoDriver::getVendorInfo()
{
return "Burningsvideo: Ing. Thomas Alten (c) 2006-2009";
}
//! Draws a shadow volume into the stencil buffer. To draw a stencil shadow, do
//! this: First, draw all geometry. Then use this method, to draw the shadow

View File

@ -201,8 +201,17 @@ namespace video
ETS_COUNT_BURNING
};
enum E_TRANSFORMATION_FLAG
{
ETF_IDENTITY = 1,
ETF_TEXGEN_CAMERA_NORMAL = 2,
ETF_TEXGEN_CAMERA_REFLECTION = 4,
};
u32 TransformationFlag[ETS_COUNT_BURNING];
core::matrix4 Transformation[ETS_COUNT_BURNING];
void getCameraPosWorldSpace ();
// Vertex Cache
static const SVSize vSize[];
@ -214,7 +223,7 @@ namespace video
E_VERTEX_TYPE vType,scene::E_PRIMITIVE_TYPE pType,
E_INDEX_TYPE iType);
void VertexCache_get ( s4DVertex ** face );
void VertexCache_get2 ( s4DVertex ** face );
void VertexCache_getbypass ( s4DVertex ** face );
void VertexCache_fill ( const u32 sourceIndex,const u32 destIndex );
s4DVertex * VertexCache_getVertex ( const u32 sourceIndex );
@ -227,7 +236,8 @@ namespace video
#ifdef SOFTWARE_DRIVER_2_LIGHTING
void lightVertex ( s4DVertex *dest, const S3DVertex *source );
void lightVertex ( s4DVertex *dest, u32 vertexargb );
//! Sets the fog mode.
virtual void setFog(SColor color, bool linearFog, f32 start,
f32 end, f32 density, bool pixelFog, bool rangeFog);
@ -240,14 +250,14 @@ namespace video
void ndc_2_dc_and_project ( s4DVertex *dest,s4DVertex *source, u32 vIn ) const;
f32 screenarea ( const s4DVertex *v0 ) const;
void select_polygon_mipmap ( s4DVertex *source, u32 vIn, s32 tex );
void select_polygon_mipmap ( s4DVertex *source, u32 vIn, u32 tex, const core::dimension2du& texSize );
f32 texelarea ( const s4DVertex *v0, int tex ) const;
void ndc_2_dc_and_project2 ( const s4DVertex **v, const u32 size ) const;
f32 screenarea2 ( const s4DVertex **v ) const;
f32 texelarea2 ( const s4DVertex **v, int tex ) const;
void select_polygon_mipmap2 ( s4DVertex **source, s32 tex ) const;
void select_polygon_mipmap2 ( s4DVertex **source, u32 tex, const core::dimension2du& texSize ) const;
SBurningShaderLightSpace LightSpace;

View File

@ -62,10 +62,12 @@ CSoftwareTexture2::CSoftwareTexture2(IImage* image, const core::string<c16>& nam
OrigSize = optSize;
os::Printer::log ( buf, ELL_WARNING );
MipMap[0] = new CImage(BURNINGSHADER_COLOR_FORMAT, optSize);
MipMap[0]->fill ( 0 );
// temporary CImage needed
CImage * temp = new CImage ( BURNINGSHADER_COLOR_FORMAT, image );
temp->copyToScalingBoxFilter ( MipMap[0], 0 );
temp->copyToScalingBoxFilter ( MipMap[0],0, false );
//temp->copyToScaling(MipMap[0]);
temp->drop ();
}
@ -97,7 +99,7 @@ void CSoftwareTexture2::regenerateMipMapLevels()
s32 i;
// release
for ( i = 1; i!= SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i )
for ( i = 1; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i )
{
if ( MipMap[i] )
MipMap[i]->drop();
@ -115,7 +117,8 @@ void CSoftwareTexture2::regenerateMipMapLevels()
newSize.Height = core::s32_max ( 1, currentSize.Height >> SOFTWARE_DRIVER_2_MIPMAPPING_SCALE );
MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize);
MipMap[0]->copyToScalingBoxFilter( MipMap[i], 0 );
MipMap[i]->fill ( 0 );
MipMap[0]->copyToScalingBoxFilter( MipMap[i], 0, false );
c = MipMap[i];
++i;
}

View File

@ -319,14 +319,6 @@ void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4D
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -622,19 +614,6 @@ void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4D
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -330,13 +330,6 @@ void CTRGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
@ -633,20 +626,6 @@ void CTRGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}
} // end namespace video

View File

@ -332,14 +332,6 @@ void CTRGouraudAlphaNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,c
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -635,20 +627,6 @@ void CTRGouraudAlphaNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,c
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}
} // end namespace video

View File

@ -2057,14 +2057,6 @@ void CTRTextureBlend::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -2360,20 +2352,6 @@ void CTRTextureBlend::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -335,14 +335,6 @@ void CTRTextureDetailMap2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -638,20 +630,6 @@ void CTRTextureDetailMap2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}
} // end namespace video

View File

@ -348,14 +348,6 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -651,20 +643,6 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}
} // end namespace video

View File

@ -352,14 +352,6 @@ void CTRTextureGouraudAdd2::drawTriangle ( const s4DVertex *a,const s4DVertex *b
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( F32_GREATER_0 ( scan.invDeltaY[1] ) )
{
@ -655,20 +647,6 @@ void CTRTextureGouraudAdd2::drawTriangle ( const s4DVertex *a,const s4DVertex *b
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -323,14 +323,6 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -626,20 +618,6 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}
} // end namespace video

View File

@ -417,14 +417,6 @@ void CTRTextureGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -720,20 +712,6 @@ void CTRTextureGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -417,14 +417,6 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -720,19 +712,6 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -320,14 +320,6 @@ void CTRTextureGouraudNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -623,20 +615,6 @@ void CTRTextureGouraudNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -363,14 +363,6 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *
f32 subPixel;
#endif
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -666,20 +658,6 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -344,18 +344,6 @@ void CTRTextureLightMap2_Add::drawTriangle ( const s4DVertex *a,const s4DVertex
f32 subPixel;
#endif
// query access to TexMaps
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( (f32) 0.0 != scan.invDeltaY[1] )
{
@ -651,19 +639,6 @@ void CTRTextureLightMap2_Add::drawTriangle ( const s4DVertex *a,const s4DVertex
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -314,17 +314,6 @@ void CTRTextureLightMap2_M1::drawTriangle ( const s4DVertex *a,const s4DVertex *
f32 subPixel;
#endif
// query access to TexMaps
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( F32_GREATER_0 ( scan.invDeltaY[1] ) )
{
@ -621,20 +610,6 @@ void CTRTextureLightMap2_M1::drawTriangle ( const s4DVertex *a,const s4DVertex *
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -314,17 +314,6 @@ void CTRTextureLightMap2_M2::drawTriangle ( const s4DVertex *a,const s4DVertex *
f32 subPixel;
#endif
// query access to TexMaps
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( F32_GREATER_0 ( scan.invDeltaY[1] ) )
{
@ -621,20 +610,6 @@ void CTRTextureLightMap2_M2::drawTriangle ( const s4DVertex *a,const s4DVertex *
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -642,17 +642,6 @@ void CTRTextureLightMap2_M4::drawTriangle_Min ( const s4DVertex *a,const s4DVert
f32 subPixel;
#endif
// query access to TexMaps
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( F32_GREATER_0 ( scan.invDeltaY[1] ) )
{
@ -949,20 +938,6 @@ void CTRTextureLightMap2_M4::drawTriangle_Min ( const s4DVertex *a,const s4DVert
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}
void CTRTextureLightMap2_M4::drawTriangle_Mag ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c )
@ -1039,16 +1014,6 @@ void CTRTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex *
f32 subPixel;
#endif
// query access to TexMaps
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
if ( F32_GREATER_0 ( scan.invDeltaY[1] ) )
@ -1346,20 +1311,6 @@ void CTRTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex *
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}
} // end namespace video

View File

@ -359,17 +359,6 @@ void CTRGTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex
f32 subPixel;
#endif
// query access to TexMaps
#ifdef IPOL_T0
IT[0].data = (tVideoSample*)IT[0].Texture->lock();
#endif
#ifdef IPOL_T1
IT[1].data = (tVideoSample*)IT[1].Texture->lock();
#endif
// rasterize upper sub-triangle
//if ( (f32) 0.0 != scan.invDeltaY[1] )
@ -669,20 +658,6 @@ void CTRGTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex
}
}
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
#ifdef IPOL_T0
IT[0].Texture->unlock();
#endif
#ifdef IPOL_T1
IT[1].Texture->unlock();
#endif
}

View File

@ -254,12 +254,6 @@ void CTRTextureWire2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const
renderLine ( b, c );
renderLine ( a, c );
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
}
@ -272,11 +266,6 @@ void CTRTextureWire2::drawLine ( const s4DVertex *a,const s4DVertex *b)
if ( a->Pos.y > b->Pos.y ) swapVertexPointer(&a, &b);
renderLine ( a, b );
RenderTarget->unlock();
#ifdef USE_ZBUFFER
DepthBuffer->unlock();
#endif
}

View File

@ -43,7 +43,7 @@ namespace scene
private:
void animateWaterSurface();
void addWave(core::vector3df& dest, const core::vector3df source, f32 time)
void addWave(core::vector3df& dest, const core::vector3df &source, f32 time) const
{
dest.Y = source.Y +
(sinf(((source.X/WaveLength) + time)) * WaveHeight) +

View File

@ -99,6 +99,7 @@ CZipReader::CZipReader(IReadFile* file, bool ignoreCase, bool ignorePaths)
File->grab();
Base = File->getFileName();
Base.replace ( '\\', '/' );
// scan local headers
while (scanLocalHeader());
@ -582,6 +583,7 @@ CMountPointReader::CMountPointReader( IFileSystem * parent, const core::string<c
:CZipReader ( 0, ignoreCase, ignorePaths ), Parent ( parent )
{
Base = basename;
Base.replace ( '\\', '/' );
if ( core::lastChar ( Base ) != '/' )
Base.append ( '/' );
Type = "mount";

View File

@ -27,19 +27,19 @@ namespace video
struct SBurningShaderLight
{
SLight org;
//SLight org;
bool LightIsOn;
E_LIGHT_TYPE type;
sVec4 posLightSpace;
f32 constantAttenuation;
E_LIGHT_TYPE Type;
f32 radius;
f32 linearAttenuation;
f32 constantAttenuation;
f32 quadraticAttenuation;
sVec4 pos;
sVec4 AmbientColor;
sVec4 DiffuseColor;
sVec4 SpecularColor;
sVec3 AmbientColor;
sVec3 DiffuseColor;
sVec3 SpecularColor;
};
enum eLightFlags
@ -49,6 +49,7 @@ namespace video
SPECULAR = 0x04,
FOG = 0x08,
NORMALIZE = 0x10,
VERTEXTRANSFORM = 0x20,
};
struct SBurningShaderLightSpace
@ -56,12 +57,15 @@ namespace video
void reset ()
{
Light.set_used ( 0 );
Global_AmbientLight.set ( 0.f, 0.f, 0.f, 0.f );
Global_AmbientLight.set ( 0.f, 0.f, 0.f );
Flags = 0;
}
core::array<SBurningShaderLight> Light;
sVec4 Global_AmbientLight;
sVec3 Global_AmbientLight;
sVec4 FogColor;
sVec4 campos;
sVec4 vertex;
sVec4 normal;
u32 Flags;
};
@ -69,10 +73,10 @@ namespace video
{
SMaterial org;
sVec4 AmbientColor;
sVec4 DiffuseColor;
sVec4 SpecularColor;
sVec4 EmissiveColor;
sVec3 AmbientColor;
sVec3 DiffuseColor;
sVec3 SpecularColor;
sVec3 EmissiveColor;
};

View File

@ -881,6 +881,10 @@
RelativePath=".\..\..\include\IDummyTransformationSceneNode.h"
>
</File>
<File
RelativePath="..\..\include\IGeometryCreator.h"
>
</File>
<File
RelativePath="..\..\include\ILightManager.h"
>

View File

@ -139,19 +139,6 @@ struct sVec4
w = color.b;
}
void saturate ()
{
x = core::min_ ( x, 1.f );
y = core::min_ ( y, 1.f );
z = core::min_ ( z, 1.f );
w = core::min_ ( w, 1.f );
/*
x = core::clamp ( x, 0.f, 1.f );
y = core::clamp ( y, 0.f, 1.f );
z = core::clamp ( z, 0.f, 1.f );
w = core::clamp ( w, 0.f, 1.f );
*/
}
// f = a * t + b * ( 1 - t )
void interpolate(const sVec4& a, const sVec4& b, const f32 t)
@ -183,12 +170,6 @@ struct sVec4
return core::squareroot ( x * x + y * y + z * z );
}
f32 get_inverse_length_xyz () const
{
return core::reciprocal_squareroot ( x * x + y * y + z * z );
}
void normalize_xyz ()
{
const f32 l = core::reciprocal_squareroot ( x * x + y * y + z * z );
@ -234,6 +215,15 @@ struct sVec4
return sVec4(x * other.x , y * other.y, z * other.z,w * other.w);
}
void mulReciprocal ( f32 s )
{
const f32 i = core::reciprocal ( s );
x = (f32) ( x * i );
y = (f32) ( y * i );
z = (f32) ( z * i );
w = (f32) ( w * i );
}
/*
void operator*=(f32 s)
{
x *= s;
@ -241,7 +231,7 @@ struct sVec4
z *= s;
w *= s;
}
*/
void operator*=(const sVec4 &other)
{
x *= other.x;
@ -259,6 +249,64 @@ struct sVec4
}
};
struct sVec3
{
f32 r, g, b;
void set ( f32 _r, f32 _g, f32 _b )
{
r = _r;
g = _g;
b = _b;
}
void setR8G8B8 ( u32 argb )
{
r = ( ( argb & 0x00FF0000 ) >> 16 ) * ( 1.f / 255.f );
g = ( ( argb & 0x0000FF00 ) >> 8 ) * ( 1.f / 255.f );
b = ( ( argb & 0x000000FF ) ) * ( 1.f / 255.f );
}
void setColorf ( const video::SColorf & color )
{
r = color.r;
g = color.g;
b = color.b;
}
void add (const sVec3& other)
{
r += other.r;
g += other.g;
b += other.b;
}
void mulAdd(const sVec3& other, const f32 v)
{
r += other.r * v;
g += other.g * v;
b += other.b * v;
}
void mulAdd(const sVec3& v0, const sVec3& v1)
{
r += v0.r * v1.r;
g += v0.g * v1.g;
b += v0.b * v1.b;
}
void saturate ( sVec4 &dest, u32 argb )
{
dest.x = ( ( argb & 0xFF000000 ) >> 24 ) * ( 1.f / 255.f );
dest.y = core::min_ ( r, 1.f );
dest.z = core::min_ ( g, 1.f );
dest.w = core::min_ ( b, 1.f );
}
};
inline void sCompressedVec4::setVec4 ( const sVec4 & v )
{
argb = core::floor32 ( v.x * 255.f ) << 24 |

View File

@ -295,7 +295,7 @@ REALINLINE u32 PixelAdd32 ( const u32 c2, const u32 c1)
return modulo | clamp;
}
#if 1
#if 0
// 1 - Bit Alpha Blending
inline u16 PixelBlend16 ( const u16 destination, const u16 source )
@ -329,30 +329,15 @@ inline u32 PixelBlend16_simd ( const u32 destination, const u32 source )
// 1 - Bit Alpha Blending
inline u16 PixelBlend16 ( const u16 c2, const u16 c1 )
{
return core::if_c_a_else_b ( c1 & 0x8000, c1, c2 );
/*
u16 c = c1 & 0x8000;
c >>= 15;
c += 0x7fff;
return (c & c2 ) | c1;
*/
u16 mask = ((c1 & 0x8000) >> 15 ) + 0x7fff;
return (c2 & mask ) | ( c1 & ~mask );
}
// 1 - Bit Alpha Blending 16Bit SIMD
inline u32 PixelBlend16_simd ( const u32 c2, const u32 c1 )
{
return core::if_c_a_else_b ( c1 & 0x80008000, c1, c2 );
/*
u32 c = c1 & 0x80008000;
c >>= 15;
c += 0x7fff7fff;
return (c & c2 ) | c1;
*/
u32 mask = ((c1 & 0x80008000) >> 15 ) + 0x7fff7fff;
return (c2 & mask ) | ( c1 & ~mask );
}
#endif

View File

@ -46,12 +46,6 @@ bool irrCoreEquals(void)
return false;
}
if(irr::core::equals(99, 98))
{
logTestString("irr::core::equals(s32, s32 (,default)) failed.\n");
return false;
}
if(irr::core::equals(99, 98, 0))
{
logTestString("irr::core::equals(s32, s32, 0) failed.\n");
@ -70,12 +64,6 @@ bool irrCoreEquals(void)
return false;
}
if(irr::core::equals(-99, -98))
{
logTestString("irr::core::equals(s32, s32 (,default)) failed.\n");
return false;
}
if(irr::core::equals(-99, -98, 0))
{
logTestString("irr::core::equals(s32, s32, 0) failed.\n");

View File

@ -55,8 +55,11 @@ int main(int argumentCount, char * arguments[])
// Note that to interactively debug a test, you will generally want to move it
// (temporarily) to the beginning of the list, since each test runs in its own
// process.
TEST(disambiguateTextures); // Normally you should run this first, since it validates the working directory.
TEST(exports);
#if 1
TEST(sceneCollisionManager);
TEST(testVector3d);
TEST(testVector2d);
@ -72,7 +75,6 @@ int main(int argumentCount, char * arguments[])
TEST(textureRenderStates);
TEST(terrainSceneNode);
TEST(burningsVideo);
TEST(makeColorKeyTexture);
TEST(cursorSetVisible);
TEST(transparentAlphaChannelRef);
TEST(drawRectOutline);
@ -86,8 +88,13 @@ int main(int argumentCount, char * arguments[])
TEST(vectorPositionDimension2d);
TEST(writeImageToFile);
TEST(flyCircleAnimator);
TEST(enumerateImageManipulators);
TEST(testGeometryCreator);
//TEST(enumerateImageManipulators);
//TEST(testGeometryCreator);
#else
TEST(makeColorKeyTexture);
tests[2].testSignature();
#endif
const unsigned int numberOfTests = tests.size();

View File

@ -36,7 +36,6 @@ static bool doTestWith(E_DRIVER_TYPE driverType,
device->getVideoDriver()->makeColorKeyTexture(Texture,
position2d<s32>(64,64),
zeroTexels);
(void)smgr->addCameraSceneNode();
driver->beginScene(true, true, SColor(255,100,101,140));
@ -63,10 +62,23 @@ static bool doTestWith(E_DRIVER_TYPE driverType,
bool makeColorKeyTexture(void)
{
bool result = true;
//result &= doTestWith(EDT_DIRECT3D9, false);
//result &= doTestWith(EDT_BURNINGSVIDEO, false);
result &= doTestWith(EDT_SOFTWARE, false);
//result &= doTestWith(EDT_OPENGL, false);
//result &= doTestWith(EDT_DIRECT3D9, true);
//result &= doTestWith(EDT_BURNINGSVIDEO, true);
result &= doTestWith(EDT_SOFTWARE, true);
//result &= doTestWith(EDT_OPENGL, true);
/*
bool result = doTestWith(EDT_SOFTWARE, false);
result &= doTestWith(EDT_BURNINGSVIDEO, false);
result &= doTestWith(EDT_SOFTWARE, true);
result &= doTestWith(EDT_BURNINGSVIDEO, true);
*/
return result;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -178,6 +178,8 @@ bool takeScreenshotAndCompareAgainstReference(irr::video::IVideoDriver * driver,
irr::core::stringc driverName = driver->getName();
// For OpenGL and Burning, chop the version number out. Other drivers have more stable version numbers.
// TA: Sorry Rogerborg. burnings video also has the version number inside;-)
// maybe you sould take the getDriverType Info for this
if(driverName.find("OpenGL") > -1)
driverName = "OpenGL";
else if(driverName.find("Burning's Video") > -1)

View File

@ -123,7 +123,7 @@ bool testVector2d(void)
else
logTestString("\n*** vector2d<f64> tests failed ***\n\n");
bool s32Success = true; // doTests<s32>(); Currently broken: see vector3d<T>& normalize() and const T length = core::reciprocal_squareroot ( (T) (X*X + Y*Y + Z*Z) );
bool s32Success = doTests<s32>();
if(s32Success)
logTestString("vector2di tests passed\n\n");
else

View File

@ -1,2 +1,2 @@
Test suite pass at GMT Mon Feb 09 20:04:31 2009
Test suite pass at GMT Tue Feb 10 14:54:11 2009

View File

@ -2,6 +2,9 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tests", "tests_vc8.vcproj", "{2A1DE18B-F678-4A94-A996-E848E20B2983}"
ProjectSection(ProjectDependencies) = postProject
{E08E042A-6C45-411B-92BE-3CC31331019F} = {E08E042A-6C45-411B-92BE-3CC31331019F}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Irrlicht", "..\source\Irrlicht\Irrlicht8.0.vcproj", "{E08E042A-6C45-411B-92BE-3CC31331019F}"
EndProject

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Version="8,00"
Name="tests"
ProjectGUID="{2A1DE18B-F678-4A94-A996-E848E20B2983}"
RootNamespace="tests"
@ -42,7 +42,7 @@
AdditionalIncludeDirectories="..\include"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
RuntimeLibrary="1"
WarningLevel="3"
DebugInformationFormat="4"
/>
@ -58,6 +58,7 @@
<Tool
Name="VCLinkerTool"
OutputFile="..\bin\Win32-VisualStudio\$(ProjectName).exe"
AdditionalLibraryDirectories="..\lib\Win32-visualstudio"
GenerateDebugInformation="true"
TargetMachine="1"
/>
@ -113,7 +114,8 @@
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
RuntimeLibrary="2"
AdditionalIncludeDirectories="..\include"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
@ -130,6 +132,7 @@
<Tool
Name="VCLinkerTool"
OutputFile="..\bin\Win32-VisualStudio\$(ProjectName).exe"
AdditionalLibraryDirectories="..\lib\Win32-visualstudio"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
@ -197,10 +200,6 @@
RelativePath=".\drawRectOutline.cpp"
>
</File>
<File
RelativePath=".\enumerateImageManipulators.cpp"
>
</File>
<File
RelativePath=".\exports.cpp"
>
@ -245,10 +244,6 @@
RelativePath=".\planeMatrix.cpp"
>
</File>
<File
RelativePath=".\relativeTransformations.cpp"
>
</File>
<File
RelativePath=".\sceneCollisionManager.cpp"
>
@ -269,10 +264,6 @@
RelativePath=".\testDimension2d.cpp"
>
</File>
<File
RelativePath=".\testGeometryCreator.cpp"
>
</File>
<File
RelativePath=".\testUtils.cpp"
>