From 20b3d56987ca7b7a9d7f27b0a32a93f12e8dc530 Mon Sep 17 00:00:00 2001 From: cutealien Date: Fri, 12 Jun 2020 20:41:49 +0000 Subject: [PATCH] Merging r6075 through r6106 from trunk to ogl-es branch. Burnings renderer changes. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@6116 dfc29bdd-3216-0410-991c-e03cc46cb475 --- changes.txt | 12 + examples/05.UserInterface/main.cpp | 2 +- examples/09.Meshviewer/main.cpp | 2 +- examples/10.Shaders/main.cpp | 2 + examples/11.PerPixelLighting/main.cpp | 10 +- examples/12.TerrainRendering/main.cpp | 3 +- examples/16.Quake3MapShader/main.cpp | 8 +- examples/22.MaterialViewer/main.cpp | 2 +- examples/23.SMeshHandling/main.cpp | 4 +- examples/25.XmlHandling/main.cpp | 4 + examples/Demo/CDemo.cpp | 7 +- examples/Demo/CMainMenu.cpp | 8 +- source/Irrlicht/Android/jni/Android.mk | 3 + source/Irrlicht/CAnimatedMeshSceneNode.cpp | 4 +- source/Irrlicht/CBlit.h | 455 +- .../CBurningShader_Raster_Reference.cpp | 72 +- source/Irrlicht/CDepthBuffer.cpp | 62 +- source/Irrlicht/CDepthBuffer.h | 8 +- source/Irrlicht/CGUIContextMenu.cpp | 1 + source/Irrlicht/CImage.cpp | 23 +- source/Irrlicht/CImageLoaderRGB.cpp | 2 +- source/Irrlicht/CMY3DMeshFileLoader.h | 4 +- source/Irrlicht/COBJMeshFileLoader.cpp | 2 + source/Irrlicht/COSOperator.cpp | 3 +- source/Irrlicht/CSoftware2MaterialRenderer.h | 42 +- source/Irrlicht/CSoftwareDriver2.cpp | 4054 +++++++++++------ source/Irrlicht/CSoftwareDriver2.h | 200 +- source/Irrlicht/CSoftwareTexture2.cpp | 618 ++- source/Irrlicht/CSoftwareTexture2.h | 67 +- source/Irrlicht/CTRGouraud2.cpp | 61 +- source/Irrlicht/CTRGouraudAlpha2.cpp | 47 +- source/Irrlicht/CTRGouraudAlphaNoZ2.cpp | 49 +- source/Irrlicht/CTRGouraudNoZ2.cpp | 641 +++ source/Irrlicht/CTRNormalMap.cpp | 307 +- source/Irrlicht/CTRStencilShadow.cpp | 318 +- source/Irrlicht/CTRTextureBlend.cpp | 635 ++- source/Irrlicht/CTRTextureDetailMap2.cpp | 50 +- source/Irrlicht/CTRTextureGouraud2.cpp | 341 +- source/Irrlicht/CTRTextureGouraudAdd2.cpp | 60 +- source/Irrlicht/CTRTextureGouraudAddNoZ2.cpp | 167 +- source/Irrlicht/CTRTextureGouraudAlpha.cpp | 107 +- source/Irrlicht/CTRTextureGouraudAlphaNoZ.cpp | 648 ++- source/Irrlicht/CTRTextureGouraudNoZ2.cpp | 42 +- .../CTRTextureGouraudVertexAlpha2.cpp | 215 +- source/Irrlicht/CTRTextureLightMap2_Add.cpp | 45 +- source/Irrlicht/CTRTextureLightMap2_M1.cpp | 33 +- source/Irrlicht/CTRTextureLightMap2_M2.cpp | 33 +- source/Irrlicht/CTRTextureLightMap2_M4.cpp | 113 +- .../CTRTextureLightMapGouraud2_M4.cpp | 56 +- source/Irrlicht/CTRTextureWire2.cpp | 145 +- .../CTR_transparent_reflection_2_layer.cpp | 729 +++ source/Irrlicht/CXMeshFileLoader.cpp | 6 + source/Irrlicht/IBurningShader.cpp | 428 +- source/Irrlicht/IBurningShader.h | 288 +- source/Irrlicht/IDepthBuffer.h | 16 +- source/Irrlicht/Irrlicht-gcc.cbp | 10 + source/Irrlicht/Irrlicht10.0.vcxproj | 10 + source/Irrlicht/Irrlicht10.0.vcxproj.filters | 30 + source/Irrlicht/Irrlicht11.0.vcxproj | 10 + source/Irrlicht/Irrlicht11.0.vcxproj.filters | 30 + source/Irrlicht/Irrlicht12.0.vcxproj | 2 + source/Irrlicht/Irrlicht12.0.vcxproj.filters | 6 + source/Irrlicht/Irrlicht14.0.vcxproj | 11 + source/Irrlicht/Irrlicht14.0.vcxproj.filters | 33 + source/Irrlicht/Irrlicht15.0.vcxproj | 10 + source/Irrlicht/Irrlicht15.0.vcxproj.filters | 30 + source/Irrlicht/Makefile | 8 +- source/Irrlicht/S4DVertex.h | 785 ++-- .../Irrlicht/SoftwareDriver2_compile_config.h | 219 +- source/Irrlicht/SoftwareDriver2_helper.h | 882 ++-- source/Irrlicht/burning_shader_color.cpp | 95 + source/Irrlicht/burning_shader_color_fraq.h | 24 + .../burning_shader_compile_fragment_default.h | 164 + .../burning_shader_compile_fragment_end.h | 20 + .../burning_shader_compile_fragment_start.h | 119 + .../Irrlicht/burning_shader_compile_start.h | 24 + .../burning_shader_compile_triangle.h | 368 ++ .../Irrlicht/burning_shader_compile_verify.h | 43 + tests/media/Burning's Video-2dmatFilter.png | Bin 8500 -> 25513 bytes tests/media/Burning's Video-b3dAnimation.png | Bin 6245 -> 5879 bytes .../Burning's Video-b3dJointPosition.png | Bin 2964 -> 2982 bytes tests/media/Burning's Video-billboard.png | Bin 3998 -> 4577 bytes .../Burning's Video-billboardOrientation.png | Bin 10704 -> 10488 bytes .../Burning's Video-draw2DImage4cFilter.png | Bin 20835 -> 37162 bytes tests/media/Burning's Video-drawPixel.png | Bin 27977 -> 27905 bytes tests/media/Burning's Video-drawVPL_e.png | Bin 16353 -> 16056 bytes tests/media/Burning's Video-drawVPL_g.png | Bin 13937 -> 14337 bytes tests/media/Burning's Video-drawVPL_h.png | Bin 13644 -> 13300 bytes tests/media/Burning's Video-drawVPL_i.png | Bin 12838 -> 13181 bytes .../Burning's Video-flyCircleAnimator.png | Bin 2137 -> 2567 bytes tests/media/Burning's Video-lightType.png | Bin 1573 -> 5471 bytes tests/media/Burning's Video-loadScene.png | Bin 29530 -> 24949 bytes tests/media/Burning's Video-md2Normals.png | Bin 6405 -> 6457 bytes tests/media/Burning's Video-multiTexture.png | Bin 359 -> 8117 bytes tests/media/Burning's Video-orthoCam.png | Bin 3045 -> 4468 bytes ...Burning's Video-planeMatrix-scaledClip.png | Bin 37744 -> 37083 bytes tests/media/Burning's Video-renderMipmap.png | Bin 812 -> 740 bytes .../Burning's Video-stencilSelfShadow.png | Bin 16396 -> 14841 bytes tests/media/Burning's Video-stencilShadow.png | Bin 3275 -> 3508 bytes tests/media/Burning's Video-terrainGap.png | Bin 2971 -> 4337 bytes .../Burning's Video-terrainSceneNode-1.png | Bin 31249 -> 34251 bytes .../Burning's Video-terrainSceneNode-2.png | Bin 33309 -> 36646 bytes .../Burning's Video-testGeometryCreator.png | Bin 7580 -> 7406 bytes .../media/Burning's Video-testTerrainMesh.png | Bin 30612 -> 29522 bytes tests/media/Burning's Video-textureMatrix.png | Bin 0 -> 15212 bytes .../media/Burning's Video-textureMatrix2.png | Bin 0 -> 15212 bytes ...ing's Video-textureMatrixInMixedScenes.png | Bin 0 -> 1187 bytes .../Burning's Video-textureRenderStates.png | Bin 30383 -> 27349 bytes .../Burning's Video-transparentAddColor.png | Bin 30309 -> 29747 bytes ...urning's Video-transparentAlphaChannel.png | Bin 29521 -> 29346 bytes ...ing's Video-transparentAlphaChannelRef.png | Bin 30112 -> 30009 bytes ...ng's Video-transparentReflection2Layer.png | Bin 21621 -> 32288 bytes ...Burning's Video-transparentVertexAlpha.png | Bin 24479 -> 29855 bytes ...ideo-transparentVertexAlphaChannelMore.png | Bin 3539 -> 4719 bytes tests/media/Burning's Video-viewPortText.png | Bin 6477 -> 8955 bytes .../Burning's Video-writeImageToFile.png | Bin 0 -> 27905 bytes tests/tests-last-passed-at.txt | 4 +- 117 files changed, 10384 insertions(+), 3817 deletions(-) create mode 100644 source/Irrlicht/CTRGouraudNoZ2.cpp create mode 100644 source/Irrlicht/CTR_transparent_reflection_2_layer.cpp create mode 100644 source/Irrlicht/burning_shader_color.cpp create mode 100644 source/Irrlicht/burning_shader_color_fraq.h create mode 100644 source/Irrlicht/burning_shader_compile_fragment_default.h create mode 100644 source/Irrlicht/burning_shader_compile_fragment_end.h create mode 100644 source/Irrlicht/burning_shader_compile_fragment_start.h create mode 100644 source/Irrlicht/burning_shader_compile_start.h create mode 100644 source/Irrlicht/burning_shader_compile_triangle.h create mode 100644 source/Irrlicht/burning_shader_compile_verify.h create mode 100644 tests/media/Burning's Video-textureMatrix.png create mode 100644 tests/media/Burning's Video-textureMatrix2.png create mode 100644 tests/media/Burning's Video-textureMatrixInMixedScenes.png create mode 100644 tests/media/Burning's Video-writeImageToFile.png diff --git a/changes.txt b/changes.txt index fd1732bd..c213dfc6 100644 --- a/changes.txt +++ b/changes.txt @@ -9,6 +9,18 @@ Changes in ogl-es (not yet released - will be merged with trunk at some point) -------------------------- Changes in 1.9 (not yet released) +- BurningVideo: 0.51 + - 10 year anniversary update + - Lighting model reworked. moved to eyespace like openGL. [Specular Highlights, Fog, Sphere/Reflection Map] + - increased internal s4DVertex to support 4 Textures and 4 Colors [switchable] + - Textures are handled as sRGB during Mipmap Generation. More accurate, less visual disruption + - 2D is drawn as 3D like hardware drivers. [switchable]. enables viewport scaling, material2D + - Texture Spatial Resolution Limiting working. [lower memory consumption,SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE] + - NormalMap for 1 Light accurate. still all lights are accumulated + - SuperTuxKart 8.0.1 playable + - Known Problems + - Depthbuffer range not equal to Hardware Drivers. Problems with Orthographic Stencil Shadows + - Triangle MipMap Selection. Wrong for TextureAtlas and Billboards - Fix CPLYMeshFileLoader checking for wrong vertex count when switching between 16/32 bit. Thanks @randomMesh for reporting. - Fix bug that AnimatedMeshSceneNode ignored ReadOnlyMaterials flag when checking materials for transparent render passes. - Unify checks if materials should use transparent render pass with new IVideoDriver::needsTransparentRenderPass function. diff --git a/examples/05.UserInterface/main.cpp b/examples/05.UserInterface/main.cpp index 501eed3d..deaba6f1 100644 --- a/examples/05.UserInterface/main.cpp +++ b/examples/05.UserInterface/main.cpp @@ -266,7 +266,7 @@ int main() /* And at last, we create a nice Irrlicht Engine logo in the top left corner. */ - env->addImage(driver->getTexture(mediaPath + "irrlichtlogo2.png"), + env->addImage(driver->getTexture(mediaPath + "irrlichtlogo3.png"), position2d(10,10)); diff --git a/examples/09.Meshviewer/main.cpp b/examples/09.Meshviewer/main.cpp index 010ad6eb..1a5f51a9 100644 --- a/examples/09.Meshviewer/main.cpp +++ b/examples/09.Meshviewer/main.cpp @@ -978,7 +978,7 @@ int main(int argc, char* argv[]) // load the irrlicht engine logo IGUIImage *img = - env->addImage(driver->getTexture("irrlichtlogo2.png"), + env->addImage(driver->getTexture("irrlichtlogo3.png"), core::position2d(10, driver->getScreenSize().Height - 128)); // lock the logo's edges to the bottom left corner of the screen diff --git a/examples/10.Shaders/main.cpp b/examples/10.Shaders/main.cpp index 1beb3deb..ff80bd51 100644 --- a/examples/10.Shaders/main.cpp +++ b/examples/10.Shaders/main.cpp @@ -236,6 +236,8 @@ int main() vsFileName = mediaPath + "opengl.vsh"; } break; + default: + break; } /* diff --git a/examples/11.PerPixelLighting/main.cpp b/examples/11.PerPixelLighting/main.cpp index c2e03af2..afa59cb5 100644 --- a/examples/11.PerPixelLighting/main.cpp +++ b/examples/11.PerPixelLighting/main.cpp @@ -285,9 +285,9 @@ int main() driver->getTexture(mediaPath + "rockwall.jpg")); room->setMaterialTexture(1, normalMap); - // Stones don't glitter.. - room->getMaterial(0).SpecularColor.set(0,0,0,0); - room->getMaterial(0).Shininess = 0.f; + // Stones don't glitter.. (but specular highlight for EMT_SOLID) + //room->getMaterial(0).SpecularColor.set(0,0,0,0); + //room->getMaterial(0).Shininess = 0.f; room->setMaterialFlag(video::EMF_FOG_ENABLE, true); room->setMaterialType(video::EMT_PARALLAX_MAP_SOLID); @@ -365,7 +365,7 @@ int main() // add light 1 (more green) scene::ILightSceneNode* light1 = smgr->addLightSceneNode(0, core::vector3df(0,0,0), - video::SColorf(0.5f, 1.0f, 0.5f, 0.0f), 800.0f); + video::SColorf(0.5f, 1.0f, 0.5f, 0.0f), 400.0f); // add fly circle animator to light 1 scene::ISceneNodeAnimator* anim = @@ -398,7 +398,7 @@ int main() // add light 2 (red) scene::ISceneNode* light2 = smgr->addLightSceneNode(0, core::vector3df(0,0,0), - video::SColorf(1.0f, 0.2f, 0.2f, 0.0f), 800.0f); + video::SColorf(1.0f, 0.2f, 0.2f, 0.0f), 400.0f); // add fly circle animator to light 2 anim = smgr->createFlyCircleAnimator(core::vector3df(0,150,0), 200.0f, diff --git a/examples/12.TerrainRendering/main.cpp b/examples/12.TerrainRendering/main.cpp index 7c38598e..f9bc97e6 100644 --- a/examples/12.TerrainRendering/main.cpp +++ b/examples/12.TerrainRendering/main.cpp @@ -120,7 +120,7 @@ int main() const io::path mediaPath = getExampleMediaPath(); // add irrlicht logo - env->addImage(driver->getTexture(mediaPath + "irrlichtlogo2.png"), + env->addImage(driver->getTexture(mediaPath + "irrlichtlogo3.png"), core::position2d(10,10)); //set other font @@ -213,6 +213,7 @@ int main() terrain->getMeshBufferForLOD(*buffer, 0); video::S3DVertex2TCoords* data = (video::S3DVertex2TCoords*)buffer->getVertexBuffer().getData(); // Work on data or get the IndexBuffer with a similar call. + (void)data; // disable unused variable warnings buffer->drop(); // When done drop the buffer again. /* diff --git a/examples/16.Quake3MapShader/main.cpp b/examples/16.Quake3MapShader/main.cpp index e8a318dc..38062c5a 100644 --- a/examples/16.Quake3MapShader/main.cpp +++ b/examples/16.Quake3MapShader/main.cpp @@ -318,7 +318,7 @@ int IRRCALLCONV main(int argc, char* argv[]) device->getCursorControl()->setVisible(false); // load the engine logo - gui->addImage(driver->getTexture("irrlichtlogo2.png"), + gui->addImage(driver->getTexture("irrlichtlogo3.png"), core::position2d(10, 10)); // show the driver logo @@ -335,6 +335,8 @@ int IRRCALLCONV main(int argc, char* argv[]) case video::EDT_DIRECT3D9: gui->addImage(driver->getTexture("directxlogo.png"), pos); break; + default: + break; } /* @@ -355,14 +357,14 @@ int IRRCALLCONV main(int argc, char* argv[]) driver->endScene(); int fps = driver->getFPS(); - //if (lastFPS != fps) + if (1 || lastFPS != fps) { - io::IAttributes * const attr = smgr->getParameters(); core::stringw str = L"Q3 ["; str += driver->getName(); str += "] FPS:"; str += fps; #ifdef _IRR_SCENEMANAGER_DEBUG + io::IAttributes * const attr = smgr->getParameters(); str += " Cull:"; str += attr->getAttributeAsInt("calls"); str += "/"; diff --git a/examples/22.MaterialViewer/main.cpp b/examples/22.MaterialViewer/main.cpp index 83309260..358ce02c 100755 --- a/examples/22.MaterialViewer/main.cpp +++ b/examples/22.MaterialViewer/main.cpp @@ -429,7 +429,7 @@ void CMaterialControl::init(scene::IMeshSceneNode* node, IrrlichtDevice * device Driver = device->getVideoDriver (); gui::IGUIEnvironment* guiEnv = device->getGUIEnvironment(); - scene::ISceneManager* smgr = device->getSceneManager(); + //scene::ISceneManager* smgr = device->getSceneManager(); const video::SMaterial & material = node->getMaterial(0); s32 top = pos.Y; diff --git a/examples/23.SMeshHandling/main.cpp b/examples/23.SMeshHandling/main.cpp index 2d413094..a4ef9ebc 100644 --- a/examples/23.SMeshHandling/main.cpp +++ b/examples/23.SMeshHandling/main.cpp @@ -57,7 +57,7 @@ typedef f32 generate_func(s16 x, s16 y, f32 s); f32 eggbox(s16 x, s16 y, f32 s) { const f32 r = 4.f*sqrtf((f32)(x*x + y*y))/s; - const f32 z = expf(-r * 2) * (cosf(0.2f * x) + cosf(0.2f * y)); + const f32 z = (f32)exp(-r * 2) * (cosf(0.2f * x) + cosf(0.2f * y)); return 0.25f+0.25f*z; } @@ -180,7 +180,7 @@ private: public: SMesh* Mesh; - TMesh() : Mesh(0), Width(0), Height(0), Scale(1.f) + TMesh() : Width(0), Height(0), Scale(1.f), Mesh(0) { Mesh = new SMesh(); } diff --git a/examples/25.XmlHandling/main.cpp b/examples/25.XmlHandling/main.cpp index 657ad8dc..d022e5c2 100644 --- a/examples/25.XmlHandling/main.cpp +++ b/examples/25.XmlHandling/main.cpp @@ -142,6 +142,8 @@ public: //we were at the end of the video section so we reset our tag currentSection=L""; break; + default: + break; } } @@ -344,6 +346,8 @@ public: } } break; + default: + break; } } diff --git a/examples/Demo/CDemo.cpp b/examples/Demo/CDemo.cpp index 49dd7b6e..6c073ab3 100644 --- a/examples/Demo/CDemo.cpp +++ b/examples/Demo/CDemo.cpp @@ -497,6 +497,7 @@ void CDemo::loadSceneData() bill = sm->addBillboardSceneNode(0, core::dimension2d(100,100), waypoint[r]+ core::vector3df(0,20,0)); bill->setMaterialFlag(video::EMF_LIGHTING, false); + bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); bill->setMaterialTexture(0, driver->getTexture(mediaPath + "portal1.bmp")); bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); bill->addAnimator(anim); @@ -583,7 +584,7 @@ void CDemo::createLoadingScreen() const io::path mediaPath = getExampleMediaPath(); // irrlicht logo - device->getGUIEnvironment()->addImage(device->getVideoDriver()->getTexture(mediaPath + "irrlichtlogo2.png"), + device->getGUIEnvironment()->addImage(device->getVideoDriver()->getTexture(mediaPath + "irrlichtlogo3.png"), core::position2d(5,5)); // loading text @@ -648,8 +649,8 @@ void CDemo::shoot() else { // doesnt collide with wall - core::vector3df start = camera->getPosition(); - core::vector3df end = (camera->getTarget() - start); + start = camera->getPosition(); + end = (camera->getTarget() - start); end.normalize(); start += end*8.0f; end = start + (end * camera->getFarValue()); diff --git a/examples/Demo/CMainMenu.cpp b/examples/Demo/CMainMenu.cpp index ebc9469e..432c8727 100644 --- a/examples/Demo/CMainMenu.cpp +++ b/examples/Demo/CMainMenu.cpp @@ -27,9 +27,9 @@ CMainMenu::CMainMenu() bool CMainMenu::run() { - video::E_DRIVER_TYPE driverType = EDT_OPENGL; + video::E_DRIVER_TYPE driverType = video::EDT_OPENGL; if (!IrrlichtDevice::isDriverSupported(video::EDT_OPENGL)) - driverType = video::video::EDT_BURNINGSVIDEO; + driverType = video::EDT_BURNINGSVIDEO; MenuDevice = createDevice(driverType, core::dimension2d(512, 384), 16, false, false, false, this); @@ -195,6 +195,7 @@ bool CMainMenu::run() { bill->setMaterialFlag(video::EMF_LIGHTING, false); bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); + bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); bill->setMaterialTexture(0, driver->getTexture(mediaPath + "particlered.bmp")); } // add fly circle animator to the light @@ -213,6 +214,7 @@ bool CMainMenu::run() { bill->setMaterialFlag(video::EMF_LIGHTING, false); bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); + bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); bill->setMaterialTexture(0, driver->getTexture(mediaPath + "portal1.bmp")); } // add fly circle animator to the light @@ -275,7 +277,7 @@ bool CMainMenu::run() { if (!selected) { - outDriver=video::E_DRIVER_TYPE(i); + driverType=video::E_DRIVER_TYPE(i); break; } --selected; diff --git a/source/Irrlicht/Android/jni/Android.mk b/source/Irrlicht/Android/jni/Android.mk index 54fb245b..05a2d281 100755 --- a/source/Irrlicht/Android/jni/Android.mk +++ b/source/Irrlicht/Android/jni/Android.mk @@ -31,6 +31,7 @@ LOCAL_SRC_FILES := \ aesGladman/pwd2key.cpp \ aesGladman/sha1.cpp \ aesGladman/sha2.cpp \ + burning_shader_color.cpp \ C3DSMeshFileLoader.cpp \ CAnimatedMeshHalfLife.cpp \ CAnimatedMeshMD2.cpp \ @@ -221,6 +222,7 @@ LOCAL_SRC_FILES := \ CTRGouraudWire.cpp \ CTriangleBBSelector.cpp \ CTriangleSelector.cpp \ + CTRGouraudNoZ2.cpp \ CTRNormalMap.cpp \ CTRStencilShadow.cpp \ CTRTextureBlend.cpp \ @@ -244,6 +246,7 @@ LOCAL_SRC_FILES := \ CTRTextureLightMap2_M4.cpp \ CTRTextureLightMapGouraud2_M4.cpp \ CTRTextureWire2.cpp \ + CTR_transparent_reflection_2_layer.cpp \ CVideoModeList.cpp \ CVolumeLightSceneNode.cpp \ CWADReader.cpp \ diff --git a/source/Irrlicht/CAnimatedMeshSceneNode.cpp b/source/Irrlicht/CAnimatedMeshSceneNode.cpp index 593496a4..de96749b 100644 --- a/source/Irrlicht/CAnimatedMeshSceneNode.cpp +++ b/source/Irrlicht/CAnimatedMeshSceneNode.cpp @@ -112,12 +112,12 @@ void CAnimatedMeshSceneNode::buildFrameNr(u32 timeMs) if (FramesPerSecond > 0.f) //forwards... { if (CurrentFrameNr > EndFrame) - CurrentFrameNr = StartFrame + fmod(CurrentFrameNr - StartFrame, (f32)(EndFrame-StartFrame)); + CurrentFrameNr = StartFrame + fmodf(CurrentFrameNr - StartFrame, (f32)(EndFrame-StartFrame)); } else //backwards... { if (CurrentFrameNr < StartFrame) - CurrentFrameNr = EndFrame - fmod(EndFrame - CurrentFrameNr, (f32)(EndFrame-StartFrame)); + CurrentFrameNr = EndFrame - fmodf(EndFrame - CurrentFrameNr, (f32)(EndFrame-StartFrame)); } } else diff --git a/source/Irrlicht/CBlit.h b/source/Irrlicht/CBlit.h index d67a76b0..b7788289 100644 --- a/source/Irrlicht/CBlit.h +++ b/source/Irrlicht/CBlit.h @@ -10,6 +10,28 @@ namespace irr { +//! f18 - fixpoint 14.18 limit to 16k Textures +#define CBLIT_USE_FIXPOINT18 + +#if defined(CBLIT_USE_FIXPOINT18) + typedef int f18; + #define f18_one 262144 + #define f18_zero 0 + #define f32_to_f18(x)((f18)floorf(((x) * 262144.f) + 0.f)) + #define f32_to_f32(x)(x) + #define f18_floor(x) ((x)>>18) + #define f18_round(x) ((x+131.072)>>18) +#else + typedef float f18; + #define f18_one 1.f + #define f18_zero_dot_five 0.5f + #define f18_zero 0.f + #define f32_to_f18(x)(x) + #define f32_to_f32(x)(x) + #define f18_floor(x) ((int)(x)) + #define f18_round(x) ((int)(x+0.5f)) +#endif + struct SBlitJob { AbsRectangle Dest; @@ -17,23 +39,21 @@ namespace irr u32 argb; - void * src; - void * dst; + const void* src; + void* dst; - s32 width; - s32 height; + u32 width; //draw size + u32 height; - u32 srcPitch; - u32 dstPitch; - - u32 srcPixelMul; + u32 srcPixelMul; //pixel byte size u32 dstPixelMul; - bool stretch; - float x_stretch; - float y_stretch; + int srcPitch; //scanline byte size. allow negative for mirror + u32 dstPitch; - SBlitJob() : stretch(false) {} + bool stretch; + f32 x_stretch; + f32 y_stretch; }; // Bitfields Cohen Sutherland @@ -237,7 +257,7 @@ static void RenderLine32_Decal(video::IImage *t, } u32 *dst; - dst = (u32*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X << 2 ) ); + dst = (u32*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 4 ) ); if ( dy > dx ) { @@ -301,7 +321,7 @@ static void RenderLine32_Blend(video::IImage *t, } u32 *dst; - dst = (u32*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X << 2 ) ); + dst = (u32*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 4 ) ); if ( dy > dx ) { @@ -365,7 +385,7 @@ static void RenderLine16_Decal(video::IImage *t, } u16 *dst; - dst = (u16*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X << 1 ) ); + dst = (u16*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 2 ) ); if ( dy > dx ) { @@ -429,7 +449,7 @@ static void RenderLine16_Blend(video::IImage *t, } u16 *dst; - dst = (u16*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X << 1 ) ); + dst = (u16*) ( (u8*) t->getData() + ( p0.Y * t->getPitch() ) + ( p0.X * 2 ) ); if ( dy > dx ) { @@ -467,37 +487,57 @@ static void RenderLine16_Blend(video::IImage *t, */ static void executeBlit_TextureCopy_x_to_x( const SBlitJob * job ) { - const u32 w = job->width; - const u32 h = job->height; if (job->stretch) { - const u32 *src = static_cast(job->src); - u32 *dst = static_cast(job->dst); - const float wscale = 1.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; + const f18 wscale = f32_to_f18(job->x_stretch); + const f18 hscale = f32_to_f18(job->y_stretch); - for ( u32 dy = 0; dy < h; ++dy ) + f18 src_y = f18_zero; + + if (job->srcPixelMul == 4) { - const u32 src_y = (u32)(dy*hscale); - src = (u32*) ( (u8*) (job->src) + job->srcPitch*src_y ); + const u32 *src = (u32*)(job->src); + u32 *dst = (u32*)(job->dst); - for ( u32 dx = 0; dx < w; ++dx ) + for (u32 dy = 0; dy < job->height; ++dy, src_y += hscale) { - const u32 src_x = (u32)(dx*wscale); - dst[dx] = src[src_x]; + src = (u32*)((u8*)(job->src) + job->srcPitch*f18_floor(src_y)); + + f18 src_x = f18_zero; + for (u32 dx = 0; dx < job->width; ++dx, src_x += wscale) + { + dst[dx] = src[f18_floor(src_x)]; + } + dst = (u32*)((u8*)(dst)+job->dstPitch); + } + } + else if (job->srcPixelMul == 2) + { + const u16 *src = (u16*)(job->src); + u16* dst = (u16*)(job->dst); + + for (u32 dy = 0; dy < job->height; ++dy, src_y += hscale) + { + src = (u16*)((u8*)(job->src) + job->srcPitch*f18_floor(src_y)); + + f18 src_x = f18_zero; + for (u32 dx = 0; dx < job->width; ++dx, src_x += wscale) + { + dst[dx] = src[f18_floor(src_x)]; + } + dst = (u16*)((u8*)(dst)+job->dstPitch); } - dst = (u32*) ( (u8*) (dst) + job->dstPitch ); } } else { - const u32 widthPitch = job->width * job->dstPixelMul; + const size_t widthPitch = job->width * job->dstPixelMul; const void *src = (void*) job->src; void *dst = (void*) job->dst; - for ( u32 dy = 0; dy != h; ++dy ) + for ( u32 dy = 0; dy < job->height; ++dy ) { - memcpy( dst, src, widthPitch ); + memcpy( dst, src, widthPitch); src = (void*) ( (u8*) (src) + job->srcPitch ); dst = (void*) ( (u8*) (dst) + job->dstPitch ); @@ -516,8 +556,8 @@ static void executeBlit_TextureCopy_32_to_16( const SBlitJob * job ) if (job->stretch) { - const float wscale = 1.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; + const float wscale = job->x_stretch; + const float hscale = job->y_stretch; for ( u32 dy = 0; dy < h; ++dy ) { @@ -562,8 +602,8 @@ static void executeBlit_TextureCopy_24_to_16( const SBlitJob * job ) if (job->stretch) { - const float wscale = 3.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; + const float wscale = job->x_stretch * 3.f; + const float hscale = job->y_stretch; for ( u32 dy = 0; dy < h; ++dy ) { @@ -607,8 +647,8 @@ static void executeBlit_TextureCopy_16_to_32( const SBlitJob * job ) if (job->stretch) { - const float wscale = 1.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; + const float wscale = job->x_stretch; + const float hscale = job->y_stretch; for ( u32 dy = 0; dy < h; ++dy ) { @@ -647,8 +687,8 @@ static void executeBlit_TextureCopy_16_to_24( const SBlitJob * job ) if (job->stretch) { - const float wscale = 1.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; + const float wscale = job->x_stretch; + const float hscale = job->y_stretch; for ( u32 dy = 0; dy < h; ++dy ) { @@ -697,8 +737,8 @@ static void executeBlit_TextureCopy_24_to_32( const SBlitJob * job ) if (job->stretch) { - const float wscale = 3.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; + const float wscale = job->x_stretch * 3.f; + const float hscale = job->y_stretch; for ( u32 dy = 0; dy < h; ++dy ) { @@ -715,11 +755,11 @@ static void executeBlit_TextureCopy_24_to_32( const SBlitJob * job ) } else { - for ( s32 dy = 0; dy != job->height; ++dy ) + for ( u32 dy = 0; dy < job->height; ++dy ) { const u8* s = src; - for ( s32 dx = 0; dx != job->width; ++dx ) + for ( u32 dx = 0; dx < job->width; ++dx ) { dst[dx] = 0xFF000000 | s[0] << 16 | s[1] << 8 | s[2]; s += 3; @@ -740,8 +780,8 @@ static void executeBlit_TextureCopy_32_to_24( const SBlitJob * job ) if (job->stretch) { - const float wscale = 1.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; + const float wscale = job->x_stretch; + const float hscale = job->y_stretch; for ( u32 dy = 0; dy < h; ++dy ) { @@ -781,54 +821,21 @@ static void executeBlit_TextureCopy_32_to_24( const SBlitJob * job ) */ static void executeBlit_TextureBlend_16_to_16( const SBlitJob * job ) { - const u32 w = job->width; - const u32 h = job->height; - const u32 rdx = w>>1; + const f18 wscale = f32_to_f18(job->x_stretch); + const f18 hscale = f32_to_f18(job->y_stretch); - const u32 *src = (u32*) job->src; - u32 *dst = (u32*) job->dst; + f18 src_y = f18_zero; + u16 *dst = (u16*)job->dst; - if (job->stretch) + for (u32 dy = 0; dy < job->height; ++dy, src_y += hscale) { - const float wscale = 1.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; - const u32 off = core::if_c_a_else_b(w&1, (u32)((w-1)*wscale), 0); - for ( u32 dy = 0; dy < h; ++dy ) + const u16* src = (u16*)((u8*)(job->src) + job->srcPitch*f18_floor(src_y)); + f18 src_x = f18_zero; + for (u32 dx = 0; dx < job->width; ++dx, src_x += wscale) { - const u32 src_y = (u32)(dy*hscale); - src = (u32*) ( (u8*) (job->src) + job->srcPitch*src_y ); - - for ( u32 dx = 0; dx < rdx; ++dx ) - { - const u32 src_x = (u32)(dx*wscale); - dst[dx] = PixelBlend16_simd( dst[dx], src[src_x] ); - } - if ( off ) - { - ((u16*) dst)[off] = PixelBlend16( ((u16*) dst)[off], ((u16*) src)[off] ); - } - - dst = (u32*) ( (u8*) (dst) + job->dstPitch ); - } - } - else - { - const u32 off = core::if_c_a_else_b(w&1, w-1, 0); - for (u32 dy = 0; dy != h; ++dy ) - { - for (u32 dx = 0; dx != rdx; ++dx ) - { - dst[dx] = PixelBlend16_simd( dst[dx], src[dx] ); - } - - if ( off ) - { - ((u16*) dst)[off] = PixelBlend16( ((u16*) dst)[off], ((u16*) src)[off] ); - } - - src = (u32*) ( (u8*) (src) + job->srcPitch ); - dst = (u32*) ( (u8*) (dst) + job->dstPitch ); + dst[dx] = PixelBlend16(dst[dx], src[f18_floor(src_x)]); } + dst = (u16*)((u8*)(dst)+job->dstPitch); } } @@ -836,40 +843,21 @@ static void executeBlit_TextureBlend_16_to_16( const SBlitJob * job ) */ static void executeBlit_TextureBlend_32_to_32( const SBlitJob * job ) { - const u32 w = job->width; - const u32 h = job->height; - const u32 *src = (u32*) job->src; - u32 *dst = (u32*) job->dst; + const f18 wscale = f32_to_f18(job->x_stretch); + const f18 hscale = f32_to_f18(job->y_stretch); - if (job->stretch) + f18 src_y = f18_zero; + u32 *dst = (u32*)job->dst; + for (u32 dy = 0; dy < job->height; ++dy, src_y += hscale) { - const float wscale = 1.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; - for ( u32 dy = 0; dy < h; ++dy ) - { - const u32 src_y = (u32)(dy*hscale); - src = (u32*) ( (u8*) (job->src) + job->srcPitch*src_y ); + const u32* src = (u32*)((u8*)(job->src) + job->srcPitch*f18_floor(src_y)); - for ( u32 dx = 0; dx < w; ++dx ) - { - const u32 src_x = (u32)(dx*wscale); - dst[dx] = PixelBlend32( dst[dx], src[src_x] ); - } - - dst = (u32*) ( (u8*) (dst) + job->dstPitch ); - } - } - else - { - for ( u32 dy = 0; dy != h; ++dy ) + f18 src_x = f18_zero; + for (u32 dx = 0; dx < job->width; ++dx, src_x += wscale) { - for ( u32 dx = 0; dx != w; ++dx ) - { - dst[dx] = PixelBlend32( dst[dx], src[dx] ); - } - src = (u32*) ( (u8*) (src) + job->srcPitch ); - dst = (u32*) ( (u8*) (dst) + job->dstPitch ); + dst[dx] = PixelBlend32(dst[dx], src[f18_floor(src_x)]); } + dst = (u32*)((u8*)(dst)+job->dstPitch); } } @@ -877,21 +865,26 @@ static void executeBlit_TextureBlend_32_to_32( const SBlitJob * job ) */ static void executeBlit_TextureBlendColor_16_to_16( const SBlitJob * job ) { - u16 *src = (u16*) job->src; - u16 *dst = (u16*) job->dst; + const u16 blend = video::A8R8G8B8toA1R5G5B5(job->argb); - u16 blend = video::A8R8G8B8toA1R5G5B5 ( job->argb ); - for ( s32 dy = 0; dy != job->height; ++dy ) + const f18 wscale = f32_to_f18(job->x_stretch); + const f18 hscale = f32_to_f18(job->y_stretch); + + f18 src_y = f18_zero; + u16 *dst = (u16*)job->dst; + for (u32 dy = 0; dy < job->height; ++dy, src_y += hscale) { - for ( s32 dx = 0; dx != job->width; ++dx ) + const u16* src = (u16*)((u8*)(job->src) + job->srcPitch*f18_floor(src_y)); + f18 src_x = f18_zero; + for (u32 dx = 0; dx < job->width; ++dx, src_x += wscale) { - if ( 0 == (src[dx] & 0x8000) ) + register u16 c0 = src[f18_floor(src_x)]; + if (0 == (c0 & 0x8000)) continue; - dst[dx] = PixelMul16_2( src[dx], blend ); + dst[dx] = PixelMul16_2(c0, blend); } - src = (u16*) ( (u8*) (src) + job->srcPitch ); - dst = (u16*) ( (u8*) (dst) + job->dstPitch ); + dst = (u16*)((u8*)(dst)+job->dstPitch); } } @@ -900,17 +893,21 @@ static void executeBlit_TextureBlendColor_16_to_16( const SBlitJob * job ) */ static void executeBlit_TextureBlendColor_32_to_32( const SBlitJob * job ) { - u32 *src = (u32*) job->src; - u32 *dst = (u32*) job->dst; + const f18 wscale = f32_to_f18(job->x_stretch); + const f18 hscale = f32_to_f18(job->y_stretch); - for ( s32 dy = 0; dy != job->height; ++dy ) + u32* dst = (u32*)job->dst; + f18 src_y = f18_zero; + for (u32 dy = 0; dy < job->height; ++dy, src_y += hscale) { - for ( s32 dx = 0; dx != job->width; ++dx ) + const u32* src = (u32*)((u8*)(job->src) + job->srcPitch*f18_floor(src_y)); + + f18 src_x = f18_zero; + for (u32 dx = 0; dx < job->width; ++dx, src_x += wscale) { - dst[dx] = PixelBlend32( dst[dx], PixelMul32_2( src[dx], job->argb ) ); + dst[dx] = PixelBlend32(dst[dx], PixelMul32_2(src[f18_floor(src_x)], job->argb)); } - src = (u32*) ( (u8*) (src) + job->srcPitch ); - dst = (u32*) ( (u8*) (dst) + job->dstPitch ); + dst = (u32*)((u8*)(dst)+job->dstPitch); } } @@ -921,7 +918,7 @@ static void executeBlit_Color_16_to_16( const SBlitJob * job ) const u16 c = video::A8R8G8B8toA1R5G5B5(job->argb); u16 *dst = (u16*) job->dst; - for ( s32 dy = 0; dy != job->height; ++dy ) + for ( u32 dy = 0; dy < job->height; ++dy ) { memset16(dst, c, job->srcPitch); dst = (u16*) ( (u8*) (dst) + job->dstPitch ); @@ -934,7 +931,7 @@ static void executeBlit_Color_32_to_32( const SBlitJob * job ) { u32 *dst = (u32*) job->dst; - for ( s32 dy = 0; dy != job->height; ++dy ) + for ( u32 dy = 0; dy < job->height; ++dy ) { memset32( dst, job->argb, job->srcPitch ); dst = (u32*) ( (u8*) (dst) + job->dstPitch ); @@ -952,11 +949,11 @@ static void executeBlit_ColorAlpha_16_to_16( const SBlitJob * job ) return; const u32 src = video::A8R8G8B8toA1R5G5B5( job->argb ); - for ( s32 dy = 0; dy != job->height; ++dy ) + for ( u32 dy = 0; dy != job->height; ++dy ) { - for ( s32 dx = 0; dx != job->width; ++dx ) + for ( u32 dx = 0; dx != job->width; ++dx ) { - dst[dx] = 0x8000 | PixelBlend16( dst[dx], src, alpha ); + dst[dx] = PixelBlend16( dst[dx], src, alpha ); } dst = (u16*) ( (u8*) (dst) + job->dstPitch ); } @@ -966,19 +963,33 @@ static void executeBlit_ColorAlpha_16_to_16( const SBlitJob * job ) */ static void executeBlit_ColorAlpha_32_to_32( const SBlitJob * job ) { - u32 *dst = (u32*) job->dst; - const u32 alpha = extractAlpha( job->argb ); - const u32 src = job->argb; + if (0 == alpha) + return; - for ( s32 dy = 0; dy != job->height; ++dy ) + u32 *dst = (u32*)job->dst; + for ( u32 dy = 0; dy < job->height; ++dy ) { - for ( s32 dx = 0; dx != job->width; ++dx ) + for ( u32 dx = 0; dx < job->width; ++dx ) { - dst[dx] = (job->argb & 0xFF000000 ) | PixelBlend32( dst[dx], src, alpha ); + dst[dx] = PixelBlend32( dst[dx], job->argb, alpha ); } dst = (u32*) ( (u8*) (dst) + job->dstPitch ); } + +} + +/*! + Pixel => + color = sourceAlpha > 0 ? source, else dest + alpha = max(destAlpha, sourceAlpha) +*/ +inline u16 PixelCombine16(const u16 c2, const u16 c1) +{ + if (video::getAlpha(c1) > 0) + return c1; + else + return c2; } /*! @@ -1023,8 +1034,8 @@ static void executeBlit_TextureCombineColor_16_to_24( const SBlitJob * job ) if (job->stretch) { - const float wscale = 1.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; + const float wscale = job->x_stretch; + const float hscale = job->y_stretch; for ( u32 dy = 0; dy < h; ++dy ) { @@ -1068,6 +1079,58 @@ static void executeBlit_TextureCombineColor_16_to_24( const SBlitJob * job ) } } +/*! + Pixel => + color = dest * ( 1 - SourceAlpha ) + source * SourceAlpha, + alpha = destAlpha * ( 1 - SourceAlpha ) + sourceAlpha + + where "1" means "full scale" (255) +*/ +inline u32 PixelCombine32(const u32 c2, const u32 c1) +{ + // alpha test + u32 alpha = c1 & 0xFF000000; + + if (0 == alpha) + return c2; + if (0xFF000000 == alpha) + { + return c1; + } + + alpha >>= 24; + + // add highbit alpha, if ( alpha > 127 ) alpha += 1; + // stretches [0;255] to [0;256] to avoid division by 255. use division 256 == shr 8 + alpha += (alpha >> 7); + + u32 srcRB = c1 & 0x00FF00FF; + u32 srcXG = c1 & 0x0000FF00; + + u32 dstRB = c2 & 0x00FF00FF; + u32 dstXG = c2 & 0x0000FF00; + + + u32 rb = srcRB - dstRB; + u32 xg = srcXG - dstXG; + + rb *= alpha; + xg *= alpha; + rb >>= 8; + xg >>= 8; + + rb += dstRB; + xg += dstXG; + + rb &= 0x00FF00FF; + xg &= 0x0000FF00; + + u32 sa = c1 >> 24; + u32 da = c2 >> 24; + u32 blendAlpha_fix8 = (sa * 256 + da * (256 - alpha)) >> 8; + return blendAlpha_fix8 << 24 | rb | xg; +} + /*! Combine alpha channels (increases alpha / reduces transparency) Destination alpha is treated as full 255 @@ -1081,8 +1144,8 @@ static void executeBlit_TextureCombineColor_32_to_24( const SBlitJob * job ) if (job->stretch) { - const float wscale = 1.f/job->x_stretch; - const float hscale = 1.f/job->y_stretch; + const float wscale = job->x_stretch; + const float hscale = job->y_stretch; for ( u32 dy = 0; dy < h; ++dy ) { @@ -1130,9 +1193,9 @@ static void executeBlit_TextureCombineColor_32_to_32( const SBlitJob * job ) u32 *src = (u32*) job->src; u32 *dst = (u32*) job->dst; - for ( s32 dy = 0; dy != job->height; ++dy ) + for ( u32 dy = 0; dy != job->height; ++dy ) { - for ( s32 dx = 0; dx != job->width; ++dx ) + for (u32 dx = 0; dx != job->width; ++dx ) { dst[dx] = PixelCombine32( dst[dx], PixelMul32_2( src[dx], job->argb ) ); } @@ -1220,26 +1283,46 @@ static inline tExecuteBlit getBlitter2( eBlitter operation,const video::IImage * // bounce clipping to texture -inline void setClip ( AbsRectangle &out, const core::rect *clip, - const video::IImage * tex, s32 passnative ) +inline void setClip(AbsRectangle &out, const core::rect *clip, + const video::IImage* tex, s32 passnative, const core::dimension2d* tex_org) { - if ( clip && 0 == tex && passnative ) + if (0 == tex) { - out.x0 = clip->UpperLeftCorner.X; - out.x1 = clip->LowerRightCorner.X; - out.y0 = clip->UpperLeftCorner.Y; - out.y1 = clip->LowerRightCorner.Y; + if (clip && passnative) + { + out.x0 = clip->UpperLeftCorner.X; + out.x1 = clip->LowerRightCorner.X; + out.y0 = clip->UpperLeftCorner.Y; + out.y1 = clip->LowerRightCorner.Y; + } + else + { + out.x0 = 0; + out.x1 = 0; + out.y0 = 0; + out.y1 = 0; + } return; } - const s32 w = tex ? tex->getDimension().Width : 0; - const s32 h = tex ? tex->getDimension().Height : 0; - if ( clip ) + const s32 w = tex->getDimension().Width; + const s32 h = tex->getDimension().Height; + + //driver could have changed texture size. + if (clip && tex_org && ((u32)w != tex_org->Width || (u32)h != tex_org->Height)) { - out.x0 = core::s32_clamp ( clip->UpperLeftCorner.X, 0, w ); - out.x1 = core::s32_clamp ( clip->LowerRightCorner.X, out.x0, w ); - out.y0 = core::s32_clamp ( clip->UpperLeftCorner.Y, 0, h ); - out.y1 = core::s32_clamp ( clip->LowerRightCorner.Y, out.y0, h ); + out.x0 = core::s32_clamp((clip->UpperLeftCorner.X*w) / tex_org->Width, 0, w - 1); + out.x1 = core::s32_clamp((clip->LowerRightCorner.X*w) / tex_org->Width, out.x0, w); + out.y0 = core::s32_clamp((clip->UpperLeftCorner.Y*h) / tex_org->Height, 0, h - 1); + out.y1 = core::s32_clamp((clip->LowerRightCorner.Y*h) / tex_org->Height, out.y0, h); + } + else if (clip) + { + //y-1 to prevent starting on illegal memory (not ideal!). + out.x0 = core::s32_clamp(clip->UpperLeftCorner.X, 0, w - 1); + out.x1 = core::s32_clamp(clip->LowerRightCorner.X, passnative ? 0 : out.x0, w); + out.y0 = core::s32_clamp(clip->UpperLeftCorner.Y, 0, h - 1); + out.y1 = core::s32_clamp(clip->LowerRightCorner.Y, passnative ? 0 : out.y0, h); } else { @@ -1275,8 +1358,8 @@ static s32 Blit(eBlitter operation, SBlitJob job; - setClip ( sourceClip, sourceClipping, source, 1 ); - setClip ( destClip, destClipping, dest, 0 ); + setClip ( sourceClip, sourceClipping, source, 1,0 ); + setClip ( destClip, destClipping, dest, 0,0 ); v.x0 = destPos ? destPos->X : 0; v.y0 = destPos ? destPos->Y : 0; @@ -1296,6 +1379,10 @@ static s32 Blit(eBlitter operation, job.argb = argb; + job.stretch = false; + job.x_stretch = 1.f; + job.y_stretch = 1.f; + if ( source ) { job.srcPitch = source->getPitch(); @@ -1317,9 +1404,10 @@ static s32 Blit(eBlitter operation, return 1; } +#if defined(SOFTWARE_DRIVER_2_2D_AS_2D) static s32 StretchBlit(eBlitter operation, - video::IImage* dest, const core::rect *destRect, - const core::rect *srcRect, video::IImage* const source, + video::IImage* dest, const core::rect* destClipping,const core::rect *destRect, + video::IImage* const source,const core::rect *srcRect, const core::dimension2d* source_org, u32 argb) { tExecuteBlit blitter = getBlitter2( operation, dest, source ); @@ -1330,9 +1418,15 @@ static s32 StretchBlit(eBlitter operation, SBlitJob job; + AbsRectangle destClip; + AbsRectangle v; + setClip(destClip, destClipping, dest, 0, 0); + setClip(v, destRect, 0, 1, 0); + if (!intersect(job.Dest, destClip, v)) + return 0; + // Clipping - setClip ( job.Source, srcRect, source, 1 ); - setClip ( job.Dest, destRect, dest, 0 ); + setClip ( job.Source, srcRect, source, 1, source_org); job.width = job.Dest.x1-job.Dest.x0; job.height = job.Dest.y1-job.Dest.y0; @@ -1340,14 +1434,25 @@ static s32 StretchBlit(eBlitter operation, job.argb = argb; // use original dest size, despite any clipping - job.x_stretch = (float)destRect->getWidth() / (float)(job.Source.x1-job.Source.x0); - job.y_stretch = (float)destRect->getHeight() / (float)(job.Source.y1-job.Source.y0); - job.stretch = (job.x_stretch != 1.f) || (job.y_stretch != 1.f); + const int dst_w = v.x1 - v.x0; // destRect->getWidth(); + const int dst_h = v.y1 - v.y0; // destRect->getHeight(); + const int src_w = job.Source.x1 - job.Source.x0; + const int src_h = job.Source.y1 - job.Source.y0; + + job.stretch = dst_w != src_w || dst_h != src_h; + job.x_stretch = dst_w ? (float)src_w / (float)dst_w : 1.f; + job.y_stretch = dst_h ? (float)src_h / (float)dst_h : 1.f; + if ( source ) { job.srcPitch = source->getPitch(); job.srcPixelMul = source->getBytesPerPixel(); + + //dest-clippling. advance source. loosing subpixel precision + job.Source.x0 += (s32)floorf(job.x_stretch * (job.Dest.x0 - v.x0)); + job.Source.y0 += (s32)floorf(job.y_stretch * (job.Dest.y0 - v.y0)); + job.src = (void*) ( (u8*) source->getData() + ( job.Source.y0 * job.srcPitch ) + ( job.Source.x0 * job.srcPixelMul ) ); } else @@ -1364,7 +1469,7 @@ static s32 StretchBlit(eBlitter operation, return 1; } - +#endif // Methods for Software drivers //! draws a rectangle diff --git a/source/Irrlicht/CBurningShader_Raster_Reference.cpp b/source/Irrlicht/CBurningShader_Raster_Reference.cpp index c04db94b..3d9dacc6 100644 --- a/source/Irrlicht/CBurningShader_Raster_Reference.cpp +++ b/source/Irrlicht/CBurningShader_Raster_Reference.cpp @@ -5,7 +5,7 @@ #include "IrrCompileConfig.h" #include "IBurningShader.h" -#ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ +#if defined(_IRR_COMPILE_WITH_BURNINGSVIDEO_) && 0 namespace irr @@ -558,7 +558,7 @@ void CBurningShader_Raster_Reference::pShader_EMT_LIGHTMAP_M4 () getSample_texture ( r1, g1, b1, &IT[1], tofix ( line.t[1][0].x,inversew), tofix ( line.t[1][0].y,inversew) ); - pShader.dst[pShader.i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex2 ( r0, r1 ) ), + pShader.dst[pShader.i] = fix_to_sample( clampfix_maxcolor ( imulFix_tex2 ( r0, r1 ) ), clampfix_maxcolor ( imulFix_tex2 ( g0, g1 ) ), clampfix_maxcolor ( imulFix_tex2 ( b0, b1 ) ) ); @@ -578,7 +578,7 @@ void CBurningShader_Raster_Reference::pShader_1 () ty0 = tofix ( line.t[0][0].y, inversew ); getSample_texture ( r0, g0, b0, &IT[0], tx0, ty0 ); - pShader.dst[pShader.i] = fix_to_color ( r0, g0, b0 ); + pShader.dst[pShader.i] = fix_to_sample( r0, g0, b0 ); } @@ -690,15 +690,15 @@ REALINLINE void CBurningShader_Raster_Reference::depthWrite () REALINLINE void CBurningShader_Raster_Reference::scanline2() { // apply top-left fill-convention, left - pShader.xStart = core::ceil32_fast( line.x[0] ); - pShader.xEnd = core::ceil32_fast( line.x[1] ) - 1; + pShader.xStart = fill_convention_left( line.x[0] ); + pShader.xEnd = fill_convention_right( line.x[1] ); pShader.dx = pShader.xEnd - pShader.xStart; if ( pShader.dx < 0 ) return; // slopes - const f32 invDeltaX = core::reciprocal ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); const f32 subPixel = ( (f32) pShader.xStart ) - line.x[0]; // store slopes in endpoint, and correct first pixel @@ -707,7 +707,7 @@ REALINLINE void CBurningShader_Raster_Reference::scanline2() u32 i; -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { line.c[i][1] = (line.c[i][1] - line.c[i][0]) * invDeltaX; @@ -721,6 +721,7 @@ REALINLINE void CBurningShader_Raster_Reference::scanline2() line.t[i][0] += line.t[i][1] * subPixel; } + SOFTWARE_DRIVER_2_CLIPCHECK_REF; pShader.dst = (tVideoSample*) ( (u8*) RenderTarget->getData() + ( line.y * RenderTarget->getPitch() ) + ( pShader.xStart << VIDEO_SAMPLE_GRANULARITY ) ); pShader.z = (fp24*) ( (u8*) DepthBuffer->lock() + ( line.y * DepthBuffer->getPitch() ) + ( pShader.xStart << VIDEO_SAMPLE_GRANULARITY ) ); @@ -734,7 +735,7 @@ REALINLINE void CBurningShader_Raster_Reference::scanline2() // advance next pixel line.w[0] += line.w[1]; -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { line.c[i][0] += line.c[i][1]; @@ -755,15 +756,15 @@ REALINLINE void CBurningShader_Raster_Reference::scanline () u32 i; // apply top-left fill-convention, left - pShader.xStart = core::ceil32_fast( line.x[0] ); - pShader.xEnd = core::ceil32_fast( line.x[1] ) - 1; + pShader.xStart = fill_convention_left( line.x[0] ); + pShader.xEnd = fill_convention_right( line.x[1] ); pShader.dx = pShader.xEnd - pShader.xStart; if ( pShader.dx < 0 ) return; // slopes - const f32 invDeltaX = core::reciprocal ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); // search z-buffer for first not occulled pixel pShader.z = (fp24*) ( (u8*) DepthBuffer->lock() + ( line.y * DepthBuffer->getPitch() ) + ( pShader.xStart << VIDEO_SAMPLE_GRANULARITY ) ); @@ -787,6 +788,9 @@ REALINLINE void CBurningShader_Raster_Reference::scanline () case BD3DCMP_EQUAL: condition = a != pShader.z[pShader.i]; break; + default: + condition = 0; + break; } while ( a < pShader.z[pShader.i] ) { @@ -807,7 +811,7 @@ REALINLINE void CBurningShader_Raster_Reference::scanline () a = (f32) pShader.i + subPixel; -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { line.c[i][1] = (line.c[i][1] - line.c[i][0]) * invDeltaX; @@ -832,7 +836,7 @@ REALINLINE void CBurningShader_Raster_Reference::scanline () line.w[0] += line.w[1]; -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { line.c[i][0] += line.c[i][1]; @@ -847,7 +851,7 @@ REALINLINE void CBurningShader_Raster_Reference::scanline () } -void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CBurningShader_Raster_Reference::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { sScanConvertData scan; u32 i; @@ -859,9 +863,9 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y ); - scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y ); - scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y ); + scan.invDeltaY[0] = reciprocal_zero2( c->Pos.y - a->Pos.y ); + scan.invDeltaY[1] = reciprocal_zero2( b->Pos.y - a->Pos.y ); + scan.invDeltaY[2] = reciprocal_zero2( c->Pos.y - b->Pos.y ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -885,7 +889,7 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 scan.slopeW[0] = (c->Pos.w - a->Pos.w) * scan.invDeltaY[0]; scan.w[0] = a->Pos.w; -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { scan.c[i][0] = a->Color[i]; @@ -915,7 +919,7 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 scan.slopeW[1] = (b->Pos.w - a->Pos.w) * scan.invDeltaY[1]; scan.w[1] = a->Pos.w; -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { scan.c[i][1] = a->Color[i]; @@ -929,8 +933,8 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 } // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); subPixel = ( (f32) yStart ) - a->Pos.y; @@ -941,12 +945,13 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 scan.w[0] += scan.slopeW[0] * subPixel; scan.w[1] += scan.slopeW[1] * subPixel; +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { scan.c[i][0] += scan.slopeC[i][0] * subPixel; scan.c[i][1] += scan.slopeC[i][1] * subPixel; } - +#endif for ( i = 0; i != ShaderParam.TextureUnits; ++i ) { scan.t[i][0] += scan.slopeT[i][0] * subPixel; @@ -962,7 +967,7 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 line.x[scan.right] = scan.x[1]; line.w[scan.right] = scan.w[1]; -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { line.c[i][scan.left] = scan.c[i][0]; @@ -984,12 +989,13 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 scan.w[0] += scan.slopeW[0]; scan.w[1] += scan.slopeW[1]; +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { scan.c[i][0] += scan.slopeC[i][0]; scan.c[i][1] += scan.slopeC[i][1]; } - +#endif for ( i = 0; i != ShaderParam.TextureUnits; ++i ) { scan.t[i][0] += scan.slopeT[i][0]; @@ -1010,7 +1016,7 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 scan.x[0] = a->Pos.x + scan.slopeX[0] * temp[0]; scan.w[0] = a->Pos.w + scan.slopeW[0] * temp[0]; -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { scan.c[i][0] = a->Color[i] + scan.slopeC[i][0] * temp[0]; @@ -1029,7 +1035,7 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 scan.slopeW[1] = (c->Pos.w - b->Pos.w) * scan.invDeltaY[2]; scan.w[1] = b->Pos.w; -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { scan.c[i][1] = b->Color[i]; @@ -1043,8 +1049,8 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 } // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); subPixel = ( (f32) yStart ) - b->Pos.y; @@ -1056,12 +1062,13 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 scan.w[0] += scan.slopeW[0] * subPixel; scan.w[1] += scan.slopeW[1] * subPixel; +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { scan.c[i][0] += scan.slopeC[i][0] * subPixel; scan.c[i][1] += scan.slopeC[i][1] * subPixel; } - +#endif for ( i = 0; i != ShaderParam.TextureUnits; ++i ) { scan.t[i][0] += scan.slopeT[i][0] * subPixel; @@ -1077,7 +1084,7 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 line.x[scan.right] = scan.x[1]; line.w[scan.right] = scan.w[1]; -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS > 0 for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { line.c[i][scan.left] = scan.c[i][0]; @@ -1099,12 +1106,13 @@ void CBurningShader_Raster_Reference::drawTriangle ( const s4DVertex *a,const s4 scan.w[0] += scan.slopeW[0]; scan.w[1] += scan.slopeW[1]; - for ( i = 0; i != ShaderParam.TextureUnits; ++i ) +#if BURNING_MATERIAL_MAX_COLORS > 0 + for ( i = 0; i != ShaderParam.ColorUnits; ++i ) { scan.c[i][0] += scan.slopeC[i][0]; scan.c[i][1] += scan.slopeC[i][1]; } - +#endif for ( i = 0; i != ShaderParam.TextureUnits; ++i ) { scan.t[i][0] += scan.slopeT[i][0]; diff --git a/source/Irrlicht/CDepthBuffer.cpp b/source/Irrlicht/CDepthBuffer.cpp index e9126bda..eed72345 100644 --- a/source/Irrlicht/CDepthBuffer.cpp +++ b/source/Irrlicht/CDepthBuffer.cpp @@ -30,30 +30,32 @@ CDepthBuffer::CDepthBuffer(const core::dimension2d& size) //! destructor CDepthBuffer::~CDepthBuffer() { - delete [] Buffer; + if (Buffer) + { + delete[] Buffer; + Buffer = 0; + } } //! clears the zbuffer -void CDepthBuffer::clear() +void CDepthBuffer::clear(f32 value) { + ieee754 zMaxValue; #ifdef SOFTWARE_DRIVER_2_USE_WBUFFER - f32 zMax = 0.f; + zMaxValue.f = 1.f-value; #else - f32 zMax = 1.f; + zMaxValue.f = value; #endif - u32 zMaxValue; - zMaxValue = IR(zMax); - - memset32 ( Buffer, zMaxValue, TotalSize ); + memset32 ( Buffer, zMaxValue.u, TotalSize ); } -//! sets the new size of the zbuffer +//! sets the new size of the buffer void CDepthBuffer::setSize(const core::dimension2d& size) { if (size == Size) @@ -65,13 +67,13 @@ void CDepthBuffer::setSize(const core::dimension2d& size) Pitch = size.Width * sizeof ( fp24 ); TotalSize = Pitch * size.Height; - Buffer = new u8[TotalSize]; + Buffer = new u8[align_next(TotalSize,16)]; clear (); } -//! returns the size of the zbuffer +//! returns the size of the buffer const core::dimension2d& CDepthBuffer::getSize() const { return Size; @@ -80,11 +82,11 @@ const core::dimension2d& CDepthBuffer::getSize() const // ----------------------------------------------------------------- //! constructor -CStencilBuffer::CStencilBuffer(const core::dimension2d& size) -: Buffer(0), Size(0,0) +CStencilBuffer::CStencilBuffer(const core::dimension2d& size, unsigned bit) +: Buffer(0), Size(0,0),Bit(bit) { #ifdef _DEBUG - setDebugName("CDepthBuffer"); + setDebugName("CStencilBuffer"); #endif setSize(size); @@ -95,20 +97,30 @@ CStencilBuffer::CStencilBuffer(const core::dimension2d& size) //! destructor CStencilBuffer::~CStencilBuffer() { - delete [] Buffer; + if (Buffer) + { + delete[] Buffer; + Buffer = 0; + } } -//! clears the zbuffer -void CStencilBuffer::clear() +//! clears the buffer +void CStencilBuffer::clear(u8 value) { - memset32 ( Buffer, 0, TotalSize ); + u32 set = value; + if (Bit == 8) + { + set |= set << 8; + set |= set << 16; + } + memset32 ( Buffer, set, TotalSize ); } -//! sets the new size of the zbuffer +//! sets the new size of the buffer void CStencilBuffer::setSize(const core::dimension2d& size) { if (size == Size) @@ -118,15 +130,15 @@ void CStencilBuffer::setSize(const core::dimension2d& size) delete [] Buffer; - Pitch = size.Width * sizeof ( u32 ); + Pitch = size.Width * sizeof (tStencilSample); TotalSize = Pitch * size.Height; - Buffer = new u8[TotalSize]; + Buffer = new u8[align_next(TotalSize,16)]; clear (); } -//! returns the size of the zbuffer +//! returns the size of the buffer const core::dimension2d& CStencilBuffer::getSize() const { return Size; @@ -155,11 +167,11 @@ IDepthBuffer* createDepthBuffer(const core::dimension2d& size) } -//! creates a ZBuffer -IStencilBuffer* createStencilBuffer(const core::dimension2d& size) +//! creates a Stencil Buffer +IStencilBuffer* createStencilBuffer(const core::dimension2d& size, u32 bit) { #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ - return new CStencilBuffer(size); + return new CStencilBuffer(size,bit); #else return 0; #endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ diff --git a/source/Irrlicht/CDepthBuffer.h b/source/Irrlicht/CDepthBuffer.h index 7964efa6..aa9c33de 100644 --- a/source/Irrlicht/CDepthBuffer.h +++ b/source/Irrlicht/CDepthBuffer.h @@ -23,7 +23,7 @@ namespace video virtual ~CDepthBuffer(); //! clears the zbuffer - virtual void clear() _IRR_OVERRIDE_; + virtual void clear(f32 value=1.f) _IRR_OVERRIDE_; //! sets the new size of the zbuffer virtual void setSize(const core::dimension2d& size) _IRR_OVERRIDE_; @@ -55,13 +55,13 @@ namespace video public: //! constructor - CStencilBuffer(const core::dimension2d& size); + CStencilBuffer(const core::dimension2d& size, unsigned bit); //! destructor virtual ~CStencilBuffer(); //! clears the zbuffer - virtual void clear() _IRR_OVERRIDE_; + virtual void clear(u8 value=0) _IRR_OVERRIDE_; //! sets the new size of the zbuffer virtual void setSize(const core::dimension2d& size) _IRR_OVERRIDE_; @@ -80,11 +80,11 @@ namespace video private: - u8* Buffer; core::dimension2d Size; u32 TotalSize; u32 Pitch; + u32 Bit; }; } // end namespace video diff --git a/source/Irrlicht/CGUIContextMenu.cpp b/source/Irrlicht/CGUIContextMenu.cpp index c28d30ab..3a6484be 100644 --- a/source/Irrlicht/CGUIContextMenu.cpp +++ b/source/Irrlicht/CGUIContextMenu.cpp @@ -88,6 +88,7 @@ u32 CGUIContextMenu::insertItem(u32 idx, const wchar_t* text, s32 commandId, boo s.IsSeparator = (text == 0); s.SubMenu = 0; s.CommandId = commandId; + s.PosY = 0; if (hasSubMenu) { diff --git a/source/Irrlicht/CImage.cpp b/source/Irrlicht/CImage.cpp index c59b0602..ffd23fcb 100644 --- a/source/Irrlicht/CImage.cpp +++ b/source/Irrlicht/CImage.cpp @@ -7,6 +7,7 @@ #include "CColorConverter.h" #include "CBlit.h" #include "os.h" +#include "SoftwareDriver2_helper.h" namespace irr { @@ -25,7 +26,7 @@ CImage::CImage(ECOLOR_FORMAT format, const core::dimension2d& size, void* d { const u32 dataSize = getDataSizeFromFormat(Format, Size.Width, Size.Height); - Data = new u8[dataSize]; + Data = new u8[align_next(dataSize,16)]; memcpy(Data, data, dataSize); DeleteMemory = true; } @@ -35,7 +36,7 @@ CImage::CImage(ECOLOR_FORMAT format, const core::dimension2d& size, void* d //! Constructor of empty image CImage::CImage(ECOLOR_FORMAT format, const core::dimension2d& size) : IImage(format, size, true) { - Data = new u8[getDataSizeFromFormat(Format, Size.Width, Size.Height)]; + Data = new u8[align_next(getDataSizeFromFormat(Format, Size.Width, Size.Height),16)]; DeleteMemory = true; } @@ -133,9 +134,9 @@ void CImage::copyTo(IImage* target, const core::position2d& pos) return; } - if ( !Blit(BLITTER_TEXTURE, target, 0, &pos, this, 0, 0) + if (!Blit(BLITTER_TEXTURE, target, 0, &pos, this, 0, 0) && target && pos.X == 0 && pos.Y == 0 && - CColorConverter::canConvertFormat(Format, target->getColorFormat()) ) + CColorConverter::canConvertFormat(Format, target->getColorFormat())) { // No fast blitting, but copyToScaling uses other color conversions and might work irr::core::dimension2du dim(target->getDimension()); @@ -166,16 +167,9 @@ void CImage::copyToWithAlpha(IImage* target, const core::position2d& pos, c return; } - if ( combineAlpha ) - { - Blit(BLITTER_TEXTURE_COMBINE_ALPHA, target, clipRect, &pos, this, &sourceRect, color.color); - } - else - { - // color blend only necessary on not full spectrum aka. color.color != 0xFFFFFFFF - Blit(color.color == 0xFFFFFFFF ? BLITTER_TEXTURE_ALPHA_BLEND: BLITTER_TEXTURE_ALPHA_COLOR_BLEND, - target, clipRect, &pos, this, &sourceRect, color.color); - } + eBlitter op = combineAlpha ? BLITTER_TEXTURE_COMBINE_ALPHA : + color.color == 0xFFFFFFFF ? BLITTER_TEXTURE_ALPHA_BLEND : BLITTER_TEXTURE_ALPHA_COLOR_BLEND; + Blit(op,target, clipRect, &pos, this, &sourceRect, color.color); } @@ -386,5 +380,6 @@ inline SColor CImage::getPixelBox( s32 x, s32 y, s32 fx, s32 fy, s32 bias ) cons } + } // end namespace video } // end namespace irr diff --git a/source/Irrlicht/CImageLoaderRGB.cpp b/source/Irrlicht/CImageLoaderRGB.cpp index 1f0b141e..dfb4b8b0 100644 --- a/source/Irrlicht/CImageLoaderRGB.cpp +++ b/source/Irrlicht/CImageLoaderRGB.cpp @@ -555,7 +555,7 @@ void CImageLoaderRGB::readRGBrow(u8 *buf, int y, int z, io::IReadFile* file, rgb // limit the count value to the remaining row size if (oPtr + count*rgb.Header.BPC > buf + rgb.Header.Xsize * rgb.Header.BPC) { - count = ( (buf + rgb.Header.Xsize * rgb.Header.BPC) - oPtr ) / rgb.Header.BPC; + count = (s32)( (buf + rgb.Header.Xsize * rgb.Header.BPC) - oPtr ) / rgb.Header.BPC; } if (count<=0) diff --git a/source/Irrlicht/CMY3DMeshFileLoader.h b/source/Irrlicht/CMY3DMeshFileLoader.h index 0c29802e..c0369d49 100644 --- a/source/Irrlicht/CMY3DMeshFileLoader.h +++ b/source/Irrlicht/CMY3DMeshFileLoader.h @@ -92,7 +92,9 @@ private: { SMyMaterialEntry () : Texture1FileName("null"), Texture2FileName("null"), - Texture1(0), Texture2(0), MaterialType(video::EMT_SOLID) {} + Texture1(0), Texture2(0), MaterialType(video::EMT_SOLID) { + Header.Name[0] = 0; + } SMyMaterialHeader Header; core::stringc Texture1FileName; diff --git a/source/Irrlicht/COBJMeshFileLoader.cpp b/source/Irrlicht/COBJMeshFileLoader.cpp index d4ce82ed..17dcec99 100644 --- a/source/Irrlicht/COBJMeshFileLoader.cpp +++ b/source/Irrlicht/COBJMeshFileLoader.cpp @@ -182,6 +182,8 @@ IAnimatedMesh* COBJMeshFileLoader::createMesh(io::IReadFile* file) smoothingGroup=0; else smoothingGroup=core::strtoul10(smooth); + + (void)smoothingGroup; // disable unused variable warnings } break; diff --git a/source/Irrlicht/COSOperator.cpp b/source/Irrlicht/COSOperator.cpp index 1bdbdc16..6cef827f 100644 --- a/source/Irrlicht/COSOperator.cpp +++ b/source/Irrlicht/COSOperator.cpp @@ -187,7 +187,8 @@ bool COSOperator::getProcessorSpeedMHz(u32* MHz) const if (file) { char buffer[1024]; - fread(buffer, 1, 1024, file); + size_t r = fread(buffer, 1, 1023, file); + buffer[r] = 0; buffer[1023]=0; core::stringc str(buffer); s32 pos = str.find("cpu MHz"); diff --git a/source/Irrlicht/CSoftware2MaterialRenderer.h b/source/Irrlicht/CSoftware2MaterialRenderer.h index 7a88bc2a..9715dc9d 100644 --- a/source/Irrlicht/CSoftware2MaterialRenderer.h +++ b/source/Irrlicht/CSoftware2MaterialRenderer.h @@ -26,6 +26,13 @@ public: { } + virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, + bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ + { + if (Driver) + Driver->setFallback_Material(material.MaterialType); + } + protected: video::CBurningVideoDriver* Driver; @@ -47,7 +54,6 @@ public: }; - //! Transparent material renderer class CSoftware2MaterialRenderer_TRANSPARENT_ADD_COLOR : public CSoftware2MaterialRenderer { @@ -75,40 +81,6 @@ public: }; -//! unsupported material renderer -class CBurningShader_REFERENCE : public CSoftware2MaterialRenderer -{ -public: - CBurningShader_REFERENCE ( video::CBurningVideoDriver* driver ) - : CSoftware2MaterialRenderer ( driver ) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - } - - virtual void OnUnsetMaterial() _IRR_OVERRIDE_ - { - } - - virtual bool isTransparent() const _IRR_OVERRIDE_ - { - return false; - } - - virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) _IRR_OVERRIDE_ - { - return true; - }; - - - virtual s32 getRenderCapability() const _IRR_OVERRIDE_ - { - return 1; - } - -}; - } // end namespace video diff --git a/source/Irrlicht/CSoftwareDriver2.cpp b/source/Irrlicht/CSoftwareDriver2.cpp index 8b514c9d..89f0f7b5 100644 --- a/source/Irrlicht/CSoftwareDriver2.cpp +++ b/source/Irrlicht/CSoftwareDriver2.cpp @@ -8,6 +8,7 @@ #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ #include "SoftwareDriver2_helper.h" +#include "CSoftwareTexture.h" #include "CSoftwareTexture2.h" #include "CSoftware2MaterialRenderer.h" #include "S3DVertex.h" @@ -15,7 +16,259 @@ #include "CBlit.h" -#define MAT_TEXTURE(tex) ( (video::CSoftwareTexture2*) Material.org.getTexture ( tex ) ) +// Matrix now here + +template +bool mat44_transposed_inverse(irr::core::CMatrix4& out, const irr::core::CMatrix4& M) +{ + const T* burning_restrict m = M.pointer(); + + double d = + (m[0] * m[5] - m[1] * m[4]) * (m[10] * m[15] - m[11] * m[14]) - + (m[0] * m[6] - m[2] * m[4]) * (m[9] * m[15] - m[11] * m[13]) + + (m[0] * m[7] - m[3] * m[4]) * (m[9] * m[14] - m[10] * m[13]) + + (m[1] * m[6] - m[2] * m[5]) * (m[8] * m[15] - m[11] * m[12]) - + (m[1] * m[7] - m[3] * m[5]) * (m[8] * m[14] - m[10] * m[12]) + + (m[2] * m[7] - m[3] * m[6]) * (m[8] * m[13] - m[9] * m[12]); + + if (fabs(d) < DBL_MIN) + { + out.makeIdentity(); + return false; + } + + d = 1.0 / d; + T* burning_restrict o = out.pointer(); + o[0] = (T)(d*(m[5] * (m[10] * m[15] - m[11] * m[14]) + m[6] * (m[11] * m[13] - m[9] * m[15]) + m[7] * (m[9] * m[14] - m[10] * m[13]))); + o[4] = (T)(d*(m[9] * (m[2] * m[15] - m[3] * m[14]) + m[10] * (m[3] * m[13] - m[1] * m[15]) + m[11] * (m[1] * m[14] - m[2] * m[13]))); + o[8] = (T)(d*(m[13] * (m[2] * m[7] - m[3] * m[6]) + m[14] * (m[3] * m[5] - m[1] * m[7]) + m[15] * (m[1] * m[6] - m[2] * m[5]))); + o[12] = (T)(d*(m[1] * (m[7] * m[10] - m[6] * m[11]) + m[2] * (m[5] * m[11] - m[7] * m[9]) + m[3] * (m[6] * m[9] - m[5] * m[10]))); + + o[1] = (T)(d*(m[6] * (m[8] * m[15] - m[11] * m[12]) + m[7] * (m[10] * m[12] - m[8] * m[14]) + m[4] * (m[11] * m[14] - m[10] * m[15]))); + o[5] = (T)(d*(m[10] * (m[0] * m[15] - m[3] * m[12]) + m[11] * (m[2] * m[12] - m[0] * m[14]) + m[8] * (m[3] * m[14] - m[2] * m[15]))); + o[9] = (T)(d*(m[14] * (m[0] * m[7] - m[3] * m[4]) + m[15] * (m[2] * m[4] - m[0] * m[6]) + m[12] * (m[3] * m[6] - m[2] * m[7]))); + o[13] = (T)(d*(m[2] * (m[7] * m[8] - m[4] * m[11]) + m[3] * (m[4] * m[10] - m[6] * m[8]) + m[0] * (m[6] * m[11] - m[7] * m[10]))); + + o[2] = (T)(d*(m[7] * (m[8] * m[13] - m[9] * m[12]) + m[4] * (m[9] * m[15] - m[11] * m[13]) + m[5] * (m[11] * m[12] - m[8] * m[15]))); + o[6] = (T)(d*(m[11] * (m[0] * m[13] - m[1] * m[12]) + m[8] * (m[1] * m[15] - m[3] * m[13]) + m[9] * (m[3] * m[12] - m[0] * m[15]))); + o[10] = (T)(d*(m[15] * (m[0] * m[5] - m[1] * m[4]) + m[12] * (m[1] * m[7] - m[3] * m[5]) + m[13] * (m[3] * m[4] - m[0] * m[7]))); + o[14] = (T)(d*(m[3] * (m[5] * m[8] - m[4] * m[9]) + m[0] * (m[7] * m[9] - m[5] * m[11]) + m[1] * (m[4] * m[11] - m[7] * m[8]))); + + o[3] = (T)(d*(m[4] * (m[10] * m[13] - m[9] * m[14]) + m[5] * (m[8] * m[14] - m[10] * m[12]) + m[6] * (m[9] * m[12] - m[8] * m[13]))); + o[7] = (T)(d*(m[8] * (m[2] * m[13] - m[1] * m[14]) + m[9] * (m[0] * m[14] - m[2] * m[12]) + m[10] * (m[1] * m[12] - m[0] * m[13]))); + o[11] = (T)(d*(m[12] * (m[2] * m[5] - m[1] * m[6]) + m[13] * (m[0] * m[6] - m[2] * m[4]) + m[14] * (m[1] * m[4] - m[0] * m[5]))); + o[15] = (T)(d*(m[0] * (m[5] * m[10] - m[6] * m[9]) + m[1] * (m[6] * m[8] - m[4] * m[10]) + m[2] * (m[4] * m[9] - m[5] * m[8]))); + + return true; +} + +#if 0 +// difference to CMatrix4::getInverse . higher precision in determinant. return identity on failure +template +bool mat44_inverse(CMatrix4& out, const CMatrix4& M) +{ + const T* m = M.pointer(); + + double d = + (m[0] * m[5] - m[1] * m[4]) * (m[10] * m[15] - m[11] * m[14]) - + (m[0] * m[6] - m[2] * m[4]) * (m[9] * m[15] - m[11] * m[13]) + + (m[0] * m[7] - m[3] * m[4]) * (m[9] * m[14] - m[10] * m[13]) + + (m[1] * m[6] - m[2] * m[5]) * (m[8] * m[15] - m[11] * m[12]) - + (m[1] * m[7] - m[3] * m[5]) * (m[8] * m[14] - m[10] * m[12]) + + (m[2] * m[7] - m[3] * m[6]) * (m[8] * m[13] - m[9] * m[12]); + + if (fabs(d) < DBL_MIN) + { + out.makeIdentity(); + return false; + } + + d = 1.0 / d; + T* o = out.pointer(); + o[0] = (T)(d*(m[5] * (m[10] * m[15] - m[11] * m[14]) + m[6] * (m[11] * m[13] - m[9] * m[15]) + m[7] * (m[9] * m[14] - m[10] * m[13]))); + o[1] = (T)(d*(m[9] * (m[2] * m[15] - m[3] * m[14]) + m[10] * (m[3] * m[13] - m[1] * m[15]) + m[11] * (m[1] * m[14] - m[2] * m[13]))); + o[2] = (T)(d*(m[13] * (m[2] * m[7] - m[3] * m[6]) + m[14] * (m[3] * m[5] - m[1] * m[7]) + m[15] * (m[1] * m[6] - m[2] * m[5]))); + o[3] = (T)(d*(m[1] * (m[7] * m[10] - m[6] * m[11]) + m[2] * (m[5] * m[11] - m[7] * m[9]) + m[3] * (m[6] * m[9] - m[5] * m[10]))); + + o[4] = (T)(d*(m[6] * (m[8] * m[15] - m[11] * m[12]) + m[7] * (m[10] * m[12] - m[8] * m[14]) + m[4] * (m[11] * m[14] - m[10] * m[15]))); + o[5] = (T)(d*(m[10] * (m[0] * m[15] - m[3] * m[12]) + m[11] * (m[2] * m[12] - m[0] * m[14]) + m[8] * (m[3] * m[14] - m[2] * m[15]))); + o[6] = (T)(d*(m[14] * (m[0] * m[7] - m[3] * m[4]) + m[15] * (m[2] * m[4] - m[0] * m[6]) + m[12] * (m[3] * m[6] - m[2] * m[7]))); + o[7] = (T)(d*(m[2] * (m[7] * m[8] - m[4] * m[11]) + m[3] * (m[4] * m[10] - m[6] * m[8]) + m[0] * (m[6] * m[11] - m[7] * m[10]))); + + o[8] = (T)(d*(m[7] * (m[8] * m[13] - m[9] * m[12]) + m[4] * (m[9] * m[15] - m[11] * m[13]) + m[5] * (m[11] * m[12] - m[8] * m[15]))); + o[9] = (T)(d*(m[11] * (m[0] * m[13] - m[1] * m[12]) + m[8] * (m[1] * m[15] - m[3] * m[13]) + m[9] * (m[3] * m[12] - m[0] * m[15]))); + o[10] = (T)(d*(m[15] * (m[0] * m[5] - m[1] * m[4]) + m[12] * (m[1] * m[7] - m[3] * m[5]) + m[13] * (m[3] * m[4] - m[0] * m[7]))); + o[11] = (T)(d*(m[3] * (m[5] * m[8] - m[4] * m[9]) + m[0] * (m[7] * m[9] - m[5] * m[11]) + m[1] * (m[4] * m[11] - m[7] * m[8]))); + + o[12] = (T)(d*(m[4] * (m[10] * m[13] - m[9] * m[14]) + m[5] * (m[8] * m[14] - m[10] * m[12]) + m[6] * (m[9] * m[12] - m[8] * m[13]))); + o[13] = (T)(d*(m[8] * (m[2] * m[13] - m[1] * m[14]) + m[9] * (m[0] * m[14] - m[2] * m[12]) + m[10] * (m[1] * m[12] - m[0] * m[13]))); + o[14] = (T)(d*(m[12] * (m[2] * m[5] - m[1] * m[6]) + m[13] * (m[0] * m[6] - m[2] * m[4]) + m[14] * (m[1] * m[4] - m[0] * m[5]))); + o[15] = (T)(d*(m[0] * (m[5] * m[10] - m[6] * m[9]) + m[1] * (m[6] * m[8] - m[4] * m[10]) + m[2] * (m[4] * m[9] - m[5] * m[8]))); + + return true; +} +#endif + +// void CMatrix4::transformVec4(T *out, const T * in) const +template +inline void transformVec4Vec4(const irr::core::CMatrix4& m, T* burning_restrict out, const T* burning_restrict in) +{ + const T* burning_restrict M = m.pointer(); + + out[0] = in[0] * M[0] + in[1] * M[4] + in[2] * M[8] + in[3] * M[12]; + out[1] = in[0] * M[1] + in[1] * M[5] + in[2] * M[9] + in[3] * M[13]; + out[2] = in[0] * M[2] + in[1] * M[6] + in[2] * M[10] + in[3] * M[14]; + out[3] = in[0] * M[3] + in[1] * M[7] + in[2] * M[11] + in[3] * M[15]; +} + +#if 0 +// void CMatrix4::transformVect(T *out, const core::vector3df &in) const +template +inline void transformVec3Vec4(const irr::core::CMatrix4& m,T* burning_restrict out, const core::vector3df &in) +{ + const T* burning_restrict M = m.pointer(); + out[0] = in.X*M[0] + in.Y*M[4] + in.Z*M[8] + M[12]; + out[1] = in.X*M[1] + in.Y*M[5] + in.Z*M[9] + M[13]; + out[2] = in.X*M[2] + in.Y*M[6] + in.Z*M[10] + M[14]; + out[3] = in.X*M[3] + in.Y*M[7] + in.Z*M[11] + M[15]; +} +#endif + +template +inline void rotateVec3Vec4(const irr::core::CMatrix4& m, T* burning_restrict out, const T* burning_restrict in) +{ + const T* burning_restrict M = m.pointer(); + + out[0] = in[0] * M[0] + in[1] * M[4] + in[2] * M[8]; + out[1] = in[0] * M[1] + in[1] * M[5] + in[2] * M[9]; + out[2] = in[0] * M[2] + in[1] * M[6] + in[2] * M[10]; + out[3] = 0.f; +} + +//based on https://github.com/ekmett/approximate/blob/master/cbits/fast.c powf_fast_precise +static inline float powf_limit(const float a, const float b) +{ + if (a <= 0.0000001f) return 0.f; + else if (a >= 1.f) return 1.f; + + /* calculate approximation with fraction of the exponent */ + int e = (int)b; + union { float f; int x; } u = { a }; + u.x = (int)((b - e) * (u.x - 1065353216) + 1065353216); + + float r = 1.0f; + float ua = a; + while (e) { + if (e & 1) { + r *= ua; + } + if (ua < 0.00000001f) + break; + ua *= ua; + e >>= 1; + } + + r *= u.f; + return r; +} + + +#if defined(Tweak_Burning) + +// run time parameter +struct tweakBurning +{ + tweakBurning() + { + current = 11; + step = 0.0001f; + + ndc_shrink_x = -0.75f; + ndc_scale_x = 0.5f; + ndc_trans_x = -0.5f; + + ndc_shrink_y = -0.75f; + ndc_scale_y = -0.5f; + ndc_trans_y = -0.5f; + + tex_w_add = 0.f; + tex_h_add = 0.f; + tex_cx_add = 0.f; + tex_cy_add = 0.f; + + AreaMinDrawSize = 0.001f; + } + int current; + + union + { + struct { + f32 step; + + f32 ndc_shrink_x; + f32 ndc_scale_x; + f32 ndc_trans_x; + + f32 ndc_shrink_y; + f32 ndc_scale_y; + f32 ndc_trans_y; + + f32 tex_w_add; + f32 tex_cx_add; + f32 tex_h_add; + f32 tex_cy_add; + + f32 AreaMinDrawSize; //! minimal visible covered area for primitive + }; + f32 val[16]; + }; + static const char* const name[16]; + void postEventFromUser(const SEvent& e); +}; + +const char* const tweakBurning::name[] = { "step", + "ndc_shrink_x","ndc_scale_x","ndc_trans_x", + "ndc_shrink_y","ndc_scale_y","ndc_trans_y", + "tex_w_add","tex_cx_add","tex_h_add","tex_cy_add", + "dc_area",0 }; + +void tweakBurning::postEventFromUser(const SEvent& e) +{ + int show = 0; + if (e.EventType == EET_KEY_INPUT_EVENT) + { + switch (e.KeyInput.Key) + { + case KEY_KEY_1: step *= 0.9f; if (step < 0.00001f) step = 0.0001f; show = 2; break; + case KEY_KEY_2: step *= 1.1f; show = 2; break; + + case KEY_KEY_3: if (!e.KeyInput.PressedDown) { current -= 1; if (current < 1) current = 11; show = 1; } break; + case KEY_KEY_4: if (!e.KeyInput.PressedDown) { current += 1; if (current > 11) current = 1; show = 1; } break; + + case KEY_KEY_5: val[current] -= e.KeyInput.Shift ? step * 100.f : step; show = 1; break; + case KEY_KEY_6: val[current] += e.KeyInput.Shift ? step * 100.f : step; show = 1; break; + default: + break; + } + } + if (show) + { + if (step < 0.0001f) step = 0.0001f; + char buf[256]; + if (show == 2) sprintf(buf, "%s %f\n", name[0], val[0]); + else sprintf(buf, "%s %f\n", name[current], val[current]); + os::Printer::print(buf); + } +} + +void CBurningVideoDriver::postEventFromUser(const void* sevent) +{ + if (sevent) Tweak.postEventFromUser(*(const SEvent*)sevent); +} + +tweakBurning Tweak; +#endif //defined(Tweak_Burning) + namespace irr @@ -28,13 +281,17 @@ CBurningVideoDriver::CBurningVideoDriver(const irr::SIrrlichtCreationParameters& : CNullDriver(io, params.WindowSize), BackBuffer(0), Presenter(presenter), WindowId(0), SceneSourceRect(0), RenderTargetTexture(0), RenderTargetSurface(0), CurrentShader(0), - DepthBuffer(0), StencilBuffer ( 0 ), - CurrentOut ( 16 * 2, 256 ), Temp ( 16 * 2, 256 ) + DepthBuffer(0), StencilBuffer ( 0 ) { + //enable fpu exception + //unsigned int fp_control_state = _controlfp(_EM_INEXACT, _MCW_EM); + #ifdef _DEBUG setDebugName("CBurningVideoDriver"); #endif + VertexCache_map_source_format(); + // create backbuffer BackBuffer = new CImage(BURNINGSHADER_COLOR_FORMAT, params.WindowSize); if (BackBuffer) @@ -47,24 +304,25 @@ CBurningVideoDriver::CBurningVideoDriver(const irr::SIrrlichtCreationParameters& // create stencil buffer if ( params.Stencilbuffer ) - StencilBuffer = video::createStencilBuffer(BackBuffer->getDimension()); + StencilBuffer = video::createStencilBuffer(BackBuffer->getDimension(),8); } - DriverAttributes->setAttribute("MaxTextures", 2); DriverAttributes->setAttribute("MaxIndices", 1<<16); - DriverAttributes->setAttribute("MaxTextureSize", SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE); + DriverAttributes->setAttribute("MaxTextures", BURNING_MATERIAL_MAX_TEXTURES); + DriverAttributes->setAttribute("MaxTextureSize", SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE ? SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE : 1<<20); DriverAttributes->setAttribute("MaxLights", 1024 ); //glsl::gl_MaxLights); DriverAttributes->setAttribute("MaxTextureLODBias", 16.f); - DriverAttributes->setAttribute("Version", 49); + DriverAttributes->setAttribute("Version", 50); // create triangle renderers - irr::memset32 ( BurningShader, 0, sizeof ( BurningShader ) ); + memset( BurningShader, 0, sizeof ( BurningShader ) ); //BurningShader[ETR_FLAT] = createTRFlat2(DepthBuffer); //BurningShader[ETR_FLAT_WIRE] = createTRFlatWire2(DepthBuffer); BurningShader[ETR_GOURAUD] = createTriangleRendererGouraud2(this); - BurningShader[ETR_GOURAUD_ALPHA] = createTriangleRendererGouraudAlpha2(this ); - BurningShader[ETR_GOURAUD_ALPHA_NOZ] = createTRGouraudAlphaNoZ2(this ); + BurningShader[ETR_GOURAUD_NOZ] = createTriangleRendererGouraudNoZ2(this); + //BurningShader[ETR_GOURAUD_ALPHA] = createTriangleRendererGouraudAlpha2(this ); + BurningShader[ETR_GOURAUD_ALPHA_NOZ] = createTRGouraudAlphaNoZ2(this ); // 2D //BurningShader[ETR_GOURAUD_WIRE] = createTriangleRendererGouraudWire2(DepthBuffer); //BurningShader[ETR_TEXTURE_FLAT] = createTriangleRendererTextureFlat2(DepthBuffer); //BurningShader[ETR_TEXTURE_FLAT_WIRE] = createTriangleRendererTextureFlatWire2(DepthBuffer); @@ -89,13 +347,15 @@ CBurningVideoDriver::CBurningVideoDriver(const irr::SIrrlichtCreationParameters& BurningShader[ETR_STENCIL_SHADOW] = createTRStencilShadow ( this ); BurningShader[ETR_TEXTURE_BLEND] = createTRTextureBlend( this ); - BurningShader[ETR_REFERENCE] = createTriangleRendererReference ( this ); + BurningShader[ETR_TRANSPARENT_REFLECTION_2_LAYER] = createTriangleRendererTexture_transparent_reflection_2_layer(this); + //BurningShader[ETR_REFERENCE] = createTriangleRendererReference ( this ); + BurningShader[ETR_COLOR] = create_burning_shader_color(this); // add the same renderer for all solid types CSoftware2MaterialRenderer_SOLID* smr = new CSoftware2MaterialRenderer_SOLID( this); CSoftware2MaterialRenderer_TRANSPARENT_ADD_COLOR* tmr = new CSoftware2MaterialRenderer_TRANSPARENT_ADD_COLOR( this); - CSoftware2MaterialRenderer_UNSUPPORTED * umr = new CSoftware2MaterialRenderer_UNSUPPORTED ( this ); + //CSoftware2MaterialRenderer_UNSUPPORTED * umr = new CSoftware2MaterialRenderer_UNSUPPORTED ( this ); //!TODO: addMaterialRenderer depends on pushing order.... addMaterialRenderer ( smr ); // EMT_SOLID @@ -108,7 +368,7 @@ CBurningVideoDriver::CBurningVideoDriver(const irr::SIrrlichtCreationParameters& addMaterialRenderer ( smr ); // EMT_LIGHTMAP_LIGHTING_M2, addMaterialRenderer ( smr ); // EMT_LIGHTMAP_LIGHTING_M4, addMaterialRenderer ( smr ); // EMT_DETAIL_MAP, - addMaterialRenderer ( umr ); // EMT_SPHERE_MAP, + addMaterialRenderer ( smr ); // EMT_SPHERE_MAP, addMaterialRenderer ( smr ); // EMT_REFLECTION_2_LAYER, addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ADD_COLOR, addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ALPHA_CHANNEL, @@ -116,7 +376,7 @@ CBurningVideoDriver::CBurningVideoDriver(const irr::SIrrlichtCreationParameters& addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_VERTEX_ALPHA, addMaterialRenderer ( smr ); // EMT_TRANSPARENT_REFLECTION_2_LAYER, addMaterialRenderer ( smr ); // EMT_NORMAL_MAP_SOLID, - addMaterialRenderer ( umr ); // EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR, + addMaterialRenderer ( tmr ); // EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR, addMaterialRenderer ( tmr ); // EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA, addMaterialRenderer ( smr ); // EMT_PARALLAX_MAP_SOLID, addMaterialRenderer ( tmr ); // EMT_PARALLAX_MAP_TRANSPARENT_ADD_COLOR, @@ -125,16 +385,17 @@ CBurningVideoDriver::CBurningVideoDriver(const irr::SIrrlichtCreationParameters& smr->drop (); tmr->drop (); - umr->drop (); + //umr->drop (); // select render target setRenderTargetImage(BackBuffer); //reset Lightspace - LightSpace.reset (); + EyeSpace.reset(); + EyeSpace.resetFog(); // select the right renderer - setCurrentShader(); + setMaterial(Material.org); } @@ -143,161 +404,45 @@ CBurningVideoDriver::~CBurningVideoDriver() { // delete Backbuffer if (BackBuffer) + { BackBuffer->drop(); + BackBuffer = 0; + } // delete triangle renderers - for (s32 i=0; idrop(); + BurningShader[i] = 0; + } } // delete Additional buffer if (StencilBuffer) + { StencilBuffer->drop(); + StencilBuffer = 0; + } if (DepthBuffer) + { DepthBuffer->drop(); + DepthBuffer = 0; + } if (RenderTargetTexture) + { RenderTargetTexture->drop(); + RenderTargetTexture = 0; + } if (RenderTargetSurface) + { RenderTargetSurface->drop(); -} - - -/*! - selects the right triangle renderer based on the render states. -*/ -void CBurningVideoDriver::setCurrentShader() -{ - ITexture *texture0 = Material.org.getTexture(0); - ITexture *texture1 = Material.org.getTexture(1); - - bool zMaterialTest = Material.org.ZBuffer != ECFN_DISABLED && - Material.org.ZWriteEnable != video::EZW_OFF && - ( AllowZWriteOnTransparent || !Material.org.isTransparent() ); - - 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: - shader = ETR_TEXTURE_BLEND; - break; - - case EMT_TRANSPARENT_ALPHA_CHANNEL_REF: - Material.org.MaterialTypeParam = 0.5f; - // fall through - case EMT_TRANSPARENT_ALPHA_CHANNEL: - if ( texture0 && texture0->hasAlpha () ) - { - shader = zMaterialTest ? ETR_TEXTURE_GOURAUD_ALPHA : ETR_TEXTURE_GOURAUD_ALPHA_NOZ; - break; - } - else - { - shader = ETR_TEXTURE_GOURAUD_VERTEX_ALPHA; - } - break; - - case EMT_TRANSPARENT_ADD_COLOR: - shader = zMaterialTest ? ETR_TEXTURE_GOURAUD_ADD : ETR_TEXTURE_GOURAUD_ADD_NO_Z; - break; - - case EMT_TRANSPARENT_VERTEX_ALPHA: - shader = ETR_TEXTURE_GOURAUD_VERTEX_ALPHA; - break; - - case EMT_LIGHTMAP: - case EMT_LIGHTMAP_LIGHTING: - shader = ETR_TEXTURE_GOURAUD_LIGHTMAP_M1; - break; - - case EMT_LIGHTMAP_M2: - case EMT_LIGHTMAP_LIGHTING_M2: - shader = ETR_TEXTURE_GOURAUD_LIGHTMAP_M2; - break; - - case EMT_LIGHTMAP_LIGHTING_M4: - if ( texture1 ) - shader = ETR_TEXTURE_GOURAUD_LIGHTMAP_M4; - break; - case EMT_LIGHTMAP_M4: - if ( texture1 ) - shader = ETR_TEXTURE_LIGHTMAP_M4; - break; - - case EMT_LIGHTMAP_ADD: - if ( texture1 ) - shader = ETR_TEXTURE_GOURAUD_LIGHTMAP_ADD; - break; - - case EMT_DETAIL_MAP: - if ( texture1 ) - 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_TEXTURE_GOURAUD_LIGHTMAP_M1; - TransformationFlag[ ETS_TEXTURE_1] |= ETF_TEXGEN_CAMERA_REFLECTION; - LightSpace.Flags |= VERTEXTRANSFORM; - break; - - case EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA: - case EMT_NORMAL_MAP_SOLID: - case EMT_PARALLAX_MAP_SOLID: - case EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA: - shader = ETR_NORMAL_MAP_SOLID; - LightSpace.Flags |= VERTEXTRANSFORM; - break; - - default: - break; - + RenderTargetSurface = 0; } - - if ( !texture0 ) - { - shader = ETR_GOURAUD; - } - - if ( Material.org.Wireframe ) - { - shader = ETR_TEXTURE_GOURAUD_WIRE; - } - - //shader = ETR_REFERENCE; - - // switchToTriangleRenderer - CurrentShader = BurningShader[shader]; - if ( CurrentShader ) - { - CurrentShader->setZCompareFunc ( Material.org.ZBuffer ); - CurrentShader->setRenderTarget(RenderTargetSurface, ViewPort); - CurrentShader->setMaterial ( Material ); - - switch ( shader ) - { - case ETR_TEXTURE_GOURAUD_ALPHA: - case ETR_TEXTURE_GOURAUD_ALPHA_NOZ: - case ETR_TEXTURE_BLEND: - CurrentShader->setParam ( 0, Material.org.MaterialTypeParam ); - break; - default: - break; - } - } - } @@ -305,31 +450,63 @@ void CBurningVideoDriver::setCurrentShader() //! queries the features of the driver, returns true if feature is available bool CBurningVideoDriver::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const { - if (!FeatureEnabled[feature]) - return false; - + int on = 0; switch (feature) { #ifdef SOFTWARE_DRIVER_2_BILINEAR case EVDF_BILINEAR_FILTER: - return true; + on = 1; + break; #endif #ifdef SOFTWARE_DRIVER_2_MIPMAPPING case EVDF_MIP_MAP: - return true; + on = 1; + break; #endif case EVDF_STENCIL_BUFFER: - return StencilBuffer != 0; + on = StencilBuffer != 0; + break; case EVDF_RENDER_TO_TARGET: case EVDF_MULTITEXTURE: case EVDF_HARDWARE_TL: case EVDF_TEXTURE_NSQUARE: - return true; + case EVDF_TEXTURE_MATRIX: + on = 1; + break; + case EVDF_DEPTH_CLAMP: // shadow + on = 1; + break; + + case EVDF_TEXTURE_NPOT: // for 2D + on = 0; + break; + + case EVDF_ARB_FRAGMENT_PROGRAM_1: + case EVDF_ARB_VERTEX_PROGRAM_1: + on = 1; + break; +#if defined(PATCH_SUPERTUX_8_0_1) + case EVDF_TEXTURE_NPOT: + case EVDF_ARB_GLSL: + on = 1; + break; +#endif + +#if defined(SOFTWARE_DRIVER_2_2D_AS_3D) +#if defined(IRRLICHT_FREE_CANVAS) + case EVDF_VIEWPORT_SCALE_GUI: + on = 1; + break; +#endif +#endif default: - return false; + on = 0; + break; } + + return on && FeatureEnabled[feature]; } @@ -344,52 +521,161 @@ IRenderTarget* CBurningVideoDriver::addRenderTarget() } +//matrix multiplication +void CBurningVideoDriver::transform_calc(E_TRANSFORMATION_STATE_BURNING_VIDEO state) +{ + size_t* flag = TransformationFlag[TransformationStack]; + if (flag[state] & ETF_VALID ) return; + + //check + int ok = 0; + switch ( state ) + { + case ETS_PROJ_MODEL_VIEW: + if ( 0 == (flag[ETS_VIEW_PROJECTION] & ETF_VALID) ) transform_calc (ETS_VIEW_PROJECTION); + ok = flag[ETS_WORLD] & flag[ETS_VIEW] & flag[ETS_PROJECTION] & flag[ETS_VIEW_PROJECTION] & ETF_VALID; + break; + case ETS_VIEW_PROJECTION: + ok = flag[ETS_VIEW] & flag[ETS_PROJECTION] & ETF_VALID; + break; + case ETS_MODEL_VIEW: + ok = flag[ETS_WORLD] & flag[ETS_VIEW] & ETF_VALID; + break; + case ETS_NORMAL: + ok = flag[ETS_MODEL_VIEW] & ETF_VALID; + break; + default: + break; + } + + if ( !ok ) + { + char buf[256]; + sprintf(buf,"transform_calc not valid for %d\n",state); + os::Printer::log(buf, ELL_WARNING); + } + + core::matrix4* matrix = Transformation[TransformationStack]; + + switch ( state ) + { + case ETS_PROJ_MODEL_VIEW: + if (flag[ETS_WORLD] & ETF_IDENTITY ) + { + matrix[state] = matrix[ETS_VIEW_PROJECTION]; + } + else + { + matrix[state].setbyproduct_nocheck(matrix[ETS_VIEW_PROJECTION], matrix[ETS_WORLD]); + } + break; + + case ETS_VIEW_PROJECTION: + matrix[state].setbyproduct_nocheck (matrix[ETS_PROJECTION], matrix[ETS_VIEW]); + break; + case ETS_MODEL_VIEW: + if ( flag[ETS_WORLD] & ETF_IDENTITY ) + { + matrix[state] = matrix[ETS_VIEW]; + } + else + { + matrix[state].setbyproduct_nocheck(matrix[ETS_VIEW], matrix[ETS_WORLD]); + } + break; + case ETS_NORMAL: + mat44_transposed_inverse(matrix[state], matrix[ETS_MODEL_VIEW]); + break; + + default: + break; + } + flag[state] |= ETF_VALID; +} + //! sets transformation void CBurningVideoDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matrix4& mat) { - Transformation[state] = mat; - core::setbit_cond ( TransformationFlag[state], mat.isIdentity(), ETF_IDENTITY ); + size_t* flag = TransformationFlag[TransformationStack]; + core::matrix4* matrix = Transformation[TransformationStack]; +#if 0 + int changed = 1; + if (flag[state] & ETF_VALID) + { + changed = memcmp(mat.pointer(), matrix[state].pointer(), sizeof(mat)); + } + if (changed) +#endif + { + matrix[state] = mat; + flag[state] |= ETF_VALID; + } + + //maybe identity (mostly for texturematrix to avoid costly multiplication) +#if defined ( USE_MATRIX_TEST ) + burning_setbit( TransformationFlag[state], mat.getDefinitelyIdentityMatrix(), ETF_IDENTITY ); +#else + burning_setbit(flag[state], + !memcmp(mat.pointer(), core::IdentityMatrix.pointer(),sizeof(mat)),ETF_IDENTITY + ); +#endif + +#if 0 + if ( changed ) +#endif switch ( state ) { - case ETS_VIEW: - Transformation[ETS_VIEW_PROJECTION].setbyproduct_nocheck ( - Transformation[ETS_PROJECTION], - Transformation[ETS_VIEW] - ); - getCameraPosWorldSpace (); + case ETS_PROJECTION: + flag[ETS_PROJ_MODEL_VIEW] &= ~ETF_VALID; + flag[ETS_VIEW_PROJECTION] &= ~ETF_VALID; + break; + case ETS_VIEW: + flag[ETS_PROJ_MODEL_VIEW] &= ~ETF_VALID; + flag[ETS_VIEW_PROJECTION] &= ~ETF_VALID; + flag[ETS_MODEL_VIEW] &= ~ETF_VALID; + flag[ETS_NORMAL] &= ~ETF_VALID; break; - case ETS_WORLD: - if ( TransformationFlag[state] & ETF_IDENTITY ) - { - Transformation[ETS_WORLD_INVERSE] = Transformation[ETS_WORLD]; - TransformationFlag[ETS_WORLD_INVERSE] |= ETF_IDENTITY; - Transformation[ETS_CURRENT] = Transformation[ETS_VIEW_PROJECTION]; - } - else - { - //Transformation[ETS_WORLD].getInversePrimitive ( Transformation[ETS_WORLD_INVERSE] ); - Transformation[ETS_CURRENT].setbyproduct_nocheck ( - Transformation[ETS_VIEW_PROJECTION], - Transformation[ETS_WORLD] - ); - } - TransformationFlag[ETS_CURRENT] = 0; - //getLightPosObjectSpace (); + flag[ETS_PROJ_MODEL_VIEW] &= ~ETF_VALID; + flag[ETS_MODEL_VIEW] &= ~ETF_VALID; + flag[ETS_NORMAL] &= ~ETF_VALID; 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; +#if _IRR_MATERIAL_MAX_TEXTURES_>4 + case ETS_TEXTURE_4: +#endif +#if _IRR_MATERIAL_MAX_TEXTURES_>5 + case ETS_TEXTURE_5: +#endif +#if _IRR_MATERIAL_MAX_TEXTURES_>6 + case ETS_TEXTURE_6: +#endif +#if _IRR_MATERIAL_MAX_TEXTURES_>7 + case ETS_TEXTURE_7: +#endif + if ( 0 == (flag[state] & ETF_IDENTITY ) ) + { + EyeSpace.TL_Flag |= TL_TEXTURE_TRANSFORM; + } + break; default: break; } + } +//! Returns the transformation set by setTransform +const core::matrix4& CBurningVideoDriver::getTransform(E_TRANSFORMATION_STATE state) const +{ + return Transformation[TransformationStack][state]; +} + + bool CBurningVideoDriver::beginScene(u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil, const SExposedVideoData& videoData, core::rect* sourceRect) { CNullDriver::beginScene(clearFlag, clearColor, clearDepth, clearStencil, videoData, sourceRect); @@ -398,7 +684,7 @@ bool CBurningVideoDriver::beginScene(u16 clearFlag, SColor clearColor, f32 clear clearBuffers(clearFlag, clearColor, clearDepth, clearStencil); - memset ( TransformationFlag, 0, sizeof ( TransformationFlag ) ); + //memset ( TransformationFlag, 0, sizeof ( TransformationFlag ) ); return true; } @@ -438,13 +724,13 @@ bool CBurningVideoDriver::setRenderTargetEx(IRenderTarget* target, u16 clearFlag return true; } - //! sets a render target void CBurningVideoDriver::setRenderTargetImage(video::CImage* image) { if (RenderTargetSurface) RenderTargetSurface->drop(); + core::dimension2d current = RenderTargetSize; RenderTargetSurface = image; RenderTargetSize.Width = 0; RenderTargetSize.Height = 0; @@ -455,7 +741,11 @@ void CBurningVideoDriver::setRenderTargetImage(video::CImage* image) RenderTargetSize = RenderTargetSurface->getDimension(); } - setViewPort(core::rect(0,0,RenderTargetSize.Width,RenderTargetSize.Height)); + int not_changed = current == RenderTargetSize; + burning_setbit(TransformationFlag[0][ETS_PROJECTION], not_changed, ETF_VALID); + burning_setbit(TransformationFlag[1][ETS_PROJECTION], not_changed, ETF_VALID); + + setViewPort(core::recti(RenderTargetSize)); if (DepthBuffer) DepthBuffer->setSize(RenderTargetSize); @@ -465,6 +755,67 @@ void CBurningVideoDriver::setRenderTargetImage(video::CImage* image) } +//--------- Transform from NDC to DC, transform TexCoo ---------------------------------------------- + +// controls subtexel and fill convention +#if defined(SOFTWARE_DRIVER_2_SUBTEXEL) +#define SOFTWARE_DRIVER_2_PIXEL_CENTER -0.5f +#else +#define SOFTWARE_DRIVER_2_PIXEL_CENTER -0.5f +#endif + +#if 1 + +// used to scale <-1,-1><1,1> to viewport +void buildNDCToDCMatrix(f32* m, const core::rect& viewport, f32 tx) +{ + m[0] = (viewport.getWidth() + tx) * 0.5f; + m[1] = SOFTWARE_DRIVER_2_PIXEL_CENTER + ((viewport.UpperLeftCorner.X + viewport.LowerRightCorner.X) * 0.5f); + + m[2] = (viewport.getHeight() + tx) * -0.5f; + m[3] = SOFTWARE_DRIVER_2_PIXEL_CENTER + ((viewport.UpperLeftCorner.Y + viewport.LowerRightCorner.Y) * 0.5f); +} + + +#else +// used to scale <-1,-1><1,1> to viewport +void buildNDCToDCMatrix( core::matrix4& out, const core::rect& viewport) +{ + //guard band to stay in screen bounds.(empirical). get holes left side otherwise or out of screen + //TODO: match openGL or D3D. + //assumption pixel center, top-left rule and rounding error projection deny exact match without additional clipping + //or triangle render scanline doesn't step on correct texel center + //or sampler is not on texel center + + f32* m = out.pointer(); +#if defined(Tweak_Burning) && 0 + m[0] = (viewport.getWidth() + Tweak.ndc_shrink_x ) * Tweak.ndc_scale_x; + m[5] = (viewport.getHeight() + Tweak.ndc_shrink_y ) * Tweak.ndc_scale_y; + m[12] = Tweak.ndc_trans_x + ( (viewport.UpperLeftCorner.X + viewport.LowerRightCorner.X ) * 0.5f ); + m[13] = Tweak.ndc_trans_y + ( (viewport.UpperLeftCorner.Y + viewport.LowerRightCorner.Y ) * 0.5f ); +#endif + + m[0] = (viewport.getWidth() - 0.75f ) * 0.5f; + m[1] = 0.f; + m[2] = 0.f; + m[3] = 0.f; + m[4] = 0.f; + m[5] = (viewport.getHeight() - 0.75f ) * -0.5f; + m[6] = 0.f; + m[7] = 0.f; + m[8] = 0.f; + m[9] = 0.f; + m[10] = 1.f; + m[11] = 0.f; + m[12] = SOFTWARE_DRIVER_2_PIXEL_CENTER + ( (viewport.UpperLeftCorner.X + viewport.LowerRightCorner.X ) * 0.5f ); + m[13] = SOFTWARE_DRIVER_2_PIXEL_CENTER + ( (viewport.UpperLeftCorner.Y + viewport.LowerRightCorner.Y ) * 0.5f ); + m[14] = 0.f; + m[15] = 1.f; +} +#endif + + +//--------- Transform from NCD to DC ---------------------------------------------- //! sets a viewport void CBurningVideoDriver::setViewPort(const core::rect& area) @@ -474,19 +825,40 @@ void CBurningVideoDriver::setViewPort(const core::rect& area) core::rect rendert(0,0,RenderTargetSize.Width,RenderTargetSize.Height); ViewPort.clipAgainst(rendert); - Transformation [ ETS_CLIPSCALE ].buildNDCToDCMatrix ( ViewPort, 1 ); + buildNDCToDCMatrix(Transformation_ETS_CLIPSCALE[0], ViewPort,-0.375f); + buildNDCToDCMatrix(Transformation_ETS_CLIPSCALE[1], ViewPort, 0.f); // OverrideMaterial2DEnabled ? -0.375f : 0.f); if (CurrentShader) CurrentShader->setRenderTarget(RenderTargetSurface, ViewPort); } +void CBurningVideoDriver::setScissor(int x, int y, int width, int height) +{ + AbsRectangle v0; + v0.x0 = x; + v0.y0 = y; + v0.x1 = x+width; + v0.y1 = y+width; + + const core::dimension2d& rt = getCurrentRenderTargetSize(); + AbsRectangle v1; + v1.x0 = 0; + v1.y0 = 0; + v1.x1 = rt.Width; + v1.y1 = rt.Height; + + intersect(Scissor, v0, v1); +} + /* generic plane clipping in homogenous coordinates special case ndc frustum <-w,w>,<-w,w>,<-w,w> can be rewritten with compares e.q near plane, a.z < -a.w and b.z < -b.w + + cam is (0,0,-1) */ -const sVec4 CBurningVideoDriver::NDCPlane[6] = +const sVec4 CBurningVideoDriver::NDCPlane[6+2] = { sVec4( 0.f, 0.f, -1.f, -1.f ), // near sVec4( 0.f, 0.f, 1.f, -1.f ), // far @@ -497,7 +869,6 @@ const sVec4 CBurningVideoDriver::NDCPlane[6] = }; - /* test a vertex if it's inside the standard frustum @@ -507,24 +878,24 @@ const sVec4 CBurningVideoDriver::NDCPlane[6] = for ( u32 i = 0; i!= 6; ++i ) { dotPlane = v->Pos.dotProduct ( NDCPlane[i] ); - core::setbit_cond( flag, dotPlane <= 0.f, 1 << i ); + burning_setbit32( flag, dotPlane <= 0.f, 1 << i ); } // this is the base for ndc frustum <-w,w>,<-w,w>,<-w,w> - core::setbit_cond( flag, ( v->Pos.z - v->Pos.w ) <= 0.f, 1 ); - core::setbit_cond( flag, (-v->Pos.z - v->Pos.w ) <= 0.f, 2 ); - core::setbit_cond( flag, ( v->Pos.x - v->Pos.w ) <= 0.f, 4 ); - core::setbit_cond( flag, (-v->Pos.x - v->Pos.w ) <= 0.f, 8 ); - core::setbit_cond( flag, ( v->Pos.y - v->Pos.w ) <= 0.f, 16 ); - core::setbit_cond( flag, (-v->Pos.y - v->Pos.w ) <= 0.f, 32 ); + burning_setbit32( flag, ( v->Pos.z - v->Pos.w ) <= 0.f, 1 ); + burning_setbit32( flag, (-v->Pos.z - v->Pos.w ) <= 0.f, 2 ); + burning_setbit32( flag, ( v->Pos.x - v->Pos.w ) <= 0.f, 4 ); + burning_setbit32( flag, (-v->Pos.x - v->Pos.w ) <= 0.f, 8 ); + burning_setbit32( flag, ( v->Pos.y - v->Pos.w ) <= 0.f, 16 ); + burning_setbit32( flag, (-v->Pos.y - v->Pos.w ) <= 0.f, 32 ); */ #ifdef IRRLICHT_FAST_MATH -REALINLINE u32 CBurningVideoDriver::clipToFrustumTest ( const s4DVertex * v ) const +REALINLINE size_t CBurningVideoDriver::clipToFrustumTest ( const s4DVertex* v ) const { - f32 test[6]; - u32 flag; + register size_t flag; + f32 test[8]; const f32 w = - v->Pos.w; // a conditional move is needed....FCOMI ( but we don't have it ) @@ -538,13 +909,22 @@ REALINLINE u32 CBurningVideoDriver::clipToFrustumTest ( const s4DVertex * v ) c test[4] = v->Pos.y + w; test[5] = -v->Pos.y + w; + const u32* a = F32_AS_U32_POINTER(test); + flag = (a[0] ) >> 31; + flag |= (a[1] & 0x80000000) >> 30; + flag |= (a[2] & 0x80000000) >> 29; + flag |= (a[3] & 0x80000000) >> 28; + flag |= (a[4] & 0x80000000) >> 27; + flag |= (a[5] & 0x80000000) >> 26; + +/* flag = (IR ( test[0] ) ) >> 31; flag |= (IR ( test[1] ) & 0x80000000 ) >> 30; flag |= (IR ( test[2] ) & 0x80000000 ) >> 29; flag |= (IR ( test[3] ) & 0x80000000 ) >> 28; flag |= (IR ( test[4] ) & 0x80000000 ) >> 27; flag |= (IR ( test[5] ) & 0x80000000 ) >> 26; - +*/ /* flag = F32_LOWER_EQUAL_0 ( test[0] ); flag |= F32_LOWER_EQUAL_0 ( test[1] ) << 1; @@ -559,33 +939,24 @@ REALINLINE u32 CBurningVideoDriver::clipToFrustumTest ( const s4DVertex * v ) c #else -REALINLINE u32 CBurningVideoDriver::clipToFrustumTest ( const s4DVertex * v ) const +REALINLINE size_t clipToFrustumTest ( const s4DVertex* v ) { - u32 flag = 0; + size_t flag = 0; - flag |= v->Pos.z <= v->Pos.w ? 1 : 0; - flag |= -v->Pos.z <= v->Pos.w ? 2 : 0; + flag |= v->Pos.z <= v->Pos.w ? VERTEX4D_CLIP_NEAR : 0; + flag |= -v->Pos.z <= v->Pos.w ? VERTEX4D_CLIP_FAR : 0; - flag |= v->Pos.x <= v->Pos.w ? 4 : 0; - flag |= -v->Pos.x <= v->Pos.w ? 8 : 0; + flag |= v->Pos.x <= v->Pos.w ? VERTEX4D_CLIP_LEFT : 0; + flag |= -v->Pos.x <= v->Pos.w ? VERTEX4D_CLIP_RIGHT : 0; + + flag |= v->Pos.y <= v->Pos.w ? VERTEX4D_CLIP_BOTTOM : 0; + flag |= -v->Pos.y <= v->Pos.w ? VERTEX4D_CLIP_TOP : 0; - flag |= v->Pos.y <= v->Pos.w ? 16 : 0; - flag |= -v->Pos.y <= v->Pos.w ? 32 : 0; /* - if ( v->Pos.z <= v->Pos.w ) flag |= 1; - if (-v->Pos.z <= v->Pos.w ) flag |= 2; - - if ( v->Pos.x <= v->Pos.w ) flag |= 4; - if (-v->Pos.x <= v->Pos.w ) flag |= 8; - - if ( v->Pos.y <= v->Pos.w ) flag |= 16; - if (-v->Pos.y <= v->Pos.w ) flag |= 32; -*/ -/* - for ( u32 i = 0; i!= 6; ++i ) + for ( u32 i = 0; i <= 6; ++i ) { - core::setbit_cond( flag, v->Pos.dotProduct ( NDCPlane[i] ) <= 0.f, 1 << i ); + if (v->Pos.dot_xyzw(NDCPlane[i]) <= 0.f) flag |= ((size_t)1) << i; } */ return flag; @@ -593,87 +964,136 @@ REALINLINE u32 CBurningVideoDriver::clipToFrustumTest ( const s4DVertex * v ) c #endif // _MSC_VER -u32 CBurningVideoDriver::clipToHyperPlane ( s4DVertex * dest, const s4DVertex * source, u32 inCount, const sVec4 &plane ) + +size_t clipToHyperPlane ( + s4DVertexPair* burning_restrict dest, + const s4DVertexPair* burning_restrict source, + const size_t inCount, + const sVec4& plane +) { - u32 outCount = 0; - s4DVertex * out = dest; + size_t outCount = 0; + s4DVertexPair* out = dest; - const s4DVertex * a; - const s4DVertex * b = source; + const s4DVertex* a; + const s4DVertex* b = source; - f32 bDotPlane; - - bDotPlane = b->Pos.dotProduct ( plane ); + ipoltype bDotPlane; + bDotPlane = b->Pos.dot_xyzw( plane ); +/* for( u32 i = 1; i < inCount + 1; ++i) { - // i really have problem +#if 0 + a = source + (i%inCount)*2; +#else const s32 condition = i - inCount; const s32 index = (( ( condition >> 31 ) & ( i ^ condition ) ) ^ condition ) << 1; - - a = &source[ index ]; + a = source + index; +#endif +*/ + //Sutherland–Hodgman + for(size_t i = 0; i < inCount; ++i) + { + a = source + (i == inCount-1 ? 0 : s4DVertex_ofs(i+1)); // current point inside - if ( a->Pos.dotProduct ( plane ) <= 0.f ) + if (ipol_lower_equal_0(a->Pos.dot_xyzw( plane )) ) { // last point outside - if ( F32_GREATER_0 ( bDotPlane ) ) + if (ipol_greater_0( bDotPlane ) ) { // intersect line segment with plane - out->interpolate ( *b, *a, bDotPlane / (b->Pos - a->Pos).dotProduct ( plane ) ); - out += 2; + out->interpolate(*b, *a, bDotPlane / (b->Pos - a->Pos).dot_xyzw(plane) ); + out += sizeof_s4DVertexPairRel; outCount += 1; } // copy current to out //*out = *a; - irr::memcpy32_small ( out, a, SIZEOF_SVERTEX * 2 ); + memcpy_s4DVertexPair( out, a); b = out; - out += 2; + out += sizeof_s4DVertexPairRel; outCount += 1; } else { // current point outside - - if ( F32_LOWER_EQUAL_0 ( bDotPlane ) ) + if (ipol_lower_equal_0( bDotPlane ) ) { // previous was inside // intersect line segment with plane - out->interpolate ( *b, *a, bDotPlane / (b->Pos - a->Pos).dotProduct ( plane ) ); - out += 2; + out->interpolate(*b, *a, bDotPlane / (b->Pos - a->Pos).dot_xyzw(plane) ); + out += sizeof_s4DVertexPairRel; outCount += 1; } // pointer b = a; } - bDotPlane = b->Pos.dotProduct ( plane ); - + bDotPlane = b->Pos.dot_xyzw( plane ); } return outCount; } -u32 CBurningVideoDriver::clipToFrustum ( s4DVertex *v0, s4DVertex * v1, const u32 vIn ) +/* + Clip on all planes. Clipper.data + clipmask per face +*/ +size_t CBurningVideoDriver::clipToFrustum(const size_t vIn /*, const size_t clipmask_for_face*/ ) { - u32 vOut = vIn; + s4DVertexPair* v0 = Clipper.data; + s4DVertexPair* v1 = Clipper_temp.data; + size_t vOut = vIn; + + //clear all clipping & projected flags + const u32 flag = v0[0].flag & VERTEX4D_FORMAT_MASK; + for (size_t g = 0; g != Clipper.ElementSize; ++g) + { + v0[g].flag = flag; + v1[g].flag = flag; + } + +#if 0 + for (size_t i = 0; i < 6; ++i) + { + v0 = i & 1 ? Clipper_temp.data : Clipper.data; + v1 = i & 1 ? Clipper.data : Clipper_temp.data; + + //clipMask checked outside - always clip all planes +#if 0 + if (0 == (clipMask & ((size_t)1< 0 + dest[g].Tex[0] = source[g].Tex[0]; +#endif +#if BURNING_MATERIAL_MAX_TEXTURES > 1 + dest[g].Tex[1] = source[g].Tex[1]; +#endif +#if BURNING_MATERIAL_MAX_TEXTURES > 2 + dest[g].Tex[2] = source[g].Tex[2]; +#endif +#if BURNING_MATERIAL_MAX_TEXTURES > 3 + dest[g].Tex[3] = source[g].Tex[3]; #endif - #ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#endif + +#if BURNING_MATERIAL_MAX_COLORS > 0 #ifdef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT - dest[g].Color[0] = source[g].Color[0] * iw; + dest[g].Color[0] = source[g].Color[0] * iw; // alpha? #else dest[g].Color[0] = source[g].Color[0]; #endif +#endif - #endif +#if BURNING_MATERIAL_MAX_COLORS > 1 +#ifdef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT + dest[g].Color[1] = source[g].Color[1] * iw; // alpha? +#else + dest[g].Color[1] = source[g].Color[1]; +#endif +#endif + +#if BURNING_MATERIAL_MAX_COLORS > 2 +#ifdef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT + dest[g].Color[2] = source[g].Color[2] * iw; // alpha? +#else + dest[g].Color[2] = source[g].Color[2]; +#endif +#endif + +#if BURNING_MATERIAL_MAX_COLORS > 3 +#ifdef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT + dest[g].Color[3] = source[g].Color[3] * iw; // alpha? +#else + dest[g].Color[3] = source[g].Color[3]; +#endif +#endif + +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT > 0 dest[g].LightTangent[0] = source[g].LightTangent[0] * iw; - dest[g].Pos.w = iw; - } -} - - -inline void CBurningVideoDriver::ndc_2_dc_and_project2 ( const s4DVertex **v, const u32 size ) const -{ - u32 g; - - for ( g = 0; g != size; g += 1 ) - { - s4DVertex * a = (s4DVertex*) v[g]; - - if ( (a[1].flag & VERTEX4D_PROJECTED ) == VERTEX4D_PROJECTED ) - continue; - - a[1].flag = a->flag | VERTEX4D_PROJECTED; - - // project homogenous vertex, store 1/w - const f32 w = a->Pos.w; - const f32 iw = core::reciprocal ( w ); - - // to device coordinates - const f32 * p = Transformation [ ETS_CLIPSCALE ].pointer(); - a[1].Pos.x = iw * ( a->Pos.x * p[ 0] + w * p[12] ); - a[1].Pos.y = iw * ( a->Pos.y * p[ 5] + w * p[13] ); - -#ifndef SOFTWARE_DRIVER_2_USE_WBUFFER - a[1].Pos.z = a->Pos.z * iw; #endif - #ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR - #ifdef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT - a[1].Color[0] = a->Color[0] * iw; - #else - a[1].Color[0] = a->Color[0]; - #endif - #endif + } +} - a[1].LightTangent[0] = a[0].LightTangent[0] * iw; - a[1].Pos.w = iw; + +/*! + crossproduct in projected 2D, face +*/ +REALINLINE f32 CBurningVideoDriver::screenarea_inside(const s4DVertexPair* burning_restrict const face[] ) const +{ + return ( ((face[1]+1)->Pos.x - (face[0]+1)->Pos.x) * ((face[2]+1)->Pos.y - (face[0]+1)->Pos.y) ) - + ( ((face[2]+1)->Pos.x - (face[0]+1)->Pos.x) * ((face[1]+1)->Pos.y - (face[0]+1)->Pos.y) ); +/* + float signedArea = 0; + for (int k = 1; k < output->count; k++) { + signedArea += (output->vertices[k - 1].values[0] * output->vertices[k - 0].values[1]); + signedArea -= (output->vertices[k - 0].values[0] * output->vertices[k - 1].values[1]); + } +*/ +} + +#if 0 +static inline f32 dot(const sVec2& a,const sVec2& b) { return a.x * b.x + a.y * b.y; } +sVec2 dFdx(const sVec2& v) { return v; } +sVec2 dFdy(const sVec2& v) { return v; } + +f32 MipmapLevel(const sVec2& uv, const sVec2& textureSize) +{ + sVec2 dx = dFdx(uv * textureSize.x); + sVec2 dy = dFdy(uv * textureSize.y); + f32 d = core::max_(dot(dx, dx), dot(dy, dy)); + return log2f(sqrtf(d)); +} +#endif + +#define MAT_TEXTURE(tex) ( (video::CSoftwareTexture2*) Material.org.getTexture ( (u32)tex ) ) + +/*! + calculate from unprojected. + attribute need not to follow winding rule from position. + Edge-walking problem + Texture Wrapping problem + Atlas problem +*/ +REALINLINE s32 CBurningVideoDriver::lodFactor_inside(const s4DVertexPair* burning_restrict const face[], + const size_t m, f32 dc_area, f32 lod_bias) const +{ + /* + sVec2 a(v[1]->Tex[tex].x - v[0]->Tex[tex].x,v[1]->Tex[tex].y - v[0]->Tex[tex].y); + sVec2 b(v[2]->Tex[tex].x - v[0]->Tex[tex].x,v[2]->Tex[tex].y - v[0]->Tex[tex].y); + f32 area = a.x * b.y - b.x * a.y; + */ + + + /* + degenerate(A, B, C, minarea) = ((B - A).cross(C - A)).lengthSquared() < (4.0f * minarea * minarea); + check for collapsed or "long thin triangles" + */ + ieee754 signedArea; + + ieee754 t[4]; + t[0].f = face[1]->Tex[m].x - face[0]->Tex[m].x; + t[1].f = face[1]->Tex[m].y - face[0]->Tex[m].y; + + t[2].f = face[2]->Tex[m].x - face[0]->Tex[m].x; + t[3].f = face[2]->Tex[m].y - face[0]->Tex[m].y; + + //crossproduct in projected 2D -> screen area triangle + signedArea.f = t[0].f * t[3].f - t[2].f * t[1].f; + + //signedArea = + // ((face[1]->Tex[m].x - face[0]->Tex[m].x) * (face[2]->Tex[m].y - face[0]->Tex[m].y)) + // - ((face[2]->Tex[m].x - face[0]->Tex[m].x) * (face[1]->Tex[m].y - face[0]->Tex[m].y)); + + //if (signedArea*signedArea <= 0.00000000001f) + if (signedArea.fields.exp == 0 ) + { + ieee754 _max; + _max.u = t[0].abs.frac_exp; + if (t[1].abs.frac_exp > _max.u) _max.u = t[1].abs.frac_exp; + if (t[2].abs.frac_exp > _max.u) _max.u = t[2].abs.frac_exp; + if (t[3].abs.frac_exp > _max.u) _max.u = t[3].abs.frac_exp; + + signedArea.u = _max.fields.exp ? _max.u : ieee754_one; + +/* + //dot,length + ieee754 v[2]; + v[0].f = t[0] * t[2]; + v[1].f = t[1] * t[3]; + + //signedArea.f = t[4] > t[5] ? t[4] : t[5]; + signedArea.u = v[0].fields.frac > v[1].fields.frac ? v[0].u : v[1].u; + if (signedArea.fields.exp == 0) + { + return -1; + } +*/ } + //only guessing: take more detail (lower mipmap) in light+bump textures + //assume transparent add is ~50% transparent -> more detail + const u32* d = MAT_TEXTURE(m)->getMipMap0_Area(); + f32 texelspace = d[0] * d[1] * lod_bias; //(m ? 0.5f : 0.5f); + + ieee754 ratio; + ratio.f = (signedArea.f * texelspace) * dc_area; + ratio.fields.sign = 0; + + //log2(0)==denormal [ use high lod] [ only if dc_area == 0 checked outside ] +#if 0 + if (ratio.fields.exp == 0) + { + int g = 1; + } +#endif + //log2 + return (ratio.fields.exp & 0x80) ? ratio.fields.exp - 127 : 0; /*denormal very high lod*/ + + //return (ratio.f <= 1.f) ? 0 : 1; + //f32 texArea = MAT_TEXTURE(m)->getLODFactor(signedArea); // texelarea_inside(face, m); + //s32 lodFactor = s32_log2_f32(texArea * dc_area); /* avoid denorm */ + + //return MAT_TEXTURE(m)->getLODFactor(signedArea); } /*! - crossproduct in projected 2D -> screen area triangle + texcoo in current mipmap dimension (face, already clipped) + -> want to help fixpoint */ -inline f32 CBurningVideoDriver::screenarea ( const s4DVertex *v ) const +inline void CBurningVideoDriver::select_polygon_mipmap_inside(s4DVertex* burning_restrict face[], const size_t tex, const CSoftwareTexture2_Bound& b) const { - return ( ( v[3].Pos.x - v[1].Pos.x ) * ( v[5].Pos.y - v[1].Pos.y ) ) - - ( ( v[3].Pos.y - v[1].Pos.y ) * ( v[5].Pos.x - v[1].Pos.x ) ); -} - - -/*! -*/ -inline f32 CBurningVideoDriver::texelarea ( const s4DVertex *v, int tex ) const -{ - f32 z; - - z = ( (v[2].Tex[tex].x - v[0].Tex[tex].x ) * (v[4].Tex[tex].y - v[0].Tex[tex].y ) ) - - ( (v[4].Tex[tex].x - v[0].Tex[tex].x ) * (v[2].Tex[tex].y - v[0].Tex[tex].y ) ); - - return MAT_TEXTURE ( tex )->getLODFactor ( z ); -} - -/*! - crossproduct in projected 2D -*/ -inline f32 CBurningVideoDriver::screenarea2 ( const s4DVertex **v ) const -{ - return ( (( v[1] + 1 )->Pos.x - (v[0] + 1 )->Pos.x ) * ( (v[2] + 1 )->Pos.y - (v[0] + 1 )->Pos.y ) ) - - ( (( v[1] + 1 )->Pos.y - (v[0] + 1 )->Pos.y ) * ( (v[2] + 1 )->Pos.x - (v[0] + 1 )->Pos.x ) ); -} - -/*! -*/ -inline f32 CBurningVideoDriver::texelarea2 ( const s4DVertex **v, s32 tex ) const -{ - f32 z; - z = ( (v[1]->Tex[tex].x - v[0]->Tex[tex].x ) * (v[2]->Tex[tex].y - v[0]->Tex[tex].y ) ) - - ( (v[2]->Tex[tex].x - v[0]->Tex[tex].x ) * (v[1]->Tex[tex].y - v[0]->Tex[tex].y ) ); - - return MAT_TEXTURE ( tex )->getLODFactor ( z ); -} - - -/*! -*/ -inline void CBurningVideoDriver::select_polygon_mipmap ( s4DVertex *v, u32 vIn, u32 tex, const core::dimension2du& texSize ) const -{ - f32 f[2]; - - 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 ) - { - (v + g + 1 )->Tex[tex].x = (v + g + 0)->Tex[tex].x * ( v + g + 1 )->Pos.w * f[0]; - (v + g + 1 )->Tex[tex].y = (v + g + 0)->Tex[tex].y * ( v + g + 1 )->Pos.w * f[1]; - } +#if defined(Tweak_Burning) + (face[0] + 1)->Tex[tex].x = face[0]->Tex[tex].x * (face[0] + 1)->Pos.w * (b.w + Tweak.tex_w_add) + (b.cx + Tweak.tex_cx_add); + (face[0] + 1)->Tex[tex].y = face[0]->Tex[tex].y * (face[0] + 1)->Pos.w * (b.h + Tweak.tex_h_add) + (b.cy + Tweak.tex_cy_add); + + (face[1] + 1)->Tex[tex].x = face[1]->Tex[tex].x * (face[1] + 1)->Pos.w * (b.w + Tweak.tex_w_add) + (b.cx + Tweak.tex_cx_add); + (face[1] + 1)->Tex[tex].y = face[1]->Tex[tex].y * (face[1] + 1)->Pos.w * (b.h + Tweak.tex_h_add) + (b.cy + Tweak.tex_cy_add); + + (face[2] + 1)->Tex[tex].x = face[2]->Tex[tex].x * (face[2] + 1)->Pos.w * (b.w + Tweak.tex_w_add) + (b.cx + Tweak.tex_cx_add); + (face[2] + 1)->Tex[tex].y = face[2]->Tex[tex].y * (face[2] + 1)->Pos.w * (b.h + Tweak.tex_h_add) + (b.cy + Tweak.tex_cy_add); #else - for ( u32 g = 0; g != vIn; g += 2 ) - { - (v + g + 1 )->Tex[tex].x = (v + g + 0)->Tex[tex].x * f[0]; - (v + g + 1 )->Tex[tex].y = (v + g + 0)->Tex[tex].y * f[1]; - } + (face[0] + 1)->Tex[tex].x = face[0]->Tex[tex].x * (face[0] + 1)->Pos.w * b.w + b.cx; + (face[0] + 1)->Tex[tex].y = face[0]->Tex[tex].y * (face[0] + 1)->Pos.w * b.h + b.cy; + + (face[1] + 1)->Tex[tex].x = face[1]->Tex[tex].x * (face[1] + 1)->Pos.w * b.w + b.cx; + (face[1] + 1)->Tex[tex].y = face[1]->Tex[tex].y * (face[1] + 1)->Pos.w * b.h + b.cy; + + (face[2] + 1)->Tex[tex].x = face[2]->Tex[tex].x * (face[2] + 1)->Pos.w * b.w + b.cx; + (face[2] + 1)->Tex[tex].y = face[2]->Tex[tex].y * (face[2] + 1)->Pos.w * b.h + b.cy; #endif +#else + (face[0] + 1)->Tex[tex].x = face[0]->Tex[tex].x * b.w; + (face[0] + 1)->Tex[tex].y = face[0]->Tex[tex].y * b.h; + + (face[1] + 1)->Tex[tex].x = face[1]->Tex[tex].x * b.w; + (face[1] + 1)->Tex[tex].y = face[1]->Tex[tex].y * b.h; + + (face[2] + 1)->Tex[tex].x = face[2]->Tex[tex].x * b.w; + (face[2] + 1)->Tex[tex].y = face[2]->Tex[tex].y * b.h; +#endif + } -inline void CBurningVideoDriver::select_polygon_mipmap2 ( s4DVertex **v, u32 tex, const core::dimension2du& texSize ) const -{ - f32 f[2]; - - 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]; - (v[0] + 1 )->Tex[tex].y = v[0]->Tex[tex].y * ( v[0] + 1 )->Pos.w * f[1]; - - (v[1] + 1 )->Tex[tex].x = v[1]->Tex[tex].x * ( v[1] + 1 )->Pos.w * f[0]; - (v[1] + 1 )->Tex[tex].y = v[1]->Tex[tex].y * ( v[1] + 1 )->Pos.w * f[1]; - - (v[2] + 1 )->Tex[tex].x = v[2]->Tex[tex].x * ( v[2] + 1 )->Pos.w * f[0]; - (v[2] + 1 )->Tex[tex].y = v[2]->Tex[tex].y * ( v[2] + 1 )->Pos.w * f[1]; - -#else - (v[0] + 1 )->Tex[tex].x = v[0]->Tex[tex].x * f[0]; - (v[0] + 1 )->Tex[tex].y = v[0]->Tex[tex].y * f[1]; - - (v[1] + 1 )->Tex[tex].x = v[1]->Tex[tex].x * f[0]; - (v[1] + 1 )->Tex[tex].y = v[1]->Tex[tex].y * f[1]; - - (v[2] + 1 )->Tex[tex].x = v[2]->Tex[tex].x * f[0]; - (v[2] + 1 )->Tex[tex].y = v[2]->Tex[tex].y * f[1]; -#endif -} // Vertex Cache -const SVSize CBurningVideoDriver::vSize[] = + +//! setup Vertex Format +void CBurningVideoDriver::VertexCache_map_source_format() { - { 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 | VERTEX4D_FORMAT_BUMP_DOT3, sizeof(S3DVertexTangents),2 }, - { VERTEX4D_FORMAT_TEXTURE_2 | VERTEX4D_FORMAT_COLOR_1, sizeof(S3DVertex), 2 }, // reflection map - { 0, sizeof(f32) * 3, 0 }, // core::vector3df* -}; + u32 s0 = sizeof(s4DVertex); + u32 s1 = sizeof(s4DVertex_proxy); + + if ( s1 <= sizeof_s4DVertex /2 ) + { + os::Printer::log ( "BurningVideo vertex format unnecessary to large", ELL_WARNING ); + } + + //memcpy_vertex + if ( s0 != sizeof_s4DVertex || ((sizeof_s4DVertex * sizeof_s4DVertexPairRel)&31)) + { + os::Printer::log ( "BurningVideo vertex format compile problem", ELL_ERROR ); + _IRR_DEBUG_BREAK_IF(1); + } + +#if defined(ENV64BIT) + if (sizeof(void*) != 8) + { + os::Printer::log("BurningVideo pointer should be 8 bytes", ELL_ERROR); + _IRR_DEBUG_BREAK_IF(1); + } +#endif + + SVSize* vSize = VertexCache.vSize; + //vSize[E4VT_STANDARD].Format = VERTEX4D_FORMAT_TEXTURE_1 | VERTEX4D_FORMAT_COLOR_1 | VERTEX4D_FORMAT_LIGHT_1 | VERTEX4D_FORMAT_SPECULAR; + vSize[E4VT_STANDARD].Format = VERTEX4D_FORMAT_TEXTURE_1 | VERTEX4D_FORMAT_COLOR_2_FOG; + vSize[E4VT_STANDARD].Pitch = sizeof(S3DVertex); + vSize[E4VT_STANDARD].TexSize = 1; + vSize[E4VT_STANDARD].TexCooSize = 1; + + vSize[E4VT_2TCOORDS].Format = VERTEX4D_FORMAT_TEXTURE_2 | VERTEX4D_FORMAT_COLOR_1; + vSize[E4VT_2TCOORDS].Pitch = sizeof(S3DVertex2TCoords); + vSize[E4VT_2TCOORDS].TexSize = 2; + vSize[E4VT_2TCOORDS].TexCooSize = 2; + + //vSize[E4VT_TANGENTS].Format = VERTEX4D_FORMAT_TEXTURE_2 | VERTEX4D_FORMAT_COLOR_1 | VERTEX4D_FORMAT_LIGHT_1 | VERTEX4D_FORMAT_BUMP_DOT3; + vSize[E4VT_TANGENTS].Format = VERTEX4D_FORMAT_TEXTURE_2 | VERTEX4D_FORMAT_COLOR_2_FOG | VERTEX4D_FORMAT_LIGHT_1 | VERTEX4D_FORMAT_BUMP_DOT3; + vSize[E4VT_TANGENTS].Pitch = sizeof(S3DVertexTangents); + vSize[E4VT_TANGENTS].TexSize = 2; + vSize[E4VT_TANGENTS].TexCooSize = 2; + + // reflection map + vSize[E4VT_REFLECTION_MAP].Format = VERTEX4D_FORMAT_TEXTURE_2 | VERTEX4D_FORMAT_COLOR_1; + vSize[E4VT_REFLECTION_MAP].Pitch = sizeof(S3DVertex); + vSize[E4VT_REFLECTION_MAP].TexSize = 2; + vSize[E4VT_REFLECTION_MAP].TexCooSize = 1; //TexCoo2 generated + + // shadow + vSize[E4VT_SHADOW].Format = 0; + vSize[E4VT_SHADOW].Pitch = sizeof(f32) * 3; // core::vector3df* + vSize[E4VT_SHADOW].TexSize = 0; + vSize[E4VT_SHADOW].TexCooSize = 0; + + // color shading only (no texture) + vSize[E4VT_NO_TEXTURE].Format = VERTEX4D_FORMAT_COLOR_1 | VERTEX4D_FORMAT_LIGHT_1 | VERTEX4D_FORMAT_SPECULAR; + vSize[E4VT_NO_TEXTURE].Pitch = sizeof(S3DVertex); + vSize[E4VT_NO_TEXTURE].TexSize = 0; + vSize[E4VT_NO_TEXTURE].TexCooSize = 0; + + //Line + vSize[E4VT_LINE].Format = VERTEX4D_FORMAT_COLOR_1; + vSize[E4VT_LINE].Pitch = sizeof(S3DVertex); + vSize[E4VT_LINE].TexSize = 0; + vSize[E4VT_LINE].TexCooSize = 0; + + size_t size; + for ( size_t i = 0; i < E4VT_COUNT; ++i ) + { + size_t& flag = vSize[i].Format; + +#if !defined(SOFTWARE_DRIVER_2_USE_SEPARATE_SPECULAR_COLOR) + flag &= ~VERTEX4D_FORMAT_SPECULAR; +#endif + if ( vSize[i].TexSize > BURNING_MATERIAL_MAX_TEXTURES ) + vSize[i].TexSize = BURNING_MATERIAL_MAX_TEXTURES; + + size = (flag & VERTEX4D_FORMAT_MASK_TEXTURE) >> 16; + if ( size > BURNING_MATERIAL_MAX_TEXTURES ) + { + flag = (flag & ~VERTEX4D_FORMAT_MASK_TEXTURE) | (BURNING_MATERIAL_MAX_TEXTURES << 16); + } + + size = (flag & VERTEX4D_FORMAT_MASK_COLOR) >> 20; + if ( size > BURNING_MATERIAL_MAX_COLORS ) + { + flag = (flag & ~VERTEX4D_FORMAT_MASK_COLOR) | (BURNING_MATERIAL_MAX_COLORS << 20); + } + + size = (flag & VERTEX4D_FORMAT_MASK_LIGHT) >> 24; + if ( size > BURNING_MATERIAL_MAX_LIGHT_TANGENT) + { + flag = (flag & ~VERTEX4D_FORMAT_MASK_LIGHT) | (BURNING_MATERIAL_MAX_LIGHT_TANGENT << 24); + } + } + + VertexCache.mem.resize(VERTEXCACHE_ELEMENT * 2); + VertexCache.vType = E4VT_STANDARD; + + Clipper.resize(VERTEXCACHE_ELEMENT * 2); + Clipper_temp.resize(VERTEXCACHE_ELEMENT * 2); + + TransformationStack = 0; + memset(TransformationFlag, 0, sizeof(TransformationFlag)); + memset(Transformation_ETS_CLIPSCALE, 0, sizeof(Transformation_ETS_CLIPSCALE)); + + Material.resetRenderStates = true; + Material.Fallback_MaterialType = EMT_SOLID; + + +} /*! - fill a cache line with transformed, light and clipp test triangles + fill a cache line with transformed, light and clip test triangles + overhead - if primitive is outside or culled, vertexLighting and TextureTransform is still done */ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex, const u32 destIndex) { - u8 * source; - s4DVertex *dest; + u8* burning_restrict source; + s4DVertex* burning_restrict dest; - source = (u8*) VertexCache.vertices + ( sourceIndex * vSize[VertexCache.vType].Pitch ); + source = (u8*) VertexCache.vertices + ( sourceIndex * VertexCache.vSize[VertexCache.vType].Pitch ); // it's a look ahead so we never hit it.. // but give priority... @@ -890,71 +1487,233 @@ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex, const u32 dest VertexCache.info[ destIndex ].hit = 0; // destination Vertex - dest = (s4DVertex *) ( (u8*) VertexCache.mem.data + ( destIndex << ( SIZEOF_SVERTEX_LOG2 + 1 ) ) ); + dest = VertexCache.mem.data + s4DVertex_ofs(destIndex); + + //Irrlicht S3DVertex,S3DVertex2TCoords,S3DVertexTangents + const S3DVertex* base = ((S3DVertex*)source); // transform Model * World * Camera * Projection * NDCSpace matrix - const S3DVertex *base = ((S3DVertex*) source ); - Transformation [ ETS_CURRENT].transformVect ( &dest->Pos.x, base->Pos ); + const core::matrix4* matrix = Transformation[TransformationStack]; + matrix[ETS_PROJ_MODEL_VIEW].transformVect(&dest->Pos.x, base->Pos); - //mhm ;-) maybe no goto - if ( VertexCache.vType == 4 ) goto clipandproject; + //mhm ... maybe no goto + if (VertexCache.vType == E4VT_SHADOW) + { + //core::vector3df i = base->Pos; + //i.Z -= 0.5f; + //matrix[ETS_PROJ_MODEL_VIEW].transformVect(&dest->Pos.x, i); + + //GL_DEPTH_CLAMP,EVDF_DEPTH_CLAMP + //if ( dest->Pos.z < dest->Pos.w) + // dest->Pos.z = dest->Pos.w*0.99f; + + //glPolygonOffset // self shadow wanted or not? + dest->Pos.w *= 1.005f; + + //flag |= v->Pos.z <= v->Pos.w ? VERTEX4D_CLIP_NEAR : 0; + //flag |= -v->Pos.z <= v->Pos.w ? VERTEX4D_CLIP_FAR : 0; + + goto clipandproject; + } #if defined (SOFTWARE_DRIVER_2_LIGHTING) || defined ( SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM ) - // vertex normal in light space - if ( Material.org.Lighting || (LightSpace.Flags & VERTEXTRANSFORM) ) + // vertex, normal in light(eye) space + if ( Material.org.Lighting || (EyeSpace.TL_Flag & (TL_TEXTURE_TRANSFORM|TL_FOG)) ) { - 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 ); + sVec4 vertex4; //eye coordinate position of vertex + matrix[ETS_MODEL_VIEW].transformVect ( &vertex4.x, base->Pos ); - // vertex in light space - if ( LightSpace.Flags & ( POINTLIGHT | FOG | SPECULAR | VERTEXTRANSFORM) ) - Transformation[ETS_WORLD].transformVect ( &LightSpace.vertex.x, base->Pos ); - } + f32 iw = reciprocal_zero(vertex4.w); + EyeSpace.vertex.x = vertex4.x * iw; + EyeSpace.vertex.y = vertex4.y * iw; + EyeSpace.vertex.z = vertex4.z * iw; + EyeSpace.vertex.w = iw; - if ( LightSpace.Flags & NORMALIZE ) - LightSpace.normal.normalize_xyz(); + //EyeSpace.cam_distance = EyeSpace.vertex.length_xyz(); + EyeSpace.cam_dir = EyeSpace.vertex; + EyeSpace.cam_dir.normalize_dir_xyz(); + + matrix[ETS_NORMAL].rotateVect(&EyeSpace.normal.x, base->Normal); + if (EyeSpace.TL_Flag & TL_NORMALIZE_NORMALS) + EyeSpace.normal.normalize_dir_xyz(); } #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 ( base->Color.color ); - #endif +#if BURNING_MATERIAL_MAX_COLORS > 1 + dest->Color[1].a = 1.f; + dest->Color[1].r = 0.f; + dest->Color[1].g = 0.f; + dest->Color[1].b = 0.f; #endif +#if BURNING_MATERIAL_MAX_COLORS > 2 + dest->Color[2].a = 1.f; + dest->Color[2].r = 0.f; + dest->Color[2].g = 0.f; + dest->Color[2].b = 0.f; +#endif + +#if BURNING_MATERIAL_MAX_COLORS > 3 + dest->Color[3].a = 1.f; + dest->Color[3].r = 0.f; + dest->Color[3].g = 0.f; + dest->Color[3].b = 0.f; +#endif + +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT > 0 + dest->LightTangent[0].x = 0.f; + dest->LightTangent[0].y = 0.f; + dest->LightTangent[0].z = 0.f; +#endif + + +#if BURNING_MATERIAL_MAX_COLORS > 0 +// apply lighting model +#if defined (SOFTWARE_DRIVER_2_LIGHTING) + if ( Material.org.Lighting ) + { + lightVertex_eye ( dest, base->Color.color ); + } + else + { + dest->Color[0].setA8R8G8B8 ( base->Color.color ); + } +#else + dest->Color[0].setA8R8G8B8 ( base->Color.color ); +#endif +#endif + + //vertex fog + if (EyeSpace.TL_Flag & TL_FOG ) //Material.org.FogEnable + { + f32 fog_factor = 1.f; + + // GL_FRAGMENT_DEPTH -> abs(EyeSpace.vertex.z) + ieee754 fog_frag_coord; + fog_frag_coord.f = EyeSpace.vertex.z; + fog_frag_coord.fields.sign = 0; + + switch (FogType) + { + case EFT_FOG_LINEAR: + fog_factor = (FogEnd - fog_frag_coord.f) * EyeSpace.fog_scale; + break; + case EFT_FOG_EXP: + fog_factor = (f32)exp(-FogDensity * fog_frag_coord.f); + break; + case EFT_FOG_EXP2: + fog_factor = (f32)exp(-FogDensity * FogDensity * fog_frag_coord.f * fog_frag_coord.f); + break; + } + + sVec4* a = dest->Color + ((VertexCache.vSize[VertexCache.vType].Format & VERTEX4D_FORMAT_COLOR_2_FOG) ? 1 : 0); + a->a = core::clamp(fog_factor, 0.f, 1.f); + } + // 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 defined ( SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM ) - if ( 0 == (LightSpace.Flags & VERTEXTRANSFORM) ) + if ( 0 == (EyeSpace.TL_Flag & TL_TEXTURE_TRANSFORM) ) +#endif // SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM { - irr::memcpy32_small ( &dest->Tex[0],&base->TCoords, - vSize[VertexCache.vType].TexSize << 3 // * ( sizeof ( f32 ) * 2 ) - ); + // Irrlicht TCoords and TCoords2 must be contiguous memory. baseTCoord has no 4 byte aligned start address! + const f32* baseTCoord = &base->TCoords.X; + + switch (VertexCache.vSize[VertexCache.vType].TexCooSize) + { +#if BURNING_MATERIAL_MAX_TEXTURES == 4 + case 0: + dest->Tex[0].x = 0.f; + dest->Tex[0].y = 0.f; + dest->Tex[1].x = 0.f; + dest->Tex[1].y = 0.f; + dest->Tex[2].x = 0.f; + dest->Tex[2].y = 0.f; + dest->Tex[3].x = 0.f; + dest->Tex[3].y = 0.f; + break; + case 1: + dest->Tex[0].x = baseTCoord[0]; + dest->Tex[0].y = baseTCoord[1]; + dest->Tex[1].x = 0.f; + dest->Tex[1].y = 0.f; + dest->Tex[2].x = 0.f; + dest->Tex[2].y = 0.f; + dest->Tex[3].x = 0.f; + dest->Tex[3].y = 0.f; + break; + case 2: + dest->Tex[0].x = baseTCoord[0]; + dest->Tex[0].y = baseTCoord[1]; + dest->Tex[1].x = baseTCoord[2]; + dest->Tex[1].y = baseTCoord[3]; + dest->Tex[2].x = 0.f; + dest->Tex[2].y = 0.f; + dest->Tex[3].x = 0.f; + dest->Tex[3].y = 0.f; + break; + case 3: + dest->Tex[0].x = baseTCoord[0]; + dest->Tex[0].y = baseTCoord[1]; + dest->Tex[1].x = baseTCoord[2]; + dest->Tex[1].y = baseTCoord[3]; + dest->Tex[2].x = baseTCoord[4]; + dest->Tex[2].y = baseTCoord[5]; + dest->Tex[3].x = 0.f; + dest->Tex[3].y = 0.f; + break; + case 4: + dest->Tex[0].x = baseTCoord[0]; + dest->Tex[0].y = baseTCoord[1]; + dest->Tex[1].x = baseTCoord[2]; + dest->Tex[1].y = baseTCoord[3]; + dest->Tex[2].x = baseTCoord[4]; + dest->Tex[2].y = baseTCoord[5]; + dest->Tex[3].x = baseTCoord[6]; + dest->Tex[3].y = baseTCoord[7]; + break; +#endif + +#if BURNING_MATERIAL_MAX_TEXTURES == 2 + case 0: + dest->Tex[0].x = 0.f; + dest->Tex[0].y = 0.f; + dest->Tex[1].x = 0.f; + dest->Tex[1].y = 0.f; + break; + + case 1: + dest->Tex[0].x = baseTCoord[0]; + dest->Tex[0].y = baseTCoord[1]; + dest->Tex[1].x = 0.f; + dest->Tex[1].y = 0.f; + break; + case 2: + dest->Tex[0].x = baseTCoord[0]; + dest->Tex[0].y = baseTCoord[1]; + dest->Tex[1].x = baseTCoord[2]; + dest->Tex[1].y = baseTCoord[3]; + break; +#endif +#if BURNING_MATERIAL_MAX_TEXTURES == 1 + case 0: + dest->Tex[0].x = 0.f; + dest->Tex[0].y = 0.f; + break; + case 1: + dest->Tex[0].x = baseTCoord[0]; + dest->Tex[0].y = baseTCoord[1]; + break; +#endif + default: + break; + } } +#if defined ( SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM ) else { /* @@ -968,222 +1727,195 @@ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex, const u32 dest Uw Vw 0 0 */ - u32 t; - sVec4 n; - sVec2 srcT; + const sVec4& u = EyeSpace.cam_dir; // EyeSpace.vertex.normalized + const sVec4& n = EyeSpace.normal; + sVec4 r; - for ( t = 0; t != vSize[VertexCache.vType].TexSize; ++t ) + const size_t* flag = TransformationFlag[TransformationStack]; + for ( u32 t = 0; t != VertexCache.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) ) + if (flag[ETS_TEXTURE_0+t] & ETF_TEXGEN_CAMERA_SPHERE ) { - 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(); + //reflect(u,N) u - 2.0 * dot(N, u) * N + // cam is (0,0,-1), tex flipped + f32 dot = -2.f * n.dot_xyz(u); + r.x = u.x + dot * n.x; + r.y = u.y + dot * n.y; + r.z = u.z + dot * n.z; - const f32 *view = Transformation[ETS_VIEW].pointer(); + //openGL + f32 m = 2.f * sqrtf(r.x*r.x+r.y*r.y+(r.z+1.f)*(r.z+1.f)); + dest[0].Tex[t].x = r.x / m + 0.5f; + dest[0].Tex[t].y = -r.y / m + 0.5f; - if ( TransformationFlag [ ETS_TEXTURE_0 + t ] & ETF_TEXGEN_CAMERA_REFLECTION ) +/* + //~d3d with spheremap scale + f32 m = 0.25f / (0.00001f + sqrtf(r.x*r.x+r.y*r.y+r.z*r.z)); + dest[0].Tex[t].x = r.x * m + 0.5f; + dest[0].Tex[t].y = -r.y * m + 0.5f; +*/ + } + else if (flag[ETS_TEXTURE_0+t] & ETF_TEXGEN_CAMERA_REFLECTION ) + { + //reflect(u,N) u - 2.0 * dot(N, u) * N + // cam is (0,0,-1), tex flipped + f32 dot = -2.f * n.dot_xyz(u); + r.x = u.x + dot * n.x; + r.y = u.y + dot * n.y; + r.z = u.z + dot * n.z; + + //openGL + dest[0].Tex[t].x = r.x; + dest[0].Tex[t].y = -r.y; +/* + //~d3d with spheremap scale + dest[0].Tex[t].x = r.x; + dest[0].Tex[t].y = r.y; +*/ + } + else if (VertexCache.vSize[VertexCache.vType].TexCooSize > t) + { + const f32* M = matrix[ETS_TEXTURE_0 + t].pointer(); + + // Irrlicht TCoords and TCoords2 must be contiguous memory. baseTCoord has no 4 byte aligned start address! + const f32* baseTCoord = &base->TCoords.X; + + sVec4 srcT; + srcT.x = baseTCoord[(t * 2) + 0]; + srcT.y = baseTCoord[(t * 2) + 1]; + + switch ( Material.org.TextureLayer[t].TextureWrapU ) { - 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] )); + case ETC_CLAMP: + case ETC_CLAMP_TO_EDGE: + case ETC_CLAMP_TO_BORDER: + dest->Tex[t].x = core::clamp ( (f32) ( M[0] * srcT.x + M[4] * srcT.y + M[8] ), 0.f, 1.f ); + break; + case ETC_MIRROR: + dest->Tex[t].x = M[0] * srcT.x + M[4] * srcT.y + M[8]; + if (core::fract(dest->Tex[t].x)>0.5f) + dest->Tex[t].x=1.f-dest->Tex[t].x; + break; + case ETC_MIRROR_CLAMP: + case ETC_MIRROR_CLAMP_TO_EDGE: + case ETC_MIRROR_CLAMP_TO_BORDER: + dest->Tex[t].x = core::clamp ( (f32) ( M[0] * srcT.x + M[4] * srcT.y + M[8] ), 0.f, 1.f ); + if (core::fract(dest->Tex[t].x)>0.5f) + dest->Tex[t].x=1.f-dest->Tex[t].x; + break; + case ETC_REPEAT: + default: + dest->Tex[t].x = M[0] * srcT.x + M[4] * srcT.y + M[8]; + break; } - else + switch ( Material.org.TextureLayer[t].TextureWrapV ) { - 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] )); + case ETC_CLAMP: + case ETC_CLAMP_TO_EDGE: + case ETC_CLAMP_TO_BORDER: + dest->Tex[t].y = core::clamp ( (f32) ( M[1] * srcT.x + M[5] * srcT.y + M[9] ), 0.f, 1.f ); + break; + case ETC_MIRROR: + dest->Tex[t].y = M[1] * srcT.x + M[5] * srcT.y + M[9]; + if (core::fract(dest->Tex[t].y)>0.5f) + dest->Tex[t].y=1.f-dest->Tex[t].y; + break; + case ETC_MIRROR_CLAMP: + case ETC_MIRROR_CLAMP_TO_EDGE: + case ETC_MIRROR_CLAMP_TO_BORDER: + dest->Tex[t].y = core::clamp ( (f32) ( M[1] * srcT.x + M[5] * srcT.y + M[9] ), 0.f, 1.f ); + if (core::fract(dest->Tex[t].y)>0.5f) + dest->Tex[t].y=1.f-dest->Tex[t].y; + break; + case ETC_REPEAT: + default: + dest->Tex[t].y = M[1] * srcT.x + M[5] * srcT.y + M[9]; + break; } } - else - { - irr::memcpy32_small ( &srcT,(&base->TCoords) + t, - sizeof ( f32 ) * 2 ); - } - - switch ( Material.org.TextureLayer[t].TextureWrapU ) - { - case ETC_CLAMP: - case ETC_CLAMP_TO_EDGE: - case ETC_CLAMP_TO_BORDER: - dest->Tex[t].x = core::clamp ( (f32) ( M[0] * srcT.x + M[4] * srcT.y + M[8] ), 0.f, 1.f ); - break; - case ETC_MIRROR: - dest->Tex[t].x = M[0] * srcT.x + M[4] * srcT.y + M[8]; - if (core::fract(dest->Tex[t].x)>0.5f) - dest->Tex[t].x=1.f-dest->Tex[t].x; - break; - case ETC_MIRROR_CLAMP: - case ETC_MIRROR_CLAMP_TO_EDGE: - case ETC_MIRROR_CLAMP_TO_BORDER: - dest->Tex[t].x = core::clamp ( (f32) ( M[0] * srcT.x + M[4] * srcT.y + M[8] ), 0.f, 1.f ); - if (core::fract(dest->Tex[t].x)>0.5f) - dest->Tex[t].x=1.f-dest->Tex[t].x; - break; - case ETC_REPEAT: - default: - dest->Tex[t].x = M[0] * srcT.x + M[4] * srcT.y + M[8]; - break; - } - switch ( Material.org.TextureLayer[t].TextureWrapV ) - { - case ETC_CLAMP: - case ETC_CLAMP_TO_EDGE: - case ETC_CLAMP_TO_BORDER: - dest->Tex[t].y = core::clamp ( (f32) ( M[1] * srcT.x + M[5] * srcT.y + M[9] ), 0.f, 1.f ); - break; - case ETC_MIRROR: - dest->Tex[t].y = M[1] * srcT.x + M[5] * srcT.y + M[9]; - if (core::fract(dest->Tex[t].y)>0.5f) - dest->Tex[t].y=1.f-dest->Tex[t].y; - break; - case ETC_MIRROR_CLAMP: - case ETC_MIRROR_CLAMP_TO_EDGE: - case ETC_MIRROR_CLAMP_TO_BORDER: - dest->Tex[t].y = core::clamp ( (f32) ( M[1] * srcT.x + M[5] * srcT.y + M[9] ), 0.f, 1.f ); - if (core::fract(dest->Tex[t].y)>0.5f) - dest->Tex[t].y=1.f-dest->Tex[t].y; - break; - case ETC_REPEAT: - default: - dest->Tex[t].y = M[1] * srcT.x + M[5] * srcT.y + M[9]; - break; - } } } -#if 0 - // tangent space light vector, emboss - if ( Lights.size () && ( vSize[VertexCache.vType].Format & VERTEX4D_FORMAT_BUMP_DOT3 ) ) - { - const S3DVertexTangents *tangent = ((S3DVertexTangents*) source ); - const SBurningShaderLight &light = LightSpace.Light[0]; - sVec4 vp; - - vp.x = light.pos.x - LightSpace.vertex.x; - vp.y = light.pos.y - LightSpace.vertex.y; - vp.z = light.pos.z - LightSpace.vertex.z; - - vp.normalize_xyz(); - - LightSpace.tangent.x = vp.x * tangent->Tangent.X + vp.y * tangent->Tangent.Y + vp.z * tangent->Tangent.Z; - LightSpace.tangent.y = vp.x * tangent->Binormal.X + vp.y * tangent->Binormal.Y + vp.z * tangent->Binormal.Z; - //LightSpace.tangent.z = vp.x * tangent->Normal.X + vp.y * tangent->Normal.Y + vp.z * tangent->Normal.Z; - LightSpace.tangent.z = 0.f; - LightSpace.tangent.normalize_xyz(); - - f32 scale = 1.f / 128.f; - if ( Material.org.MaterialTypeParam > 0.f ) - scale = Material.org.MaterialTypeParam; - - // emboss, shift coordinates - dest->Tex[1].x = dest->Tex[0].x + LightSpace.tangent.x * scale; - dest->Tex[1].y = dest->Tex[0].y + LightSpace.tangent.y * scale; - //dest->Tex[1].z = LightSpace.tangent.z * scale; - } -#endif - - if ( LightSpace.Light.size () && ( vSize[VertexCache.vType].Format & VERTEX4D_FORMAT_BUMP_DOT3 ) ) +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT > 0 + if ((EyeSpace.TL_Flag & TL_LIGHT0_IS_NORMAL_MAP) && + ((VertexCache.vSize[VertexCache.vType].Format & VERTEX4D_FORMAT_MASK_TANGENT) == VERTEX4D_FORMAT_BUMP_DOT3) + ) { const S3DVertexTangents *tangent = ((S3DVertexTangents*) source ); sVec4 vp; - - dest->LightTangent[0].x = 0.f; - dest->LightTangent[0].y = 0.f; - dest->LightTangent[0].z = 0.f; - for ( u32 i = 0; i < 2 && i < LightSpace.Light.size (); ++i ) + sVec4 light_accu; + light_accu.x = 0.f; + light_accu.y = 0.f; + light_accu.z = 0.f; + light_accu.w = 0.f; + for ( u32 i = 0; i < 2 && i < EyeSpace.Light.size (); ++i ) { - const SBurningShaderLight &light = LightSpace.Light[i]; - + const SBurningShaderLight &light = EyeSpace.Light[i]; if ( !light.LightIsOn ) continue; - vp.x = light.pos.x - LightSpace.vertex.x; - vp.y = light.pos.y - LightSpace.vertex.y; - vp.z = light.pos.z - LightSpace.vertex.z; - - /* - vp.x = light.pos_objectspace.x - base->Pos.X; - vp.y = light.pos_objectspace.y - base->Pos.Y; - vp.z = light.pos_objectspace.z - base->Pos.Z; - */ - - vp.normalize_xyz(); - - - // transform by tangent matrix - sVec3 l; - #if 1 - l.x = (vp.x * tangent->Tangent.X + vp.y * tangent->Tangent.Y + vp.z * tangent->Tangent.Z ); - l.y = (vp.x * tangent->Binormal.X + vp.y * tangent->Binormal.Y + vp.z * tangent->Binormal.Z ); - l.z = (vp.x * tangent->Normal.X + vp.y * tangent->Normal.Y + vp.z * tangent->Normal.Z ); - #else - l.x = (vp.x * tangent->Tangent.X + vp.y * tangent->Binormal.X + vp.z * tangent->Normal.X ); - l.y = (vp.x * tangent->Tangent.Y + vp.y * tangent->Binormal.Y + vp.z * tangent->Normal.Y ); - l.z = (vp.x * tangent->Tangent.Z + vp.y * tangent->Binormal.Z + vp.z * tangent->Normal.Z ); - #endif - - - /* - f32 scale = 1.f / 128.f; - scale /= dest->LightTangent[0].b; - - // emboss, shift coordinates - dest->Tex[1].x = dest->Tex[0].x + l.r * scale; - dest->Tex[1].y = dest->Tex[0].y + l.g * scale; - */ - dest->Tex[1].x = dest->Tex[0].x; - dest->Tex[1].y = dest->Tex[0].y; - - // scale bias - dest->LightTangent[0].x += l.x; - dest->LightTangent[0].y += l.y; - dest->LightTangent[0].z += l.z; - } - dest->LightTangent[0].setLength ( 0.5f ); - dest->LightTangent[0].x += 0.5f; - dest->LightTangent[0].y += 0.5f; - dest->LightTangent[0].z += 0.5f; - } - - + // lightcolor with standard model + // but shader is different. treating light and vertex in same space +#if 1 + vp.x = light.pos.x - base->Pos.X; + vp.y = light.pos.y - base->Pos.Y; + vp.z = light.pos.z - base->Pos.Z; +#else + vp.x = light.pos4.x - EyeSpace.vertex.x; + vp.y = light.pos4.y - EyeSpace.vertex.y; + vp.z = light.pos4.z - EyeSpace.vertex.z; #endif -clipandproject: - dest[0].flag = dest[1].flag = vSize[VertexCache.vType].Format; + // transform by tangent matrix + light_accu.x += (vp.x * tangent->Tangent.X + vp.y * tangent->Tangent.Y + vp.z * tangent->Tangent.Z ); + light_accu.y += (vp.x * tangent->Binormal.X + vp.y * tangent->Binormal.Y + vp.z * tangent->Binormal.Z ); + light_accu.z += (vp.x * tangent->Normal.X + vp.y * tangent->Normal.Y + vp.z * tangent->Normal.Z ); + } + //normalize [-1,+1] to [0,1] -> obsolete + light_accu.normalize_pack_xyz(dest->LightTangent[0],1.f, 0.f); + dest->Tex[1].x = dest->Tex[0].x; + dest->Tex[1].y = dest->Tex[0].y; - // test vertex - dest[0].flag |= clipToFrustumTest ( dest); + } + else if (Material.org.Lighting) + { + //dest->LightTangent[0].x = 0.f; + //dest->LightTangent[0].y = 0.f; + //dest->LightTangent[0].z = 0.f; + } +#endif //if BURNING_MATERIAL_MAX_LIGHT_TANGENT > 0 + +#endif // SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM + +clipandproject: + + // test vertex visible + dest[0].flag = (u32) (clipToFrustumTest(dest) | VertexCache.vSize[VertexCache.vType].Format); + dest[1].flag = dest[0].flag; // to DC Space, project homogenous vertex if ( (dest[0].flag & VERTEX4D_CLIPMASK ) == VERTEX4D_INSIDE ) { - ndc_2_dc_and_project2 ( (const s4DVertex**) &dest, 1 ); + ndc_2_dc_and_project ( dest+1, dest, s4DVertex_ofs(1)); } - //return dest; } -// -REALINLINE s4DVertex * CBurningVideoDriver::VertexCache_getVertex ( const u32 sourceIndex ) +//todo: this should return only index +s4DVertexPair* CBurningVideoDriver::VertexCache_getVertex ( const u32 sourceIndex ) const { - for ( s32 i = 0; i < VERTEXCACHE_ELEMENT; ++i ) + for ( size_t i = 0; i < VERTEXCACHE_ELEMENT; ++i ) { if ( VertexCache.info[ i ].index == sourceIndex ) { - return (s4DVertex *) ( (u8*) VertexCache.mem.data + ( i << ( SIZEOF_SVERTEX_LOG2 + 1 ) ) ); + return VertexCache.mem.data + s4DVertex_ofs(i); } } - return 0; + return VertexCache.mem.data; //error } @@ -1192,24 +1924,29 @@ REALINLINE s4DVertex * CBurningVideoDriver::VertexCache_getVertex ( const u32 so fill blockwise on the next 16(Cache_Size) unique vertices in indexlist merge the next 16 vertices with the current */ -REALINLINE void CBurningVideoDriver::VertexCache_get(const s4DVertex ** face) +void CBurningVideoDriver::VertexCache_get(s4DVertexPair* face[4]) { - SCacheInfo info[VERTEXCACHE_ELEMENT]; - // next primitive must be complete in cache - if ( VertexCache.indicesIndex - VertexCache.indicesRun < 3 && + if ( VertexCache.indicesIndex - VertexCache.indicesRun < VertexCache.primitiveHasVertex && VertexCache.indicesIndex < VertexCache.indexCount ) { + + size_t i; + //memset(info, VERTEXCACHE_MISS, sizeof(info)); + for (i = 0; i != VERTEXCACHE_ELEMENT; ++i) + { + VertexCache.info_temp[i].hit = VERTEXCACHE_MISS; + VertexCache.info_temp[i].index = VERTEXCACHE_MISS; + } + // rewind to start of primitive VertexCache.indicesIndex = VertexCache.indicesRun; - irr::memset32 ( info, VERTEXCACHE_MISS, sizeof ( info ) ); // get the next unique vertices cache line u32 fillIndex = 0; u32 dIndex = 0; - u32 i = 0; u32 sourceIndex = 0; while ( VertexCache.indicesIndex < VertexCache.indexCount && @@ -1218,13 +1955,14 @@ REALINLINE void CBurningVideoDriver::VertexCache_get(const s4DVertex ** face) { switch ( VertexCache.iType ) { - case 1: + case E4IT_16BIT: sourceIndex = ((u16*)VertexCache.indices) [ VertexCache.indicesIndex ]; break; - case 2: + case E4IT_32BIT: sourceIndex = ((u32*)VertexCache.indices) [ VertexCache.indicesIndex ]; break; - case 4: + default: + case E4IT_NONE: sourceIndex = VertexCache.indicesIndex; break; } @@ -1235,7 +1973,7 @@ REALINLINE void CBurningVideoDriver::VertexCache_get(const s4DVertex ** face) s32 exist = 0; for ( dIndex = 0; dIndex < fillIndex; ++dIndex ) { - if ( info[ dIndex ].index == sourceIndex ) + if (VertexCache.info_temp[ dIndex ].index == sourceIndex ) { exist = 1; break; @@ -1244,7 +1982,7 @@ REALINLINE void CBurningVideoDriver::VertexCache_get(const s4DVertex ** face) if ( 0 == exist ) { - info[fillIndex++].index = sourceIndex; + VertexCache.info_temp[fillIndex++].index = sourceIndex; } } @@ -1259,9 +1997,9 @@ REALINLINE void CBurningVideoDriver::VertexCache_get(const s4DVertex ** face) { for ( dIndex = 0; dIndex < VERTEXCACHE_ELEMENT; ++dIndex ) { - if ( VertexCache.info[ dIndex ].index == info[i].index ) + if ( VertexCache.info[ dIndex ].index == VertexCache.info_temp[i].index ) { - info[i].hit = dIndex; + VertexCache.info_temp[i].hit = dIndex; VertexCache.info[ dIndex ].hit = 1; break; } @@ -1271,45 +2009,46 @@ REALINLINE void CBurningVideoDriver::VertexCache_get(const s4DVertex ** face) // fill new for ( i = 0; i!= fillIndex; ++i ) { - if ( info[i].hit != VERTEXCACHE_MISS ) + if (VertexCache.info_temp[i].hit != VERTEXCACHE_MISS ) continue; for ( dIndex = 0; dIndex < VERTEXCACHE_ELEMENT; ++dIndex ) { if ( 0 == VertexCache.info[dIndex].hit ) { - VertexCache_fill ( info[i].index, dIndex ); + VertexCache_fill (VertexCache.info_temp[i].index, dIndex ); VertexCache.info[dIndex].hit += 1; - info[i].hit = dIndex; + VertexCache.info_temp[i].hit = dIndex; break; } } } } - const u32 i0 = core::if_c_a_else_0 ( VertexCache.pType != scene::EPT_TRIANGLE_FAN, VertexCache.indicesRun ); + //const u32 i0 = core::if_c_a_else_0 ( VertexCache.pType != scene::EPT_TRIANGLE_FAN, VertexCache.indicesRun ); + const u32 i0 = VertexCache.pType != scene::EPT_TRIANGLE_FAN ? VertexCache.indicesRun : 0; switch ( VertexCache.iType ) { - case 1: + case E4IT_16BIT: { - const u16 *p = (const u16 *) VertexCache.indices; + const u16* p = (const u16*) VertexCache.indices; face[0] = VertexCache_getVertex ( p[ i0 ] ); face[1] = VertexCache_getVertex ( p[ VertexCache.indicesRun + 1] ); face[2] = VertexCache_getVertex ( p[ VertexCache.indicesRun + 2] ); } break; - case 2: + case E4IT_32BIT: { - const u32 *p = (const u32 *) VertexCache.indices; + const u32* p = (const u32*) VertexCache.indices; face[0] = VertexCache_getVertex ( p[ i0 ] ); face[1] = VertexCache_getVertex ( p[ VertexCache.indicesRun + 1] ); face[2] = VertexCache_getVertex ( p[ VertexCache.indicesRun + 2] ); } break; - case 4: + case E4IT_NONE: face[0] = VertexCache_getVertex ( VertexCache.indicesRun + 0 ); face[1] = VertexCache_getVertex ( VertexCache.indicesRun + 1 ); face[2] = VertexCache_getVertex ( VertexCache.indicesRun + 2 ); @@ -1318,122 +2057,149 @@ REALINLINE void CBurningVideoDriver::VertexCache_get(const s4DVertex ** face) face[0] = face[1] = face[2] = VertexCache_getVertex(VertexCache.indicesRun + 0); break; } - - VertexCache.indicesRun += VertexCache.primitivePitch; + face[3] = face[0]; // quad unsupported + VertexCache.indicesRun += VertexCache.indicesPitch; } + /*! */ -REALINLINE void CBurningVideoDriver::VertexCache_getbypass ( s4DVertex ** face ) -{ - const u32 i0 = core::if_c_a_else_0 ( VertexCache.pType != scene::EPT_TRIANGLE_FAN, VertexCache.indicesRun ); - - if ( VertexCache.iType == 1 ) - { - const u16 *p = (const u16 *) VertexCache.indices; - VertexCache_fill ( p[ i0 ], 0 ); - VertexCache_fill ( p[ VertexCache.indicesRun + 1], 1 ); - VertexCache_fill ( p[ VertexCache.indicesRun + 2], 2 ); - } - else - { - const u32 *p = (const u32 *) VertexCache.indices; - VertexCache_fill ( p[ i0 ], 0 ); - VertexCache_fill ( p[ VertexCache.indicesRun + 1], 1 ); - VertexCache_fill ( p[ VertexCache.indicesRun + 2], 2 ); - } - - VertexCache.indicesRun += VertexCache.primitivePitch; - - face[0] = (s4DVertex *) ( (u8*) VertexCache.mem.data + ( 0 << ( SIZEOF_SVERTEX_LOG2 + 1 ) ) ); - face[1] = (s4DVertex *) ( (u8*) VertexCache.mem.data + ( 1 << ( SIZEOF_SVERTEX_LOG2 + 1 ) ) ); - face[2] = (s4DVertex *) ( (u8*) VertexCache.mem.data + ( 2 << ( SIZEOF_SVERTEX_LOG2 + 1 ) ) ); - -} - -/*! -*/ -void CBurningVideoDriver::VertexCache_reset ( const void* vertices, u32 vertexCount, +int CBurningVideoDriver::VertexCache_reset ( const void* vertices, u32 vertexCount, const void* indices, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) { + + // These calls would lead to crashes due to wrong index usage. + // The vertex cache needs to be rewritten for these primitives. + if (0 == CurrentShader || + pType == scene::EPT_POINTS || pType == scene::EPT_LINE_STRIP || + pType == scene::EPT_LINE_LOOP || pType == scene::EPT_LINES || + pType == scene::EPT_POLYGON || + pType == scene::EPT_POINT_SPRITES) + { + return 1; + } + VertexCache.vertices = vertices; VertexCache.vertexCount = vertexCount; + switch (Material.org.MaterialType) // (Material.Fallback_MaterialType) + { + case EMT_REFLECTION_2_LAYER: + case EMT_TRANSPARENT_REFLECTION_2_LAYER: + VertexCache.vType = E4VT_REFLECTION_MAP; + break; + default: + VertexCache.vType = (e4DVertexType)vType; + break; + } + + //check material + SVSize* vSize = VertexCache.vSize; + for (int m = (int)vSize[VertexCache.vType].TexSize-1; m >= 0 ; --m) + { + ITexture* tex = MAT_TEXTURE(m); + if (!tex) + { + vSize[E4VT_NO_TEXTURE] = vSize[VertexCache.vType]; + vSize[E4VT_NO_TEXTURE].TexSize = m; + vSize[E4VT_NO_TEXTURE].TexCooSize = m; + VertexCache.vType = E4VT_NO_TEXTURE; + //flags downconvert? + } + } + VertexCache.indices = indices; VertexCache.indicesIndex = 0; VertexCache.indicesRun = 0; - if ( Material.org.MaterialType == video::EMT_REFLECTION_2_LAYER ) - VertexCache.vType = 3; - else - VertexCache.vType = vType; - VertexCache.pType = pType; - switch ( iType ) { - case EIT_16BIT: VertexCache.iType = 1; break; - case EIT_32BIT: VertexCache.iType = 2; break; + case EIT_16BIT: VertexCache.iType = E4IT_16BIT; break; + case EIT_32BIT: VertexCache.iType = E4IT_32BIT; break; default: - VertexCache.iType = iType; break; + VertexCache.iType = (e4DIndexType)iType; break; } + if (!VertexCache.indices) + VertexCache.iType = E4IT_NONE; + VertexCache.pType = pType; + VertexCache.primitiveHasVertex = 3; + VertexCache.indicesPitch = 1; switch ( VertexCache.pType ) { // most types here will not work as expected, only triangles/triangle_fan // is known to work. case scene::EPT_POINTS: VertexCache.indexCount = primitiveCount; - VertexCache.primitivePitch = 1; + VertexCache.indicesPitch = 1; + VertexCache.primitiveHasVertex = 1; break; case scene::EPT_LINE_STRIP: VertexCache.indexCount = primitiveCount+1; - VertexCache.primitivePitch = 1; + VertexCache.indicesPitch = 1; + VertexCache.primitiveHasVertex = 2; break; case scene::EPT_LINE_LOOP: VertexCache.indexCount = primitiveCount+1; - VertexCache.primitivePitch = 1; + VertexCache.indicesPitch = 1; + VertexCache.primitiveHasVertex = 2; break; case scene::EPT_LINES: VertexCache.indexCount = 2*primitiveCount; - VertexCache.primitivePitch = 2; + VertexCache.indicesPitch = 2; + VertexCache.primitiveHasVertex = 2; break; case scene::EPT_TRIANGLE_STRIP: VertexCache.indexCount = primitiveCount+2; - VertexCache.primitivePitch = 1; + VertexCache.indicesPitch = 1; + VertexCache.primitiveHasVertex = 3; break; case scene::EPT_TRIANGLES: VertexCache.indexCount = primitiveCount + primitiveCount + primitiveCount; - VertexCache.primitivePitch = 3; + VertexCache.indicesPitch = 3; + VertexCache.primitiveHasVertex = 3; break; case scene::EPT_TRIANGLE_FAN: VertexCache.indexCount = primitiveCount + 2; - VertexCache.primitivePitch = 1; + VertexCache.indicesPitch = 1; + VertexCache.primitiveHasVertex = 3; break; case scene::EPT_QUAD_STRIP: VertexCache.indexCount = 2*primitiveCount + 2; - VertexCache.primitivePitch = 2; + VertexCache.indicesPitch = 2; + VertexCache.primitiveHasVertex = 4; break; case scene::EPT_QUADS: VertexCache.indexCount = 4*primitiveCount; - VertexCache.primitivePitch = 4; + VertexCache.indicesPitch = 4; + VertexCache.primitiveHasVertex = 4; break; case scene::EPT_POLYGON: VertexCache.indexCount = primitiveCount+1; - VertexCache.primitivePitch = 1; + VertexCache.indicesPitch = 1; + VertexCache.primitiveHasVertex = primitiveCount; break; case scene::EPT_POINT_SPRITES: VertexCache.indexCount = primitiveCount; - VertexCache.primitivePitch = 1; + VertexCache.indicesPitch = 1; + VertexCache.primitiveHasVertex = 1; break; } - irr::memset32 ( VertexCache.info, VERTEXCACHE_MISS, sizeof ( VertexCache.info ) ); + //memset( VertexCache.info, VERTEXCACHE_MISS, sizeof ( VertexCache.info ) ); + for (size_t i = 0; i != VERTEXCACHE_ELEMENT; ++i) + { + VertexCache.info[i].hit = VERTEXCACHE_MISS; + VertexCache.info[i].index = VERTEXCACHE_MISS; + } + return 0; } +//! draws a vertex primitive list void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, const void* indexList, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) @@ -1444,134 +2210,138 @@ void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vert CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType, iType); - // These calls would lead to crashes due to wrong index usage. - // The vertex cache needs to be rewritten for these primitives. - if (pType==scene::EPT_POINTS || pType==scene::EPT_LINE_STRIP || - pType==scene::EPT_LINE_LOOP || pType==scene::EPT_LINES || - pType==scene::EPT_POLYGON || - pType==scene::EPT_POINT_SPRITES) + if (VertexCache_reset(vertices, vertexCount, indexList, primitiveCount, vType, pType, iType)) return; - if ( 0 == CurrentShader ) - return; - - VertexCache_reset ( vertices, vertexCount, indexList, primitiveCount, vType, pType, iType ); - - const s4DVertex * face[3]; - - f32 dc_area; - s32 lodLevel; - u32 i; - u32 g; - u32 m; - video::CSoftwareTexture2* tex; - - for ( i = 0; i < (u32) primitiveCount; ++i ) + if ((u32)Material.org.MaterialType < MaterialRenderers.size()) { + MaterialRenderers[Material.org.MaterialType].Renderer->OnRender(this, vType); + } + + //Matrices needed for this primitive + transform_calc(ETS_PROJ_MODEL_VIEW); + if ( Material.org.Lighting || (EyeSpace.TL_Flag & (TL_TEXTURE_TRANSFORM | TL_FOG)) ) + { + transform_calc(ETS_MODEL_VIEW); + transform_calc(ETS_NORMAL); + } + + + s4DVertexPair* face[4]; + + size_t vOut; + size_t vertex_from_clipper; // from VertexCache or CurrentOut + size_t has_vertex_run; + + for ( size_t primitive_run = 0; primitive_run < primitiveCount; ++primitive_run) + { + //collect pointer to face vertices VertexCache_get(face); - // if fully outside or outside on same side - if ( ( (face[0]->flag | face[1]->flag | face[2]->flag) & VERTEX4D_CLIPMASK ) - != VERTEX4D_INSIDE - ) - continue; + register size_t clipMask_i; + register size_t clipMask_o; - // if fully inside - if ( ( face[0]->flag & face[1]->flag & face[2]->flag & VERTEX4D_CLIPMASK ) == VERTEX4D_INSIDE ) + clipMask_i = face[0]->flag; + clipMask_o = face[0]->flag; + + for (has_vertex_run = 1; has_vertex_run < VertexCache.primitiveHasVertex; ++has_vertex_run) { - dc_area = screenarea2 ( face ); - if ( Material.org.BackfaceCulling && F32_LOWER_EQUAL_0( dc_area ) ) - continue; - else - if ( Material.org.FrontfaceCulling && F32_GREATER_EQUAL_0( dc_area ) ) - continue; + clipMask_i |= face[has_vertex_run]->flag; // if fully outside or outside on same side + clipMask_o &= face[has_vertex_run]->flag; // if fully inside + } + + clipMask_i &= VERTEX4D_CLIPMASK; + clipMask_o &= VERTEX4D_CLIPMASK; + + if (clipMask_i != VERTEX4D_INSIDE ) + { + // if primitive fully outside or outside on same side + continue; + vOut = 0; + vertex_from_clipper = 0; + } + else if (clipMask_o == VERTEX4D_INSIDE ) + { + // if primitive fully inside + vOut = VertexCache.primitiveHasVertex; + vertex_from_clipper = 0; + } + else +#if defined(SOFTWARE_DRIVER_2_CLIPPING) + { + // else if not complete inside clipping necessary + // check: clipping should reuse vertexcache (try to minimize clipping) + for (has_vertex_run = 0; has_vertex_run < VertexCache.primitiveHasVertex; ++has_vertex_run) + { + memcpy_s4DVertexPair(Clipper.data + s4DVertex_ofs(has_vertex_run), face[has_vertex_run]); + } + + vOut = clipToFrustum(VertexCache.primitiveHasVertex); + vertex_from_clipper = 1; + + // to DC Space, project homogenous vertex + ndc_2_dc_and_project(Clipper.data + s4DVertex_proj(0), Clipper.data, s4DVertex_ofs(vOut)); + } +#else + { + continue; + vOut = 0; + vertex_from_clipper = 0; + } +#endif + // re-tesselate ( triangle-fan, 0-1-2,0-2-3.. ) + for (has_vertex_run = 0; (has_vertex_run + VertexCache.primitiveHasVertex) <= vOut; has_vertex_run += 1) + { + // set from clipped geometry + if (vertex_from_clipper) + { + face[0] = Clipper.data + s4DVertex_ofs(0); + face[1] = Clipper.data + s4DVertex_ofs(has_vertex_run + 1); + face[2] = Clipper.data + s4DVertex_ofs(has_vertex_run + 2); + } + + //area of primitive in device space + f32 dc_area = screenarea_inside(face); + + //geometric clipping has problem with invisible or very small Triangles + //size_t sign = dc_area < 0.001f ? CULL_BACK : dc_area > 0.001f ? CULL_FRONT : CULL_INVISIBLE; + ieee754 t; + t.f = dc_area; + size_t sign = t.fields.sign ? CULL_BACK : CULL_FRONT; + sign |= t.abs.frac_exp < 981668463 /*0.01f*/ ? CULL_INVISIBLE : 0; + if (Material.CullFlag & sign) + break; //continue; + + //select mipmap ratio between drawing space and texture space + dc_area = reciprocal_zero(dc_area); // select mipmap - dc_area = core::reciprocal ( dc_area ); - for ( m = 0; m != vSize[VertexCache.vType].TexSize; ++m ) + for (size_t m = 0; m < VertexCache.vSize[VertexCache.vType].TexSize; ++m) { - if ( 0 == (tex = MAT_TEXTURE ( m )) ) - { - CurrentShader->setTextureParam(m, 0, 0); - continue; - } + video::CSoftwareTexture2* tex = MAT_TEXTURE(m); - lodLevel = s32_log2_f32 ( texelarea2 ( face, m ) * dc_area ); - CurrentShader->setTextureParam(m, tex, lodLevel ); - select_polygon_mipmap2 ( (s4DVertex**) face, m, tex->getSize() ); + //only guessing: take more detail (lower mipmap) in light+bump textures + //assume transparent add is ~50% transparent -> more detail + f32 lod_bias = Material.org.MaterialType == EMT_TRANSPARENT_ADD_COLOR ? 0.1f : 0.33f; + lod_bias *= tex->get_lod_bias(); + s32 lodFactor = lodFactor_inside(face, m, dc_area, lod_bias); + + CurrentShader->setTextureParam(m, tex, lodFactor); + //currently shader receives texture coordinate as Pixelcoo of 1 Texture + select_polygon_mipmap_inside(face, m, tex->getTexBound()); } - // rasterize - CurrentShader->drawTriangle ( face[0] + 1, face[1] + 1, face[2] + 1 ); - continue; - } - - // else if not complete inside clipping necessary - irr::memcpy32_small ( ( (u8*) CurrentOut.data + ( 0 << ( SIZEOF_SVERTEX_LOG2 + 1 ) ) ), face[0], SIZEOF_SVERTEX * 2 ); - irr::memcpy32_small ( ( (u8*) CurrentOut.data + ( 1 << ( SIZEOF_SVERTEX_LOG2 + 1 ) ) ), face[1], SIZEOF_SVERTEX * 2 ); - irr::memcpy32_small ( ( (u8*) CurrentOut.data + ( 2 << ( SIZEOF_SVERTEX_LOG2 + 1 ) ) ), face[2], SIZEOF_SVERTEX * 2 ); - - const u32 flag = CurrentOut.data->flag & VERTEX4D_FORMAT_MASK; - - for ( g = 0; g != CurrentOut.ElementSize; ++g ) - { - CurrentOut.data[g].flag = flag; - Temp.data[g].flag = flag; - } - - u32 vOut; - vOut = clipToFrustum ( CurrentOut.data, Temp.data, 3 ); - if ( vOut < 3 ) - continue; - - vOut <<= 1; - - // to DC Space, project homogenous vertex - ndc_2_dc_and_project ( CurrentOut.data + 1, CurrentOut.data, vOut ); - - // check 2d backface culling on first - dc_area = screenarea ( CurrentOut.data ); - if ( Material.org.BackfaceCulling && F32_LOWER_EQUAL_0 ( dc_area ) ) - continue; - else if ( Material.org.FrontfaceCulling && F32_GREATER_EQUAL_0( dc_area ) ) - continue; - - // select mipmap - dc_area = core::reciprocal ( dc_area ); - for ( m = 0; m != vSize[VertexCache.vType].TexSize; ++m ) - { - if ( 0 == (tex = MAT_TEXTURE ( m )) ) - { - CurrentShader->setTextureParam(m, 0, 0); - continue; - } - - lodLevel = s32_log2_f32 ( texelarea ( CurrentOut.data, m ) * dc_area ); - CurrentShader->setTextureParam(m, tex, lodLevel ); - select_polygon_mipmap ( CurrentOut.data, vOut, m, tex->getSize() ); - } - - - // re-tesselate ( triangle-fan, 0-1-2,0-2-3.. ) - for ( g = 0; g <= vOut - 6; g += 2 ) - { - // rasterize - CurrentShader->drawTriangle ( CurrentOut.data + 0 + 1, - CurrentOut.data + g + 3, - CurrentOut.data + g + 5); + CurrentShader->drawWireFrameTriangle(face[0] + 1, face[1] + 1, face[2] + 1); + vertex_from_clipper = 1; } } - // dump statistics -/* - char buf [64]; - sprintf ( buf,"VCount:%d PCount:%d CacheMiss: %d", - vertexCount, primitiveCount, - VertexCache.CacheMiss - ); - os::Printer::log( buf ); -*/ + //release texture + for (size_t m = 0; m < VertexCache.vSize[VertexCache.vType].TexSize; ++m) + { + CurrentShader->setTextureParam(m, 0, 0); + } } @@ -1581,8 +2351,7 @@ void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vert //! \param color: New color of the ambient light. void CBurningVideoDriver::setAmbientLight(const SColorf& color) { - CNullDriver::setAmbientLight(color); - LightSpace.Global_AmbientLight.setColorf ( color ); + EyeSpace.Global_AmbientLight.setColorf ( color ); } @@ -1600,54 +2369,102 @@ s32 CBurningVideoDriver::addDynamicLight(const SLight& dl) l.DiffuseColor.setColorf ( dl.DiffuseColor ); l.SpecularColor.setColorf ( dl.SpecularColor ); + //should always be valid? + sVec4 nDirection; + nDirection.x = dl.Direction.X; + nDirection.y = dl.Direction.Y; + nDirection.z = dl.Direction.Z; + nDirection.normalize_dir_xyz(); + + switch ( dl.Type ) { - case video::ELT_DIRECTIONAL: - l.pos.x = -dl.Direction.X; - l.pos.y = -dl.Direction.Y; - l.pos.z = -dl.Direction.Z; - l.pos.w = 1.f; + case ELT_DIRECTIONAL: + l.pos.x = dl.Position.X; + l.pos.y = dl.Position.Y; + l.pos.z = dl.Position.Z; + l.pos.w = 0.f; + + l.constantAttenuation = 1.f; + l.linearAttenuation = 0.f; + l.quadraticAttenuation = 0.f; + + l.spotDirection.x = -nDirection.x; + l.spotDirection.y = -nDirection.y; + l.spotDirection.z = -nDirection.z; + l.spotDirection.w = 0.f; + l.spotCosCutoff = -1.f; + l.spotCosInnerCutoff = 1.f; + l.spotExponent = 0.f; break; + case ELT_POINT: - case ELT_SPOT: - LightSpace.Flags |= POINTLIGHT; 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.spotDirection.x = -nDirection.x; + l.spotDirection.y = -nDirection.y; + l.spotDirection.z = -nDirection.z; + l.spotDirection.w = 0.f; + l.spotCosCutoff = -1.f; + l.spotCosInnerCutoff = 1.f; + l.spotExponent = 0.f; + break; + + case ELT_SPOT: + l.pos.x = dl.Position.X; + l.pos.y = dl.Position.Y; + l.pos.z = dl.Position.Z; + l.pos.w = 1.f; + l.constantAttenuation = dl.Attenuation.X; - l.linearAttenuation = 1.f / dl.Radius; + l.linearAttenuation = dl.Attenuation.Y; l.quadraticAttenuation = dl.Attenuation.Z; + l.spotDirection.x = nDirection.x; + l.spotDirection.y = nDirection.y; + l.spotDirection.z = nDirection.z; + l.spotDirection.w = 0.0f; + l.spotCosCutoff = cosf(dl.OuterCone * 2.0f * core::DEGTORAD * 0.5f); + l.spotCosInnerCutoff = cosf(dl.InnerCone * 2.0f * core::DEGTORAD * 0.5f); + l.spotExponent = dl.Falloff; break; default: break; } - LightSpace.Light.push_back ( l ); - return LightSpace.Light.size() - 1; + //which means ETS_VIEW + setTransform(ETS_WORLD,irr::core::IdentityMatrix); + transform_calc(ETS_MODEL_VIEW); + + const core::matrix4* matrix = Transformation[TransformationStack]; + transformVec4Vec4(matrix[ETS_MODEL_VIEW], &l.pos4.x, &l.pos.x ); + rotateVec3Vec4(matrix[ETS_MODEL_VIEW], &l.spotDirection4.x, &l.spotDirection.x ); + + EyeSpace.Light.push_back ( l ); + return EyeSpace.Light.size() - 1; } + //! Turns a dynamic light on or off void CBurningVideoDriver::turnLightOn(s32 lightIndex, bool turnOn) { - if(lightIndex > -1 && lightIndex < (s32)LightSpace.Light.size()) + if((u32)lightIndex < EyeSpace.Light.size()) { - LightSpace.Light[lightIndex].LightIsOn = turnOn; + EyeSpace.Light[lightIndex].LightIsOn = turnOn; } } //! deletes all dynamic lights there are void CBurningVideoDriver::deleteAllDynamicLights() { - LightSpace.reset (); + EyeSpace.reset (); CNullDriver::deleteAllDynamicLights(); } @@ -1655,248 +2472,498 @@ void CBurningVideoDriver::deleteAllDynamicLights() //! returns the maximal amount of dynamic lights the device can handle u32 CBurningVideoDriver::getMaximalDynamicLightAmount() const { - return 8; + return 8; //no limit 8 only for convenience } //! sets a material void CBurningVideoDriver::setMaterial(const SMaterial& material) { +// ---------- Override Material.org = material; + OverrideMaterial.apply(Material.org); + + const SMaterial& in = Material.org; + +// ---------- Notify Shader + // unset old material + u32 mi; + mi = (u32)Material.lastMaterial.MaterialType; + if (mi != material.MaterialType && mi < MaterialRenderers.size()) + MaterialRenderers[mi].Renderer->OnUnsetMaterial(); + + // set new material. + mi = (u32)in.MaterialType; + if (mi < MaterialRenderers.size()) + MaterialRenderers[mi].Renderer->OnSetMaterial( + in, Material.lastMaterial, Material.resetRenderStates, this); + + Material.lastMaterial = in; + Material.resetRenderStates = false; + + //CSoftware2MaterialRenderer sets Material.Fallback_MaterialType + + //Material.Fallback_MaterialType = material.MaterialType; + +//----------------- + + //Material.org = material; + Material.CullFlag = CULL_INVISIBLE | (in.BackfaceCulling ? CULL_BACK : 0) | (in.FrontfaceCulling ? CULL_FRONT : 0); + + size_t* flag = TransformationFlag[TransformationStack]; #ifdef SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM - for (u32 i = 0; i < 2; ++i) + for (u32 m = 0; m < BURNING_MATERIAL_MAX_TEXTURES /*&& m < vSize[VertexCache.vType].TexSize*/; ++m) { - setTransform((E_TRANSFORMATION_STATE) (ETS_TEXTURE_0 + i), - material.getTextureMatrix(i)); + setTransform((E_TRANSFORMATION_STATE) (ETS_TEXTURE_0 + m),in.getTextureMatrix(m)); + flag[ETS_TEXTURE_0+m] &= ~ETF_TEXGEN_MASK; } #endif #ifdef SOFTWARE_DRIVER_2_LIGHTING - 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 ); - core::setbit_cond ( LightSpace.Flags, Material.org.NormalizeNormals, NORMALIZE ); + Material.AmbientColor.setA8R8G8B8( in.AmbientColor.color ); + Material.DiffuseColor.setA8R8G8B8( in.ColorMaterial ? 0xFFFFFFFF : in.DiffuseColor.color ); + Material.EmissiveColor.setA8R8G8B8(in.EmissiveColor.color ); + Material.SpecularColor.setA8R8G8B8( in.SpecularColor.color ); + + burning_setbit(EyeSpace.TL_Flag, in.Lighting, TL_LIGHT); + burning_setbit( EyeSpace.TL_Flag, (in.Shininess != 0.f) & (in.SpecularColor.color & 0x00ffffff), TL_SPECULAR ); + burning_setbit( EyeSpace.TL_Flag, in.FogEnable, TL_FOG ); + burning_setbit( EyeSpace.TL_Flag, in.NormalizeNormals, TL_NORMALIZE_NORMALS ); + //if (EyeSpace.Flags & SPECULAR ) EyeSpace.Flags |= NORMALIZE_NORMALS; + #endif - setCurrentShader(); -} + //--------------- setCurrentShader + + ITexture* texture0 = in.getTexture(0); + ITexture* texture1 = in.getTexture(1); + //ITexture* texture2 = in.getTexture(2); + //ITexture* texture3 = in.getTexture(3); + + //visual studio code analysis + u32 maxTex = BURNING_MATERIAL_MAX_TEXTURES; + if (maxTex < 1) texture0 = 0; + if (maxTex < 2) texture1 = 0; + //if (maxTex < 3) texture2 = 0; + //if (maxTex < 4) texture3 = 0; + + EyeSpace.TL_Flag &= ~(TL_TEXTURE_TRANSFORM | TL_LIGHT0_IS_NORMAL_MAP); + + //todo: seperate depth test from depth write + Material.depth_write = getWriteZBuffer(in); + Material.depth_test = in.ZBuffer != ECFN_DISABLED && Material.depth_write; + + EBurningFFShader shader = Material.depth_test ? ETR_TEXTURE_GOURAUD : ETR_TEXTURE_GOURAUD_NOZ; + + switch (Material.Fallback_MaterialType) //(Material.org.MaterialType) + { + case EMT_ONETEXTURE_BLEND: + shader = ETR_TEXTURE_BLEND; + break; + + case EMT_TRANSPARENT_ALPHA_CHANNEL_REF: + Material.org.MaterialTypeParam = 0.5f; + //fallthrough + + case EMT_TRANSPARENT_ALPHA_CHANNEL: + if (texture0 && texture0->hasAlpha()) + { + shader = Material.depth_test ? ETR_TEXTURE_GOURAUD_ALPHA : ETR_TEXTURE_GOURAUD_ALPHA_NOZ; + } + else + { + //fall back to EMT_TRANSPARENT_VERTEX_ALPHA + shader = ETR_TEXTURE_GOURAUD_VERTEX_ALPHA; + } + break; + + case EMT_TRANSPARENT_ADD_COLOR: + shader = Material.depth_test ? ETR_TEXTURE_GOURAUD_ADD : ETR_TEXTURE_GOURAUD_ADD_NO_Z; + break; + + case EMT_TRANSPARENT_VERTEX_ALPHA: + shader = ETR_TEXTURE_GOURAUD_VERTEX_ALPHA; + break; + + case EMT_LIGHTMAP: + case EMT_LIGHTMAP_LIGHTING: + if (texture1) + shader = ETR_TEXTURE_GOURAUD_LIGHTMAP_M1; + break; + + case EMT_LIGHTMAP_M2: + case EMT_LIGHTMAP_LIGHTING_M2: + if (texture1) + shader = ETR_TEXTURE_GOURAUD_LIGHTMAP_M2; + break; + + case EMT_LIGHTMAP_LIGHTING_M4: + if (texture1) + shader = ETR_TEXTURE_GOURAUD_LIGHTMAP_M4; + break; + case EMT_LIGHTMAP_M4: + if (texture1) + shader = ETR_TEXTURE_LIGHTMAP_M4; + break; + + case EMT_LIGHTMAP_ADD: + if (texture1) + shader = ETR_TEXTURE_GOURAUD_LIGHTMAP_ADD; + break; + + case EMT_DETAIL_MAP: + if (texture1) + shader = ETR_TEXTURE_GOURAUD_DETAIL_MAP; + break; + + case EMT_SPHERE_MAP: + flag[ETS_TEXTURE_0] |= ETF_TEXGEN_CAMERA_SPHERE; + EyeSpace.TL_Flag |= TL_TEXTURE_TRANSFORM; + break; + case EMT_REFLECTION_2_LAYER: + case EMT_TRANSPARENT_REFLECTION_2_LAYER: + if (texture1) + { + shader = ETR_TRANSPARENT_REFLECTION_2_LAYER; + flag[ETS_TEXTURE_1] |= ETF_TEXGEN_CAMERA_REFLECTION; + EyeSpace.TL_Flag |= TL_TEXTURE_TRANSFORM; + } + break; + + case EMT_NORMAL_MAP_SOLID: + case EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR: + case EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA: + if (texture1) + { + shader = ETR_NORMAL_MAP_SOLID; + EyeSpace.TL_Flag |= TL_TEXTURE_TRANSFORM | TL_LIGHT0_IS_NORMAL_MAP; + } + break; + case EMT_PARALLAX_MAP_SOLID: + case EMT_PARALLAX_MAP_TRANSPARENT_ADD_COLOR: + case EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA: + if (texture1) + { + shader = ETR_NORMAL_MAP_SOLID; + EyeSpace.TL_Flag |= TL_TEXTURE_TRANSFORM | TL_LIGHT0_IS_NORMAL_MAP; + } + break; + + default: + break; + + } + + if (!texture0) + { + shader = Material.depth_test ? ETR_GOURAUD : + shader == ETR_TEXTURE_GOURAUD_VERTEX_ALPHA ? + ETR_GOURAUD_ALPHA_NOZ: // 2D Gradient + ETR_GOURAUD_NOZ; + + shader = ETR_COLOR; + } + + if (in.Wireframe) + { + IBurningShader* candidate = BurningShader[shader]; + if (!candidate || (candidate && !candidate->canWireFrame())) + { + shader = ETR_TEXTURE_GOURAUD_WIRE; + } + } + + if (in.PointCloud) + { + IBurningShader* candidate = BurningShader[shader]; + if (!candidate || (candidate && !candidate->canPointCloud())) + { + shader = ETR_TEXTURE_GOURAUD_WIRE; + } + } + + //shader = ETR_REFERENCE; + + // switchToTriangleRenderer + CurrentShader = BurningShader[shader]; + if (CurrentShader) + { + CurrentShader->setTLFlag(EyeSpace.TL_Flag); + if (EyeSpace.TL_Flag & TL_FOG) CurrentShader->setFog(FogColor); + if (EyeSpace.TL_Flag & TL_SCISSOR) CurrentShader->setScissor(Scissor); + CurrentShader->setRenderTarget(RenderTargetSurface, ViewPort); + CurrentShader->OnSetMaterial(Material); + CurrentShader->pushEdgeTest(in.Wireframe, in.PointCloud, 0); + } -/*! - Camera Position in World Space +/* + mi = (u32)Material.org.MaterialType; + if (mi < MaterialRenderers.size()) + MaterialRenderers[mi].Renderer->OnRender(this, (video::E_VERTEX_TYPE)VertexCache.vType); */ -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; } -void CBurningVideoDriver::getLightPosObjectSpace () -{ - if ( TransformationFlag[ETS_WORLD] & ETF_IDENTITY ) - { - Transformation[ETS_WORLD_INVERSE] = Transformation[ETS_WORLD]; - TransformationFlag[ETS_WORLD_INVERSE] |= ETF_IDENTITY; - } - else - { - Transformation[ETS_WORLD].getInverse ( Transformation[ETS_WORLD_INVERSE] ); - TransformationFlag[ETS_WORLD_INVERSE] &= ~ETF_IDENTITY; - } - - for ( u32 i = 0; i < 1 && i < LightSpace.Light.size(); ++i ) - { - SBurningShaderLight &l = LightSpace.Light[i]; - - Transformation[ETS_WORLD_INVERSE].transformVec3 ( &l.pos_objectspace.x, &l.pos.x ); - } -} - - -#ifdef SOFTWARE_DRIVER_2_LIGHTING //! Sets the fog mode. void CBurningVideoDriver::setFog(SColor color, E_FOG_TYPE fogType, f32 start, f32 end, f32 density, bool pixelFog, bool rangeFog) { CNullDriver::setFog(color, fogType, start, end, density, pixelFog, rangeFog); - LightSpace.FogColor.setA8R8G8B8 ( color.color ); + + EyeSpace.fog_scale = reciprocal_zero2(FogEnd - FogStart); } + + +#if defined(SOFTWARE_DRIVER_2_LIGHTING) && BURNING_MATERIAL_MAX_COLORS > 0 + + /*! applies lighting model */ -void CBurningVideoDriver::lightVertex ( s4DVertex *dest, u32 vertexargb ) +void CBurningVideoDriver::lightVertex_eye(s4DVertex *dest, u32 vertexargb) { - sVec3 dColor; + //gl_FrontLightModelProduct.sceneColor = gl_FrontMaterial.emission + gl_FrontMaterial.ambient * gl_LightModel.ambient - dColor = LightSpace.Global_AmbientLight; - dColor.add ( Material.EmissiveColor ); - - if ( Lights.size () == 0 ) - { - dColor.saturate( dest->Color[0], vertexargb); - return; - } - - sVec3 ambient; - sVec3 diffuse; - sVec3 specular; + sVec3Color ambient; + sVec3Color diffuse; + sVec3Color specular; // the universe started in darkness.. - ambient.set ( 0.f, 0.f, 0.f ); - diffuse.set ( 0.f, 0.f, 0.f ); - specular.set ( 0.f, 0.f, 0.f ); + ambient = EyeSpace.Global_AmbientLight; + diffuse.set(0.f); + specular.set(0.f); u32 i; f32 dot; - f32 len; + f32 distance; f32 attenuation; sVec4 vp; // unit vector vertex to light sVec4 lightHalf; // blinn-phong reflection - for ( i = 0; i!= LightSpace.Light.size (); ++i ) - { - const SBurningShaderLight &light = LightSpace.Light[i]; + f32 spotDot; // cos of angle between spotlight and point on surface - if ( !light.LightIsOn ) + for (i = 0; i < EyeSpace.Light.size(); ++i) + { + const SBurningShaderLight& light = EyeSpace.Light[i]; + if (!light.LightIsOn) continue; - // accumulate ambient - ambient.add ( light.AmbientColor ); - - switch ( light.Type ) + switch (light.Type) { - case video::ELT_SPOT: - case video::ELT_POINT: - // surface to light - vp.x = light.pos.x - LightSpace.vertex.x; - vp.y = light.pos.y - LightSpace.vertex.y; - vp.z = light.pos.z - LightSpace.vertex.z; - //vp.x = light.pos_objectspace.x - LightSpace.vertex.x; - //vp.y = light.pos_objectspace.y - LightSpace.vertex.x; - //vp.z = light.pos_objectspace.z - LightSpace.vertex.x; + case ELT_DIRECTIONAL: - len = vp.get_length_xyz_square(); - if ( light.radius < len ) - continue; + //angle between normal and light vector + dot = EyeSpace.normal.dot_xyz(light.spotDirection4); - len = core::reciprocal_squareroot ( len ); + // accumulate ambient + ambient.add_rgb(light.AmbientColor); - // build diffuse reflection + // diffuse component + if (dot > 0.f) + diffuse.mad_rgb(light.DiffuseColor, dot); + break; - //angle between normal and light vector - vp.mul ( len ); - dot = LightSpace.normal.dot_xyz ( vp ); - if ( dot < 0.f ) - continue; + case ELT_POINT: + // surface to light + vp.x = light.pos4.x - EyeSpace.vertex.x; + vp.y = light.pos4.y - EyeSpace.vertex.y; + vp.z = light.pos4.z - EyeSpace.vertex.z; - attenuation = light.constantAttenuation + ( 1.f - ( len * light.linearAttenuation ) ); + distance = vp.length_xyz(); - // diffuse component - diffuse.mulAdd ( light.DiffuseColor, 3.f * dot * attenuation ); + attenuation = light.constantAttenuation + + light.linearAttenuation * distance + + light.quadraticAttenuation * (distance * distance); + attenuation = reciprocal_one(attenuation); - if ( !(LightSpace.Flags & SPECULAR) ) - continue; + //att = clamp(1.0 - dist/radius, 0.0, 1.0); att *= att - // build specular - // surface to view - 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(); + // accumulate ambient + ambient.mad_rgb(light.AmbientColor, attenuation); - // specular - dot = LightSpace.normal.dot_xyz ( lightHalf ); - if ( dot < 0.f ) - continue; + // build diffuse reflection - //specular += light.SpecularColor * ( powf ( Material.org.Shininess ,dot ) * attenuation ); - specular.mulAdd ( light.SpecularColor, dot * attenuation ); - break; + //angle between normal and light vector + vp.mul_xyz(reciprocal_zero(distance)); //normalize + dot = EyeSpace.normal.dot_xyz(vp); + if (dot <= 0.f) continue; - case video::ELT_DIRECTIONAL: + // diffuse component + diffuse.mad_rgb(light.DiffuseColor, dot * attenuation); - //angle between normal and light vector - dot = LightSpace.normal.dot_xyz ( light.pos ); - if ( dot < 0.f ) - continue; + if (!(EyeSpace.TL_Flag & TL_SPECULAR)) + continue; - // diffuse component - diffuse.mulAdd ( light.DiffuseColor, dot ); - break; - default: - break; + lightHalf.x = vp.x + 0.f; // EyeSpace.cam_eye_pos.x; + lightHalf.y = vp.y + 0.f; // EyeSpace.cam_eye_pos.y; + lightHalf.z = vp.z - 1.f; // EyeSpace.cam_eye_pos.z; + lightHalf.normalize_dir_xyz(); + + //specular += light.SpecularColor * pow(max(dot(Eyespace.normal,lighthalf),0,Material.org.Shininess)*attenuation + specular.mad_rgb(light.SpecularColor, + powf_limit(EyeSpace.normal.dot_xyz(lightHalf), Material.org.Shininess)*attenuation + ); + break; + + case ELT_SPOT: + // surface to light + vp.x = light.pos4.x - EyeSpace.vertex.x; + vp.y = light.pos4.y - EyeSpace.vertex.y; + vp.z = light.pos4.z - EyeSpace.vertex.z; + + distance = vp.length_xyz(); + + //normalize + vp.mul_xyz(reciprocal_zero(distance)); + + // point on surface inside cone of illumination + spotDot = vp.dot_minus_xyz(light.spotDirection4); + if (spotDot < light.spotCosCutoff) + continue; + + attenuation = light.constantAttenuation + + light.linearAttenuation * distance + + light.quadraticAttenuation * distance * distance; + attenuation = reciprocal_one(attenuation); + attenuation *= powf_limit(spotDot, light.spotExponent); + + // accumulate ambient + ambient.mad_rgb(light.AmbientColor, attenuation); + + + // build diffuse reflection + //angle between normal and light vector + dot = EyeSpace.normal.dot_xyz(vp); + if (dot < 0.f) continue; + + // diffuse component + diffuse.mad_rgb(light.DiffuseColor, dot * attenuation); + + if (!(EyeSpace.TL_Flag & TL_SPECULAR)) + continue; + + lightHalf.x = vp.x + 0.f; // EyeSpace.cam_eye_pos.x; + lightHalf.y = vp.y + 0.f; // EyeSpace.cam_eye_pos.y; + lightHalf.z = vp.z - 1.f; // EyeSpace.cam_eye_pos.z; + lightHalf.normalize_dir_xyz(); + + //specular += light.SpecularColor * pow(max(dot(Eyespace.normal,lighthalf),0,Material.org.Shininess)*attenuation + specular.mad_rgb(light.SpecularColor, + powf_limit(EyeSpace.normal.dot_xyz(lightHalf), Material.org.Shininess)*attenuation + ); + break; + + default: + break; } } // sum up lights - dColor.mulAdd (ambient, Material.AmbientColor ); - dColor.mulAdd (diffuse, Material.DiffuseColor); - dColor.mulAdd (specular, Material.SpecularColor); + sVec3Color dColor; + dColor.set(0.f); + dColor.mad_rgbv(diffuse, Material.DiffuseColor); + + //diffuse * vertex color. + //has to move to shader (for vertex color only this will fit [except clamping]) + + sVec3Color c; + c.setA8R8G8B8(vertexargb); + dColor.r *= c.r; + dColor.g *= c.g; + dColor.b *= c.b; + + //separate specular +#if defined(SOFTWARE_DRIVER_2_USE_SEPARATE_SPECULAR_COLOR) + if ((VertexCache.vSize[VertexCache.vType].Format & VERTEX4D_FORMAT_COLOR_2_FOG)) + { + specular.sat_xyz(dest->Color[1], Material.SpecularColor); + } + else + if ( !(EyeSpace.TL_Flag & TL_LIGHT0_IS_NORMAL_MAP) && + (VertexCache.vSize[VertexCache.vType].Format & VERTEX4D_FORMAT_MASK_LIGHT) + ) + { + specular.sat_xyz(dest->LightTangent[0], Material.SpecularColor); + } + else +#endif + { + dColor.mad_rgbv(specular, Material.SpecularColor); + } + + + dColor.mad_rgbv(ambient, Material.AmbientColor); + dColor.add_rgb(Material.EmissiveColor); + + + dColor.sat(dest->Color[0], vertexargb); - dColor.saturate ( dest->Color[0], vertexargb ); } #endif +CImage* getImage(const video::ITexture* texture) +{ + if (!texture) return 0; + + CImage* img = 0; + switch (texture->getDriverType()) + { + case EDT_BURNINGSVIDEO: + img = ((CSoftwareTexture2*)texture)->getImage(); + break; + case EDT_SOFTWARE: + img = ((CSoftwareTexture*)texture)->getImage(); + break; + default: + os::Printer::log("Fatal Error: Tried to copy from a surface not owned by this driver.", ELL_ERROR); + break; + } + return img; +} + +/* + draw2DImage with single color scales into destination quad & cliprect(more like viewport) + draw2DImage with 4 color scales on destination and cliprect is scissor +*/ + +static const u16 quad_triangle_indexList[6] = { 0,1,2,0,2,3 }; + + +#if defined(SOFTWARE_DRIVER_2_2D_AS_2D) //! draws an 2d image, using a color (if color is other then Color(255,255,255,255)) and the alpha channel of the texture if wanted. void CBurningVideoDriver::draw2DImage(const video::ITexture* texture, const core::position2d& destPos, - const core::rect& sourceRect, - const core::rect* clipRect, SColor color, - bool useAlphaChannelOfTexture) + const core::rect& sourceRect, + const core::rect* clipRect, SColor color, + bool useAlphaChannelOfTexture) { if (texture) { + if (texture->getOriginalSize() != texture->getSize()) + { + core::rect destRect(destPos, sourceRect.getSize()); + SColor c4[4] = { color,color,color,color }; + draw2DImage(texture, destRect, sourceRect, clipRect, c4, useAlphaChannelOfTexture); + return; + } + if (texture->getDriverType() != EDT_BURNINGSVIDEO) { os::Printer::log("Fatal Error: Tried to copy from a surface not owned by this driver.", ELL_ERROR); return; } -#if 0 - // 2d methods don't use viewPort - core::position2di dest = destPos; - core::recti clip=ViewPort; - if (ViewPort.getSize().Width != ScreenSize.Width) - { - dest.X=ViewPort.UpperLeftCorner.X+core::round32_fast(destPos.X*ViewPort.getWidth()/(f32)ScreenSize.Width); - dest.Y=ViewPort.UpperLeftCorner.Y+core::round32_fast(destPos.Y*ViewPort.getHeight()/(f32)ScreenSize.Height); - if (clipRect) - { - clip.constrainTo(*clipRect); - } - clipRect = &clip; - } -#endif if (useAlphaChannelOfTexture) ((CSoftwareTexture2*)texture)->getImage()->copyToWithAlpha( - RenderTargetSurface, destPos, sourceRect, color, clipRect); + RenderTargetSurface, destPos, sourceRect, color, clipRect); else ((CSoftwareTexture2*)texture)->getImage()->copyTo( RenderTargetSurface, destPos, sourceRect, clipRect); @@ -1906,8 +2973,8 @@ void CBurningVideoDriver::draw2DImage(const video::ITexture* texture, const core //! Draws a part of the texture into the rectangle. void CBurningVideoDriver::draw2DImage(const video::ITexture* texture, const core::rect& destRect, - const core::rect& sourceRect, const core::rect* clipRect, - const video::SColor* const colors, bool useAlphaChannelOfTexture) + const core::rect& sourceRect, const core::rect* clipRect, + const video::SColor* const colors, bool useAlphaChannelOfTexture) { if (texture) { @@ -1917,53 +2984,460 @@ void CBurningVideoDriver::draw2DImage(const video::ITexture* texture, const core return; } - if (useAlphaChannelOfTexture) - StretchBlit(BLITTER_TEXTURE_ALPHA_BLEND, RenderTargetSurface, &destRect, &sourceRect, - ((CSoftwareTexture2*)texture)->getImage(), (colors ? colors[0].color : 0)); - else - StretchBlit(BLITTER_TEXTURE, RenderTargetSurface, &destRect, &sourceRect, - ((CSoftwareTexture2*)texture)->getImage(), (colors ? colors[0].color : 0)); + u32 argb = (colors ? colors[0].color : 0xFFFFFFFF); + eBlitter op = useAlphaChannelOfTexture ? + (argb == 0xFFFFFFFF ? BLITTER_TEXTURE_ALPHA_BLEND : BLITTER_TEXTURE_ALPHA_COLOR_BLEND) : BLITTER_TEXTURE; + + StretchBlit(op, RenderTargetSurface, clipRect, &destRect, + ((CSoftwareTexture2*)texture)->getImage(), &sourceRect, &texture->getOriginalSize(), argb); + } } +//!Draws an 2d rectangle with a gradient. +void CBurningVideoDriver::draw2DRectangle(const core::rect& position, + SColor colorLeftUp, SColor colorRightUp, SColor colorLeftDown, SColor colorRightDown, + const core::rect* clip) +{ + core::rect p(position); + if (clip) p.clipAgainst(*clip); + if (p.isValid()) drawRectangle(RenderTargetSurface, p, colorLeftUp); +} + +#endif //defined(SOFTWARE_DRIVER_2_2D_AS_2D) + + + + + +#if 0 +void transform_for_BlitJob2D( SBlitJob& out, + const S3DVertex quad2DVertices[4], const core::dimension2d& renderTargetSize, + CBurningVideoDriver* driver +) +{ + //assume. z = 0.f, w = 1.f + //MVP 2D + core::matrix4 m; + m.buildProjectionMatrixOrthoLH(f32(renderTargetSize.Width), f32(-(s32)(renderTargetSize.Height)), -1.0f, 1.0f); + m.setTranslation(core::vector3df(-1.f, 1.f, 0)); + + //setTransform(ETS_WORLD, m); + //m.setTranslation(core::vector3df(0.375f, 0.375f, 0.0f)); + //setTransform(ETS_VIEW, m); + + s4DVertexPair v[4*sizeof_s4DVertexPairRel]; + for (int i = 0; i < 4; ++i) + { + m.transformVect(&v[s4DVertex_ofs(i)].Pos.x, quad2DVertices[i].Pos); + v[s4DVertex_ofs(i)].Tex[0].x = quad2DVertices[i].TCoords.X; + v[s4DVertex_ofs(i)].Tex[0].y = quad2DVertices[i].TCoords.Y; + v[s4DVertex_ofs(i)].Color[0].setA8R8G8B8(quad2DVertices[i].Color.color); + v[s4DVertex_ofs(i)].flag = VERTEX4D_FORMAT_TEXTURE_1 | VERTEX4D_FORMAT_COLOR_1; + v[s4DVertex_ofs(i)].flag |= clipToFrustumTest(v + i); + } + + size_t vOut = driver->clipToFrustum(4); + + struct s2DVertex + { + union + { + struct { + f32 x, y; + f32 u, v; + f32 a, r, g, b; + }; + f32 attr[8]; + }; + + // f = a * t + b * ( 1 - t ) + void interpolate(const s2DVertex& b, const s2DVertex& a, const f32 t) + { + for (int i = 0; i < 8; ++i) + { + attr[i] = b.attr[i] + ((a.attr[i] - b.attr[i]) * t); + } + } + + }; + + // 0 5 + f32 m2[2]; + m2[0] = renderTargetSize.Width ? 2.f / renderTargetSize.Width : 0.f; + m2[1] = renderTargetSize.Height ? -2.f / renderTargetSize.Height : 0.f; + + s2DVertex p[4]; + for (int i = 0; i < 4; ++i) + { + p[i].x = quad2DVertices[i].Pos.X*m2[0] - 1.f; + p[i].y = quad2DVertices[i].Pos.Y*m2[1] + 1.f; + p[i].u = quad2DVertices[i].TCoords.X; + p[i].v = quad2DVertices[i].TCoords.Y; + + p[i].a = quad2DVertices[i].Color.getAlpha() * (1.f / 255.f); + p[i].r = quad2DVertices[i].Color.getRed() * (1.f / 255.f); + p[i].g = quad2DVertices[i].Color.getBlue() * (1.f / 255.f); + p[i].b = quad2DVertices[i].Color.getGreen() * (1.f / 255.f); + + } + +} +#endif + + +//! Enable the 2d override material +void CBurningVideoDriver::enableMaterial2D(bool enable) +{ + CNullDriver::enableMaterial2D(enable); + burning_setbit(TransformationFlag[1][ETS_PROJECTION], 0, ETF_VALID); +} + +size_t compare_2d_material(const SMaterial& a, const SMaterial& b) +{ + size_t flag = 0; + flag |= a.MaterialType == b.MaterialType ? 0 : 1; + flag |= a.ZBuffer == b.ZBuffer ? 0 : 2; + flag |= a.TextureLayer[0].Texture == b.TextureLayer[0].Texture ? 0 : 4; + flag |= a.TextureLayer[0].BilinearFilter == b.TextureLayer[0].BilinearFilter ? 0 : 8; + flag |= a.MaterialTypeParam == b.MaterialTypeParam ? 0 : 16; + if (flag) return flag; + + flag |= a.TextureLayer[1].Texture == b.TextureLayer[1].Texture ? 0 : 32; + flag |= a.ZWriteEnable == b.ZWriteEnable ? 0 : 64; + + return flag; +} + +void CBurningVideoDriver::setRenderStates2DMode(const video::SColor& color, video::ITexture* texture, bool useAlphaChannelOfTexture) +{ + //save current 3D Material + //Material.save3D = Material.org; + + //build new 2D Material + + bool vertexAlpha = color.getAlpha() < 255; + + //2D uses textureAlpa*vertexAlpha 3D not.. + if (useAlphaChannelOfTexture && texture && texture->hasAlpha()) + { + Material.mat2D.MaterialType = EMT_TRANSPARENT_ALPHA_CHANNEL; + } + else if (vertexAlpha) + { + Material.mat2D.MaterialType = EMT_TRANSPARENT_VERTEX_ALPHA; + } + else + { + Material.mat2D.MaterialType = EMT_SOLID; + } + + Material.mat2D.ZBuffer = ECFN_DISABLED; + Material.mat2D.ZWriteEnable = EZW_OFF; + Material.mat2D.Lighting = false; + + Material.mat2D.setTexture(0, (video::ITexture*)texture); + + //used for text. so stay as sharp as possible (like HW Driver) + bool mip = false; + + const SMaterial& currentMaterial = (!OverrideMaterial2DEnabled) ? InitMaterial2D : OverrideMaterial2D; + mip = currentMaterial.TextureLayer[0].BilinearFilter; + + Material.mat2D.setFlag(video::EMF_BILINEAR_FILTER, mip); + + + //switch to 2D Matrix Stack [ Material set Texture Matrix ] + TransformationStack = 1; + + //2D GUI Matrix + if (!(TransformationFlag[TransformationStack][ETS_PROJECTION] & ETF_VALID)) + { + const core::dimension2d& renderTargetSize = getCurrentRenderTargetSize(); + core::matrix4 m(core::matrix4::EM4CONST_NOTHING); + m.buildProjectionMatrixOrthoLH(f32(renderTargetSize.Width), f32(-(s32)(renderTargetSize.Height)), -1.0f, 1.0f); + m.setTranslation(core::vector3df(-1.f, 1.f, 0)); + setTransform(ETS_PROJECTION, m); + + m.makeIdentity(); + setTransform(ETS_WORLD, m); + + if ( mip ) m.setTranslation(core::vector3df(0.375f, 0.375f, 0.0f)); + + setTransform(ETS_VIEW, m); + + buildNDCToDCMatrix(Transformation_ETS_CLIPSCALE[TransformationStack], ViewPort, mip ? -0.187f : 0.f); + + } + + //compare + if (compare_2d_material(Material.org,Material.mat2D)) + { + setMaterial(Material.mat2D); + } + if (CurrentShader) + { + CurrentShader->setPrimitiveColor(color.color); + } + +} + +void CBurningVideoDriver::setRenderStates3DMode() +{ + //restoreRenderStates3DMode + + //setMaterial(Material.save3D); + //switch to 3D Matrix Stack + TransformationStack = 0; +} + +//! draws a vertex primitive list in 2d +void CBurningVideoDriver::draw2DVertexPrimitiveList(const void* vertices, u32 vertexCount, + const void* indexList, u32 primitiveCount, + E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) +{ + if (!checkPrimitiveCount(primitiveCount)) + return; + + CNullDriver::draw2DVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType, iType); + + bool useAlphaChannelOfTexture = false; + video::SColor color(0xFFFFFFFF); + switch (Material.org.MaterialType) + { + case EMT_TRANSPARENT_ALPHA_CHANNEL: + useAlphaChannelOfTexture = true; + break; + case EMT_TRANSPARENT_VERTEX_ALPHA: + color.setAlpha(127); + break; + default: + break; + } + setRenderStates2DMode(color, Material.org.getTexture(0), useAlphaChannelOfTexture); + + drawVertexPrimitiveList(vertices, vertexCount, + indexList, primitiveCount, + vType, pType, iType); + + setRenderStates3DMode(); + +} + +//setup a quad +#if defined(SOFTWARE_DRIVER_2_2D_AS_3D) + +//! draws an 2d image, using a color (if color is other then Color(255,255,255,255)) and the alpha channel of the texture if wanted. +void CBurningVideoDriver::draw2DImage(const video::ITexture* texture, const core::position2d& destPos, + const core::rect& sourceRect, + const core::rect* clipRect, SColor color, + bool useAlphaChannelOfTexture) +{ + if (!texture) + return; + + if (!sourceRect.isValid()) + return; + + // clip these coordinates + core::rect targetRect(destPos, sourceRect.getSize()); + if (clipRect) + { + targetRect.clipAgainst(*clipRect); + if (targetRect.getWidth() < 0 || targetRect.getHeight() < 0) + return; + } + + const core::dimension2d& renderTargetSize = getCurrentRenderTargetSize(); + targetRect.clipAgainst(core::rect(0, 0, (s32)renderTargetSize.Width, (s32)renderTargetSize.Height)); + if (targetRect.getWidth() < 0 || targetRect.getHeight() < 0) + return; + + // ok, we've clipped everything. + // now draw it. + const core::dimension2d sourceSize(targetRect.getSize()); + const core::position2d sourcePos(sourceRect.UpperLeftCorner + (targetRect.UpperLeftCorner - destPos)); + + const core::dimension2d& tex_orgsize = texture->getOriginalSize(); + const f32 invW = 1.f / static_cast(tex_orgsize.Width); + const f32 invH = 1.f / static_cast(tex_orgsize.Height); + const core::rect tcoords( + sourcePos.X * invW, + sourcePos.Y * invH, + (sourcePos.X + sourceSize.Width) * invW, + (sourcePos.Y + sourceSize.Height) * invH); + + + Quad2DVertices[0].Color = color; + Quad2DVertices[1].Color = color; + Quad2DVertices[2].Color = color; + Quad2DVertices[3].Color = color; + + Quad2DVertices[0].Pos = core::vector3df((f32)targetRect.UpperLeftCorner.X, (f32)targetRect.UpperLeftCorner.Y, 0.0f); + Quad2DVertices[1].Pos = core::vector3df((f32)targetRect.LowerRightCorner.X, (f32)targetRect.UpperLeftCorner.Y, 0.0f); + Quad2DVertices[2].Pos = core::vector3df((f32)targetRect.LowerRightCorner.X, (f32)targetRect.LowerRightCorner.Y, 0.0f); + Quad2DVertices[3].Pos = core::vector3df((f32)targetRect.UpperLeftCorner.X, (f32)targetRect.LowerRightCorner.Y, 0.0f); + + Quad2DVertices[0].TCoords = core::vector2df(tcoords.UpperLeftCorner.X, tcoords.UpperLeftCorner.Y); + Quad2DVertices[1].TCoords = core::vector2df(tcoords.LowerRightCorner.X, tcoords.UpperLeftCorner.Y); + Quad2DVertices[2].TCoords = core::vector2df(tcoords.LowerRightCorner.X, tcoords.LowerRightCorner.Y); + Quad2DVertices[3].TCoords = core::vector2df(tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y); + + //SBlitJob job; + //transform_for_BlitJob2D(job, Quad2DVertices, renderTargetSize,this); + + setRenderStates2DMode(color, (video::ITexture*) texture, useAlphaChannelOfTexture); + + drawVertexPrimitiveList(Quad2DVertices, 4, + quad_triangle_indexList, 2, + EVT_STANDARD, scene::EPT_TRIANGLES, EIT_16BIT); + + setRenderStates3DMode(); + +} + + +//! Draws a part of the texture into the rectangle. +void CBurningVideoDriver::draw2DImage(const video::ITexture* texture, const core::rect& destRect, + const core::rect& sourceRect, const core::rect* clipRect, + const video::SColor* const colors, bool useAlphaChannelOfTexture) +{ + const core::dimension2d& st = texture->getOriginalSize(); + const f32 invW = 1.f / static_cast(st.Width); + const f32 invH = 1.f / static_cast(st.Height); + const core::rect tcoords( + sourceRect.UpperLeftCorner.X * invW, + sourceRect.UpperLeftCorner.Y * invH, + sourceRect.LowerRightCorner.X * invW, + sourceRect.LowerRightCorner.Y *invH); + + const video::SColor temp[4] = + { + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF + }; + + const video::SColor* const useColor = colors ? colors : temp; + + + Quad2DVertices[0].Color = useColor[0]; + Quad2DVertices[1].Color = useColor[3]; + Quad2DVertices[2].Color = useColor[2]; + Quad2DVertices[3].Color = useColor[1]; + + Quad2DVertices[0].Pos = core::vector3df((f32)destRect.UpperLeftCorner.X, (f32)destRect.UpperLeftCorner.Y, 0.0f); + Quad2DVertices[1].Pos = core::vector3df((f32)destRect.LowerRightCorner.X, (f32)destRect.UpperLeftCorner.Y, 0.0f); + Quad2DVertices[2].Pos = core::vector3df((f32)destRect.LowerRightCorner.X, (f32)destRect.LowerRightCorner.Y, 0.0f); + Quad2DVertices[3].Pos = core::vector3df((f32)destRect.UpperLeftCorner.X, (f32)destRect.LowerRightCorner.Y, 0.0f); + + Quad2DVertices[0].TCoords = core::vector2df(tcoords.UpperLeftCorner.X, tcoords.UpperLeftCorner.Y); + Quad2DVertices[1].TCoords = core::vector2df(tcoords.LowerRightCorner.X, tcoords.UpperLeftCorner.Y); + Quad2DVertices[2].TCoords = core::vector2df(tcoords.LowerRightCorner.X, tcoords.LowerRightCorner.Y); + Quad2DVertices[3].TCoords = core::vector2df(tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y); + + + const core::dimension2d& renderTargetSize = getCurrentRenderTargetSize(); + + if (clipRect) + { + if (!clipRect->isValid()) + return; + + //glEnable(GL_SCISSOR_TEST); + EyeSpace.TL_Flag |= TL_SCISSOR; + setScissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height - clipRect->LowerRightCorner.Y, + clipRect->getWidth(), clipRect->getHeight()); + } + + video::SColor alphaTest; + alphaTest.color = useColor[0].color & useColor[0].color & useColor[0].color & useColor[0].color; + + //SBlitJob job; + //transform_for_BlitJob2D(job, Quad2DVertices, renderTargetSize, this); + + setRenderStates2DMode(alphaTest, (video::ITexture*) texture, useAlphaChannelOfTexture); + + drawVertexPrimitiveList(Quad2DVertices, 4, + quad_triangle_indexList, 2, + EVT_STANDARD, scene::EPT_TRIANGLES, EIT_16BIT); + + + if (clipRect) + EyeSpace.TL_Flag &= ~TL_SCISSOR; + + setRenderStates3DMode(); + + +} + + +//!Draws an 2d rectangle with a gradient. +void CBurningVideoDriver::draw2DRectangle(const core::rect& position, + SColor colorLeftUp, SColor colorRightUp, SColor colorLeftDown, SColor colorRightDown, + const core::rect* clip) +{ + core::rect pos = position; + + if (clip) + pos.clipAgainst(*clip); + + if (!pos.isValid()) + return; + + Quad2DVertices[0].Color = colorLeftUp; + Quad2DVertices[1].Color = colorRightUp; + Quad2DVertices[2].Color = colorRightDown; + Quad2DVertices[3].Color = colorLeftDown; + + Quad2DVertices[0].Pos = core::vector3df((f32)pos.UpperLeftCorner.X, (f32)pos.UpperLeftCorner.Y, 0.0f); + Quad2DVertices[1].Pos = core::vector3df((f32)pos.LowerRightCorner.X, (f32)pos.UpperLeftCorner.Y, 0.0f); + Quad2DVertices[2].Pos = core::vector3df((f32)pos.LowerRightCorner.X, (f32)pos.LowerRightCorner.Y, 0.0f); + Quad2DVertices[3].Pos = core::vector3df((f32)pos.UpperLeftCorner.X, (f32)pos.LowerRightCorner.Y, 0.0f); + + Quad2DVertices[0].TCoords.X = 0.f; + Quad2DVertices[0].TCoords.Y = 0.f; + Quad2DVertices[1].TCoords.X = 0.f; + Quad2DVertices[1].TCoords.Y = 0.f; + Quad2DVertices[2].TCoords.X = 0.f; + Quad2DVertices[3].TCoords.Y = 0.f; + Quad2DVertices[3].TCoords.X = 0.f; + Quad2DVertices[3].TCoords.Y = 0.f; + + + video::SColor alphaTest; + alphaTest.color = colorLeftUp.color & colorRightUp.color & colorRightDown.color & colorLeftDown.color; + setRenderStates2DMode(alphaTest, 0, 0); + + drawVertexPrimitiveList(Quad2DVertices, 4, + quad_triangle_indexList, 2, + EVT_STANDARD, scene::EPT_TRIANGLES, EIT_16BIT); + + setRenderStates3DMode(); + +} + + +#endif // SOFTWARE_DRIVER_2_2D_AS_3D + + + + + //! Draws a 2d line. void CBurningVideoDriver::draw2DLine(const core::position2d& start, const core::position2d& end, SColor color) { - drawLine(BackBuffer, start, end, color ); + drawLine(RenderTargetSurface, start, end, color ); } //! Draws a pixel void CBurningVideoDriver::drawPixel(u32 x, u32 y, const SColor & color) { - BackBuffer->setPixel(x, y, color, true); -} - - -//! draw an 2d rectangle -void CBurningVideoDriver::draw2DRectangle(SColor color, const core::rect& pos, - const core::rect* clip) -{ - if (clip) - { - core::rect p(pos); - - p.clipAgainst(*clip); - - if(!p.isValid()) - return; - - drawRectangle(BackBuffer, p, color); - } - else - { - if(!pos.isValid()) - return; - - drawRectangle(BackBuffer, pos, color); - } + RenderTargetSurface->setPixel(x, y, color, true); } @@ -1973,13 +3447,13 @@ void CBurningVideoDriver::OnResize(const core::dimension2d& size) { // make sure width and height are multiples of 2 core::dimension2d realSize(size); - +/* if (realSize.Width % 2) realSize.Width += 1; if (realSize.Height % 2) realSize.Height += 1; - +*/ if (ScreenSize != realSize) { if (ViewPort.getWidth() == (s32)ScreenSize.Width && @@ -2012,164 +3486,73 @@ const core::dimension2d& CBurningVideoDriver::getCurrentRenderTargetSize() } -//!Draws an 2d rectangle with a gradient. -void CBurningVideoDriver::draw2DRectangle(const core::rect& position, - SColor colorLeftUp, SColor colorRightUp, SColor colorLeftDown, SColor colorRightDown, - const core::rect* clip) -{ -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR - - core::rect pos = position; - - if (clip) - pos.clipAgainst(*clip); - - if (!pos.isValid()) - return; - - const core::dimension2d renderTargetSize ( ViewPort.getSize() ); - - const s32 xPlus = -(renderTargetSize.Width>>1); - const f32 xFact = 1.0f / (renderTargetSize.Width>>1); - - const s32 yPlus = renderTargetSize.Height-(renderTargetSize.Height>>1); - const f32 yFact = 1.0f / (renderTargetSize.Height>>1); - - // fill VertexCache direct - s4DVertex *v; - - VertexCache.vertexCount = 4; - - VertexCache.info[0].index = 0; - VertexCache.info[1].index = 1; - VertexCache.info[2].index = 2; - VertexCache.info[3].index = 3; - - v = &VertexCache.mem.data [ 0 ]; - - v[0].Pos.set ( (f32)(pos.UpperLeftCorner.X+xPlus) * xFact, (f32)(yPlus-pos.UpperLeftCorner.Y) * yFact, 0.f, 1.f ); - v[0].Color[0].setA8R8G8B8 ( colorLeftUp.color ); - - v[2].Pos.set ( (f32)(pos.LowerRightCorner.X+xPlus) * xFact, (f32)(yPlus- pos.UpperLeftCorner.Y) * yFact, 0.f, 1.f ); - v[2].Color[0].setA8R8G8B8 ( colorRightUp.color ); - - v[4].Pos.set ( (f32)(pos.LowerRightCorner.X+xPlus) * xFact, (f32)(yPlus-pos.LowerRightCorner.Y) * yFact, 0.f ,1.f ); - v[4].Color[0].setA8R8G8B8 ( colorRightDown.color ); - - v[6].Pos.set ( (f32)(pos.UpperLeftCorner.X+xPlus) * xFact, (f32)(yPlus-pos.LowerRightCorner.Y) * yFact, 0.f, 1.f ); - v[6].Color[0].setA8R8G8B8 ( colorLeftDown.color ); - - s32 i; - u32 g; - - for ( i = 0; i!= 8; i += 2 ) - { - v[i + 0].flag = clipToFrustumTest ( v + i ); - v[i + 1].flag = 0; - if ( (v[i].flag & VERTEX4D_INSIDE ) == VERTEX4D_INSIDE ) - { - ndc_2_dc_and_project ( v + i + 1, v + i, 2 ); - } - } - - - IBurningShader * render; - - render = BurningShader [ ETR_GOURAUD_ALPHA_NOZ ]; - render->setRenderTarget(RenderTargetSurface, ViewPort); - - static const s16 indexList[6] = {0,1,2,0,2,3}; - - s4DVertex * face[3]; - - for ( i = 0; i!= 6; i += 3 ) - { - face[0] = VertexCache_getVertex ( indexList [ i + 0 ] ); - face[1] = VertexCache_getVertex ( indexList [ i + 1 ] ); - face[2] = VertexCache_getVertex ( indexList [ i + 2 ] ); - - // test clipping - u32 test = face[0]->flag & face[1]->flag & face[2]->flag & VERTEX4D_INSIDE; - - if ( test == VERTEX4D_INSIDE ) - { - render->drawTriangle ( face[0] + 1, face[1] + 1, face[2] + 1 ); - continue; - } - // Todo: all vertices are clipped in 2d.. - // is this true ? - u32 vOut = 6; - memcpy ( CurrentOut.data + 0, face[0], sizeof ( s4DVertex ) * 2 ); - memcpy ( CurrentOut.data + 2, face[1], sizeof ( s4DVertex ) * 2 ); - memcpy ( CurrentOut.data + 4, face[2], sizeof ( s4DVertex ) * 2 ); - - vOut = clipToFrustum ( CurrentOut.data, Temp.data, 3 ); - if ( vOut < 3 ) - continue; - - vOut <<= 1; - // to DC Space, project homogenous vertex - ndc_2_dc_and_project ( CurrentOut.data + 1, CurrentOut.data, vOut ); - - // re-tesselate ( triangle-fan, 0-1-2,0-2-3.. ) - for ( g = 0; g <= vOut - 6; g += 2 ) - { - // rasterize - render->drawTriangle ( CurrentOut.data + 1, &CurrentOut.data[g + 3], &CurrentOut.data[g + 5] ); - } - - } -#else - draw2DRectangle ( colorLeftUp, position, clip ); -#endif -} - - //! Draws a 3d line. void CBurningVideoDriver::draw3DLine(const core::vector3df& start, - const core::vector3df& end, SColor color) + const core::vector3df& end, SColor color_start) { - Transformation [ ETS_CURRENT].transformVect ( &CurrentOut.data[0].Pos.x, start ); - Transformation [ ETS_CURRENT].transformVect ( &CurrentOut.data[2].Pos.x, end ); + SColor color_end = color_start; - u32 g; - u32 vOut; + VertexCache.primitiveHasVertex = 2; + VertexCache.vType = E4VT_LINE; - // no clipping flags - for ( g = 0; g != CurrentOut.ElementSize; ++g ) - { - CurrentOut.data[g].flag = 0; - Temp.data[g].flag = 0; - } + s4DVertex* v = Clipper.data; - // vertices count per line - vOut = clipToFrustum ( CurrentOut.data, Temp.data, 2 ); - if ( vOut < 2 ) - return; + transform_calc(ETS_PROJ_MODEL_VIEW); + const core::matrix4* matrix = Transformation[TransformationStack]; + matrix[ETS_PROJ_MODEL_VIEW].transformVect ( &v[0].Pos.x, start ); + matrix[ETS_PROJ_MODEL_VIEW].transformVect ( &v[2].Pos.x, end ); - vOut <<= 1; - - IBurningShader * line; - line = BurningShader [ ETR_TEXTURE_GOURAUD_WIRE ]; - line->setRenderTarget(RenderTargetSurface, ViewPort); - - // to DC Space, project homogenous vertex - ndc_2_dc_and_project ( CurrentOut.data + 1, CurrentOut.data, vOut ); - - // unproject vertex color -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR - for ( g = 0; g != vOut; g+= 2 ) - { - CurrentOut.data[ g + 1].Color[0].setA8R8G8B8 ( color.color ); - } +#if BURNING_MATERIAL_MAX_COLORS > 0 + v[0].Color[0].setA8R8G8B8 ( color_start.color ); + v[2].Color[0].setA8R8G8B8 ( color_end.color ); #endif - - for ( g = 0; g <= vOut - 4; g += 2 ) + u32 i; + for (i = 0; i < 4; i += sizeof_s4DVertexPairRel) { - // rasterize - line->drawLine ( CurrentOut.data + 1, CurrentOut.data + g + 3 ); + v[i + 0].flag = (u32)(VertexCache.vSize[VertexCache.vType].Format); + v[i + 1].flag = v[i + 0].flag; } + + + size_t g; + size_t vOut; + + // vertices count per line + vOut = clipToFrustum (VertexCache.primitiveHasVertex); + if ( vOut < VertexCache.primitiveHasVertex) + return; + + vOut *= sizeof_s4DVertexPairRel; + + // to DC Space, project homogenous vertex + ndc_2_dc_and_project ( v + 1, v, vOut ); + + // unproject vertex color +#if 0 +#if BURNING_MATERIAL_MAX_COLORS > 0 + for ( g = 0; g != vOut; g+= 2 ) + { + v[ g + 1].Color[0].setA8R8G8B8 ( color.color ); + } +#endif +#endif + + IBurningShader * shader = 0; + if ( CurrentShader && CurrentShader->canWireFrame() ) shader = CurrentShader; + else shader = BurningShader [ ETR_TEXTURE_GOURAUD_WIRE ]; + shader = BurningShader [ ETR_TEXTURE_GOURAUD_WIRE ]; + + shader->pushEdgeTest(1,0,1); + shader->setRenderTarget(RenderTargetSurface, ViewPort); + + for ( g = 0; g <= vOut - 4; g += sizeof_s4DVertexPairRel) + { + shader->drawLine ( v + 1 + g, v + 1 + g + sizeof_s4DVertexPairRel); + } + + shader->popEdgeTest(); + } @@ -2178,20 +3561,22 @@ void CBurningVideoDriver::draw3DLine(const core::vector3df& start, const wchar_t* CBurningVideoDriver::getName() const { #ifdef BURNINGVIDEO_RENDERER_BEAUTIFUL - return L"Burning's Video 0.49 beautiful"; + return L"Burning's Video 0.51 beautiful"; #elif defined ( BURNINGVIDEO_RENDERER_ULTRA_FAST ) - return L"Burning's Video 0.49 ultra fast"; + return L"Burning's Video 0.51 ultra fast"; #elif defined ( BURNINGVIDEO_RENDERER_FAST ) - return L"Burning's Video 0.49 fast"; + return L"Burning's Video 0.51 fast"; +#elif defined ( BURNINGVIDEO_RENDERER_CE ) + return L"Burning's Video 0.51 CE"; #else - return L"Burning's Video 0.49"; + return L"Burning's Video 0.51"; #endif } //! Returns the graphics card vendor name. core::stringc CBurningVideoDriver::getVendorInfo() { - return "Burning's Video: Ing. Thomas Alten (c) 2006-2015"; + return "Burning's Video: Ing. Thomas Alten (c) 2006-2020"; } @@ -2209,19 +3594,12 @@ ECOLOR_FORMAT CBurningVideoDriver::getColorFormat() const } -//! Returns the transformation set by setTransform -const core::matrix4& CBurningVideoDriver::getTransform(E_TRANSFORMATION_STATE state) const -{ - return Transformation[state]; -} - - //! Creates a render target texture. ITexture* CBurningVideoDriver::addRenderTargetTexture(const core::dimension2d& size, const io::path& name, const ECOLOR_FORMAT format) { IImage* img = createImage(BURNINGSHADER_COLOR_FORMAT, size); - ITexture* tex = new CSoftwareTexture2(img, name, CSoftwareTexture2::IS_RENDERTARGET ); + ITexture* tex = new CSoftwareTexture2(img, name, CSoftwareTexture2::IS_RENDERTARGET,this); img->drop(); addTexture(tex); tex->drop(); @@ -2234,12 +3612,31 @@ void CBurningVideoDriver::clearBuffers(u16 flag, SColor color, f32 depth, u8 ste RenderTargetSurface->fill(color); if ((flag & ECBF_DEPTH) && DepthBuffer) - DepthBuffer->clear(); + DepthBuffer->clear(depth); if ((flag & ECBF_STENCIL) && StencilBuffer) - StencilBuffer->clear(); + StencilBuffer->clear(stencil); } +#if 0 +void CBurningVideoDriver::saveBuffer() +{ + static int shotCount = 0; + char buf[256]; + if (BackBuffer) + { + sprintf(buf, "shot/%04d_b.png", shotCount); + writeImageToFile(BackBuffer, buf); + } + if (StencilBuffer) + { + CImage stencil(ECF_A8R8G8B8, StencilBuffer->getSize(), StencilBuffer->lock(), true, false); + sprintf(buf, "shot/%04d_s.ppm", shotCount); + writeImageToFile(&stencil, buf); + } + shotCount += 1; +} +#endif //! Returns an image created from the last rendered frame. IImage* CBurningVideoDriver::createScreenShot(video::ECOLOR_FORMAT format, video::E_RENDER_TARGET target) @@ -2259,9 +3656,17 @@ IImage* CBurningVideoDriver::createScreenShot(video::ECOLOR_FORMAT format, video ITexture* CBurningVideoDriver::createDeviceDependentTexture(const io::path& name, IImage* image) { - CSoftwareTexture2* texture = new CSoftwareTexture2(image, name, (getTextureCreationFlag(ETCF_CREATE_MIP_MAPS) ? CSoftwareTexture2::GEN_MIPMAP : 0) | - (getTextureCreationFlag(ETCF_ALLOW_NON_POWER_2) ? 0 : CSoftwareTexture2::NP2_SIZE)); + u32 flags = + ((TextureCreationFlags & ETCF_CREATE_MIP_MAPS) ? CSoftwareTexture2::GEN_MIPMAP : 0) + | ((TextureCreationFlags & ETCF_AUTO_GENERATE_MIP_MAPS) ? CSoftwareTexture2::GEN_MIPMAP_AUTO : 0) + | ((TextureCreationFlags & ETCF_ALLOW_NON_POWER_2) ? CSoftwareTexture2::ALLOW_NPOT : 0) +#if defined(IRRLICHT_sRGB) + | ((TextureCreationFlags & ETCF_IMAGE_IS_LINEAR) ? CSoftwareTexture2::IMAGE_IS_LINEAR : 0) + | ((TextureCreationFlags & ETCF_TEXTURE_IS_LINEAR) ? CSoftwareTexture2::TEXTURE_IS_LINEAR : 0) +#endif + ; + CSoftwareTexture2* texture = new CSoftwareTexture2(image, name, flags, this); return texture; } @@ -2275,7 +3680,7 @@ ITexture* CBurningVideoDriver::createDeviceDependentTextureCubemap(const io::pat //! call. u32 CBurningVideoDriver::getMaximalPrimitiveCount() const { - return 0xFFFFFFFF; + return 0x7FFFFFFF; } @@ -2285,58 +3690,61 @@ u32 CBurningVideoDriver::getMaximalPrimitiveCount() const void CBurningVideoDriver::drawStencilShadowVolume(const core::array& triangles, bool zfail, u32 debugDataVisible) { const u32 count = triangles.size(); - IBurningShader *shader = BurningShader [ ETR_STENCIL_SHADOW ]; - - CurrentShader = shader; - shader->setRenderTarget(RenderTargetSurface, ViewPort); + if (!StencilBuffer || !count) + return; Material.org.MaterialType = video::EMT_SOLID; Material.org.Lighting = false; Material.org.ZWriteEnable = video::EZW_OFF; - Material.org.ZBuffer = ECFN_LESSEQUAL; - LightSpace.Flags &= ~VERTEXTRANSFORM; + Material.org.ZBuffer = ECFN_LESS; + CurrentShader = BurningShader[ETR_STENCIL_SHADOW]; + + CurrentShader->setRenderTarget(RenderTargetSurface, ViewPort); + CurrentShader->pushEdgeTest(Material.org.Wireframe, 0,0); + + //setMaterial + EyeSpace.TL_Flag &= ~(TL_TEXTURE_TRANSFORM | TL_LIGHT0_IS_NORMAL_MAP); + CurrentShader->setTLFlag(EyeSpace.TL_Flag); //glStencilMask(~0); //glStencilFunc(GL_ALWAYS, 0, ~0); - if (true)// zpass does not work yet - { - Material.org.BackfaceCulling = true; - Material.org.FrontfaceCulling = false; - shader->setParam ( 0, 0 ); - shader->setParam ( 1, 1 ); - shader->setParam ( 2, 0 ); - drawVertexPrimitiveList (triangles.const_pointer(), count, 0, count/3, (video::E_VERTEX_TYPE) 4, scene::EPT_TRIANGLES, (video::E_INDEX_TYPE) 4 ); - //glStencilOp(GL_KEEP, incr, GL_KEEP); - //glDrawArrays(GL_TRIANGLES,0,count); + //glEnable(GL_DEPTH_CLAMP); + if (zfail) + { Material.org.BackfaceCulling = false; Material.org.FrontfaceCulling = true; - shader->setParam ( 0, 0 ); - shader->setParam ( 1, 2 ); - shader->setParam ( 2, 0 ); - drawVertexPrimitiveList (triangles.const_pointer(), count, 0, count/3, (video::E_VERTEX_TYPE) 4, scene::EPT_TRIANGLES, (video::E_INDEX_TYPE) 4 ); - //glStencilOp(GL_KEEP, decr, GL_KEEP); - //glDrawArrays(GL_TRIANGLES,0,count); + Material.CullFlag = CULL_FRONT | CULL_INVISIBLE; + + CurrentShader->setStencilOp( StencilOp_KEEP, StencilOp_INCR, StencilOp_KEEP); + drawVertexPrimitiveList (triangles.const_pointer(), count, 0, count/3, (video::E_VERTEX_TYPE) E4VT_SHADOW, scene::EPT_TRIANGLES, (video::E_INDEX_TYPE) E4IT_NONE); + + Material.org.BackfaceCulling = true; + Material.org.FrontfaceCulling = false; + Material.CullFlag = CULL_BACK | CULL_INVISIBLE; + + CurrentShader->setStencilOp( StencilOp_KEEP, StencilOp_DECR, StencilOp_KEEP); + drawVertexPrimitiveList (triangles.const_pointer(), count, 0, count/3, (video::E_VERTEX_TYPE) E4VT_SHADOW, scene::EPT_TRIANGLES, (video::E_INDEX_TYPE) E4IT_NONE); } else // zpass { Material.org.BackfaceCulling = true; Material.org.FrontfaceCulling = false; - shader->setParam ( 0, 0 ); - shader->setParam ( 1, 0 ); - shader->setParam ( 2, 1 ); - //glStencilOp(GL_KEEP, GL_KEEP, incr); - //glDrawArrays(GL_TRIANGLES,0,count); + Material.CullFlag = CULL_BACK | CULL_INVISIBLE; + + CurrentShader->setStencilOp( StencilOp_KEEP, StencilOp_KEEP, StencilOp_INCR); + drawVertexPrimitiveList(triangles.const_pointer(), count, 0, count / 3, (video::E_VERTEX_TYPE) E4VT_SHADOW, scene::EPT_TRIANGLES, (video::E_INDEX_TYPE) E4IT_NONE); Material.org.BackfaceCulling = false; Material.org.FrontfaceCulling = true; - shader->setParam ( 0, 0 ); - shader->setParam ( 1, 0 ); - shader->setParam ( 2, 2 ); - //glStencilOp(GL_KEEP, GL_KEEP, decr); - //glDrawArrays(GL_TRIANGLES,0,count); + Material.CullFlag = CULL_FRONT | CULL_INVISIBLE; + + CurrentShader->setStencilOp(StencilOp_KEEP, StencilOp_KEEP, StencilOp_DECR); + drawVertexPrimitiveList(triangles.const_pointer(), count, 0, count / 3, (video::E_VERTEX_TYPE) E4VT_SHADOW, scene::EPT_TRIANGLES, (video::E_INDEX_TYPE) E4IT_NONE); } + //glDisable(GL_DEPTH_CLAMP); + } //! Fills the stencil shadow with color. After the shadow volume has been drawn @@ -2351,30 +3759,44 @@ void CBurningVideoDriver::drawStencilShadow(bool clearStencilBuffer, video::SCol const u32 h = RenderTargetSurface->getDimension().Height; const u32 w = RenderTargetSurface->getDimension().Width; tVideoSample *dst; - u32 *stencil; - u32* const stencilBase=(u32*) StencilBuffer->lock(); + const tStencilSample* stencil; + +#if defined(SOFTWARE_DRIVER_2_32BIT) + const u32 alpha = extractAlpha(leftUpEdge.color); + const u32 src = leftUpEdge.color; +#else + const u16 alpha = extractAlpha( leftUpEdge.color ) >> 3; + const u32 src = video::A8R8G8B8toA1R5G5B5( leftUpEdge.color ); +#endif + for ( u32 y = 0; y < h; ++y ) { dst = (tVideoSample*)RenderTargetSurface->getData() + ( y * w ); - stencil = stencilBase + ( y * w ); + stencil = (tStencilSample*)StencilBuffer->lock() + (y * w); for ( u32 x = 0; x < w; ++x ) { - if ( stencil[x] > 1 ) + if ( stencil[x] ) { - dst[x] = PixelBlend32 ( dst[x], leftUpEdge.color ); +#if defined(SOFTWARE_DRIVER_2_32BIT) + dst[x] = PixelBlend32 ( dst[x], src,alpha ); +#else + dst[x] = PixelBlend16( dst[x], src, alpha ); +#endif } } } - StencilBuffer->clear(); + if ( clearStencilBuffer ) + StencilBuffer->clear(0); } core::dimension2du CBurningVideoDriver::getMaxTextureSize() const { - return core::dimension2du(SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE, SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE); + return core::dimension2du(SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE ? SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE : 1 << 20, + SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE ? SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE : 1 << 20); } bool CBurningVideoDriver::queryTextureFormat(ECOLOR_FORMAT format) const @@ -2384,9 +3806,134 @@ bool CBurningVideoDriver::queryTextureFormat(ECOLOR_FORMAT format) const bool CBurningVideoDriver::needsTransparentRenderPass(const irr::video::SMaterial& material) const { - return CNullDriver::needsTransparentRenderPass(material) || material.isTransparent(); + return CNullDriver::needsTransparentRenderPass(material) || material.isAlphaBlendOperation(); // || material.isTransparent(); } +s32 CBurningVideoDriver::addShaderMaterial(const c8* vertexShaderProgram, + const c8* pixelShaderProgram, + IShaderConstantSetCallBack* callback, + E_MATERIAL_TYPE baseMaterial, + s32 userData) +{ + s32 materialID = -1; + + IBurningShader* shader = new IBurningShader( + this, materialID, + vertexShaderProgram, 0, video::EVST_VS_1_1, + pixelShaderProgram, 0, video::EPST_PS_1_1, + 0, 0, EGST_GS_4_0, + scene::EPT_TRIANGLES, scene::EPT_TRIANGLE_STRIP, 0, + callback, baseMaterial, userData); + + shader->drop(); + + return materialID; +} + +//! Adds a new material renderer to the VideoDriver, based on a high level shading language. +s32 CBurningVideoDriver::addHighLevelShaderMaterial( + const c8* vertexShaderProgram, + const c8* vertexShaderEntryPointName, + E_VERTEX_SHADER_TYPE vsCompileTarget, + const c8* pixelShaderProgram, + const c8* pixelShaderEntryPointName, + E_PIXEL_SHADER_TYPE psCompileTarget, + const c8* geometryShaderProgram, + const c8* geometryShaderEntryPointName, + E_GEOMETRY_SHADER_TYPE gsCompileTarget, + scene::E_PRIMITIVE_TYPE inType, + scene::E_PRIMITIVE_TYPE outType, + u32 verticesOut, + IShaderConstantSetCallBack* callback, + E_MATERIAL_TYPE baseMaterial, + s32 userData + ) +{ + s32 materialID = -1; + + IBurningShader* shader = new IBurningShader( + this, materialID, + vertexShaderProgram, vertexShaderEntryPointName, vsCompileTarget, + pixelShaderProgram, pixelShaderEntryPointName, psCompileTarget, + geometryShaderProgram, geometryShaderEntryPointName, gsCompileTarget, + inType, outType, verticesOut, + callback, baseMaterial, userData); + + shader->drop(); + + return materialID; +} + + +void CBurningVideoDriver::setFallback_Material(E_MATERIAL_TYPE fallback_MaterialType) +{ + //this should be in material.... + Material.Fallback_MaterialType = fallback_MaterialType; +} + +void CBurningVideoDriver::setBasicRenderStates(const SMaterial& material, + const SMaterial& lastMaterial, + bool resetAllRenderstates) +{ + +} + +//! Return an index constant for the vertex shader based on a name. +s32 CBurningVideoDriver::getVertexShaderConstantID(const c8* name) +{ + return -1; +} + +bool CBurningVideoDriver::setVertexShaderConstant(s32 index, const f32* floats, int count) +{ + return true; +} + +bool CBurningVideoDriver::setVertexShaderConstant(s32 index, const s32* ints, int count) +{ + return true; +} + +bool CBurningVideoDriver::setVertexShaderConstant(s32 index, const u32* ints, int count) +{ + return true; +} + +void CBurningVideoDriver::setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) +{ +} + +//! Return an index constant for the pixel shader based on a name. +s32 CBurningVideoDriver::getPixelShaderConstantID(const c8* name) +{ + return -1; +} + +bool CBurningVideoDriver::setPixelShaderConstant(s32 index, const f32* floats, int count) +{ + return false; +} + +bool CBurningVideoDriver::setPixelShaderConstant(s32 index, const s32* ints, int count) +{ + return false; +} + +bool CBurningVideoDriver::setPixelShaderConstant(s32 index, const u32* ints, int count) +{ + return false; +} + +void CBurningVideoDriver::setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount = 1) +{ +} + +//! Get pointer to the IVideoDriver interface +/** \return Pointer to the IVideoDriver interface */ +IVideoDriver* CBurningVideoDriver::getVideoDriver() +{ + return this; +} } // end namespace video } // end namespace irr @@ -2394,41 +3941,6 @@ bool CBurningVideoDriver::needsTransparentRenderPass(const irr::video::SMaterial #endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ -#if defined(_IRR_WINDOWS_) && defined(_IRR_COMPILE_WITH_BURNINGSVIDEO_) - #include - -struct dreadglobal -{ - DWORD dreadid; - HANDLE dread; - irr::video::CBurningVideoDriver *driver; - HANDLE sync; - - const irr::SIrrlichtCreationParameters* params; - irr::io::IFileSystem* io; - irr::video::IImagePresenter* presenter; -}; - -namespace -{ - dreadglobal burning_dread; -} - -DWORD WINAPI dreadFun( void *p) -{ - printf("Hi This is burning dread\n"); - burning_dread.driver = new irr::video::CBurningVideoDriver(*burning_dread.params, burning_dread.io, burning_dread.presenter); - - SetEvent (burning_dread.sync ); - while ( 1 ) - { - Sleep ( 1000 ); - } - return 0; -} - -#endif - namespace irr { namespace video @@ -2438,21 +3950,9 @@ namespace video IVideoDriver* createBurningVideoDriver(const irr::SIrrlichtCreationParameters& params, io::IFileSystem* io, video::IImagePresenter* presenter) { #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ - - #ifdef _IRR_WINDOWS_ - burning_dread.sync = CreateEventA ( 0, 0, 0, "burnevent0" ); - burning_dread.params = ¶ms; - burning_dread.io = io; - burning_dread.presenter = presenter; - burning_dread.dread = CreateThread ( 0, 0, dreadFun, 0, 0, &burning_dread.dreadid ); - WaitForSingleObject (burning_dread.sync, INFINITE ); - return burning_dread.driver; + return new CBurningVideoDriver(params, io, presenter); #else - return new CBurningVideoDriver(params, io, presenter); - #endif - - #else - return 0; + return 0; #endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ } diff --git a/source/Irrlicht/CSoftwareDriver2.h b/source/Irrlicht/CSoftwareDriver2.h index 3e9d2aaf..803deae6 100644 --- a/source/Irrlicht/CSoftwareDriver2.h +++ b/source/Irrlicht/CSoftwareDriver2.h @@ -13,11 +13,12 @@ #include "irrString.h" #include "SIrrCreationParameters.h" + namespace irr { namespace video { - class CBurningVideoDriver : public CNullDriver + class CBurningVideoDriver : public CNullDriver, public IMaterialRendererServices { public: @@ -39,14 +40,15 @@ namespace video //! sets a material virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_; - virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor = SColor(255,0,0,0), - f32 clearDepth = 1.f, u8 clearStencil = 0) _IRR_OVERRIDE_; + virtual bool setRenderTargetEx(IRenderTarget* target, u16 clearFlag, SColor clearColor, + f32 clearDepth, u8 clearStencil) _IRR_OVERRIDE_; //! sets a viewport virtual void setViewPort(const core::rect& area) _IRR_OVERRIDE_; + virtual void setScissor(int x, int y, int width, int height); - virtual bool beginScene(u16 clearFlag, SColor clearColor = SColor(255,0,0,0), f32 clearDepth = 1.f, u8 clearStencil = 0, - const SExposedVideoData& videoData = SExposedVideoData(), core::rect* sourceRect = 0) _IRR_OVERRIDE_; + virtual bool beginScene(u16 clearFlag, SColor clearColor, f32 clearDepth, u8 clearStencil, + const SExposedVideoData& videoData, core::rect* sourceRect) _IRR_OVERRIDE_; virtual bool endScene() _IRR_OVERRIDE_; @@ -83,23 +85,44 @@ namespace video const void* indexList, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) _IRR_OVERRIDE_; + //! draws a vertex primitive list in 2d + virtual void draw2DVertexPrimitiveList(const void* vertices, u32 vertexCount, + const void* indexList, u32 primitiveCount, + E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) _IRR_OVERRIDE_; + + + //! draws an 2d image + //virtual void draw2DImage(const video::ITexture* texture, const core::position2d& destPos, bool useAlphaChannelOfTexture) _IRR_OVERRIDE_; + + /* NullDriver calls + draw2DImage(texture, destPos, + core::rect(core::position2d(0, 0), core::dimension2di(texture->getOriginalSize())), + 0, + SColor(255, 255, 255, 255), + useAlphaChannelOfTexture + */ + //! draws an 2d image, using a color (if color is other then Color(255,255,255,255)) and the alpha channel of the texture if wanted. virtual void draw2DImage(const video::ITexture* texture, const core::position2d& destPos, const core::rect& sourceRect, const core::rect* clipRect = 0, SColor color=SColor(255,255,255,255), bool useAlphaChannelOfTexture=false) _IRR_OVERRIDE_; - //! Draws a part of the texture into the rectangle. + //! Draws a part of the texture into the rectangle. virtual void draw2DImage(const video::ITexture* texture, const core::rect& destRect, const core::rect& sourceRect, const core::rect* clipRect = 0, const video::SColor* const colors=0, bool useAlphaChannelOfTexture=false) _IRR_OVERRIDE_; //! Draws a 3d line. virtual void draw3DLine(const core::vector3df& start, - const core::vector3df& end, SColor color = SColor(255,255,255,255)) _IRR_OVERRIDE_; + const core::vector3df& end, SColor color_start) _IRR_OVERRIDE_; //! draw an 2d rectangle - virtual void draw2DRectangle(SColor color, const core::rect& pos, - const core::rect* clip = 0) _IRR_OVERRIDE_; + //virtual void draw2DRectangle(SColor color, const core::rect& pos, + // const core::rect* clip = 0) _IRR_OVERRIDE_; + + /* NullDriver calls + draw2DRectangle(pos, color, color, color, color, clip); + */ //!Draws an 2d rectangle with a gradient. virtual void draw2DRectangle(const core::rect& pos, @@ -131,7 +154,7 @@ namespace video virtual ITexture* addRenderTargetTexture(const core::dimension2d& size, const io::path& name, const ECOLOR_FORMAT format = ECF_UNKNOWN) _IRR_OVERRIDE_; - virtual void clearBuffers(u16 flag, SColor color = SColor(255,0,0,0), f32 depth = 1.f, u8 stencil = 0) _IRR_OVERRIDE_; + virtual void clearBuffers(u16 flag, SColor color, f32 depth, u8 stencil) _IRR_OVERRIDE_; //! Returns an image created from the last rendered frame. virtual IImage* createScreenShot(video::ECOLOR_FORMAT format=video::ECF_UNKNOWN, video::E_RENDER_TARGET target=video::ERT_FRAME_BUFFER) _IRR_OVERRIDE_; @@ -155,6 +178,9 @@ namespace video video::SColor leftDownEdge = video::SColor(0,0,0,0), video::SColor rightDownEdge = video::SColor(0,0,0,0)) _IRR_OVERRIDE_; + //! Enable the 2d override material + virtual void enableMaterial2D(bool enable = true) _IRR_OVERRIDE_; + //! Returns the graphics card vendor name. virtual core::stringc getVendorInfo() _IRR_OVERRIDE_; @@ -170,8 +196,70 @@ namespace video IDepthBuffer * getDepthBuffer () { return DepthBuffer; } IStencilBuffer * getStencilBuffer () { return StencilBuffer; } + //#define Tweak_Burning +#if defined(Tweak_Burning) + virtual void postEventFromUser(const void* sevent) _IRR_OVERRIDE_; +#endif + + //! Adds a new material renderer to the VideoDriver, using pixel and/or + //! vertex shaders to render geometry. + virtual s32 addShaderMaterial(const c8* vertexShaderProgram, + const c8* pixelShaderProgram, + IShaderConstantSetCallBack* callback, + E_MATERIAL_TYPE baseMaterial, + s32 userData) _IRR_OVERRIDE_; + + //! Adds a new material renderer to the VideoDriver, based on a high level shading + //! language. Currently only HLSL in D3D9 is supported. + virtual s32 addHighLevelShaderMaterial( + const c8* vertexShaderProgram, + const c8* vertexShaderEntryPointName = 0, + E_VERTEX_SHADER_TYPE vsCompileTarget = EVST_VS_1_1, + const c8* pixelShaderProgram = 0, + const c8* pixelShaderEntryPointName = 0, + E_PIXEL_SHADER_TYPE psCompileTarget = EPST_PS_1_1, + const c8* geometryShaderProgram = 0, + const c8* geometryShaderEntryPointName = "main", + E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, + scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, + scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, + u32 verticesOut = 0, + IShaderConstantSetCallBack* callback = 0, + E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID, + s32 userData = 0) _IRR_OVERRIDE_; + + //IMaterialRendererService + + virtual void setBasicRenderStates(const SMaterial& material, + const SMaterial& lastMaterial, + bool resetAllRenderstates) _IRR_OVERRIDE_; + + //pass BaseMaterialID + void setFallback_Material(E_MATERIAL_TYPE fallback_MaterialType); + + //! Return an index constant for the vertex shader based on a name. + virtual s32 getVertexShaderConstantID(const c8* name) _IRR_OVERRIDE_; + virtual bool setVertexShaderConstant(s32 index, const f32* floats, int count) _IRR_OVERRIDE_; + virtual bool setVertexShaderConstant(s32 index, const s32* ints, int count) _IRR_OVERRIDE_; + virtual bool setVertexShaderConstant(s32 index, const u32* ints, int count) _IRR_OVERRIDE_; + virtual void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) _IRR_OVERRIDE_; + + //! Return an index constant for the pixel shader based on a name. + virtual s32 getPixelShaderConstantID(const c8* name) _IRR_OVERRIDE_; + virtual bool setPixelShaderConstant(s32 index, const f32* floats, int count) _IRR_OVERRIDE_; + virtual bool setPixelShaderConstant(s32 index, const s32* ints, int count) _IRR_OVERRIDE_; + virtual bool setPixelShaderConstant(s32 index, const u32* ints, int count) _IRR_OVERRIDE_; + + virtual void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) _IRR_OVERRIDE_; + + //! Get pointer to the IVideoDriver interface + /** \return Pointer to the IVideoDriver interface */ + virtual IVideoDriver* getVideoDriver() _IRR_OVERRIDE_; + protected: + void saveBuffer(); + //! sets a render target void setRenderTargetImage(video::CImage* image); @@ -191,9 +279,6 @@ namespace video video::IImage* RenderTargetSurface; core::dimension2d RenderTargetSize; - //! selects the right triangle renderer based on the render states. - void setCurrentShader(); - IBurningShader* CurrentShader; IBurningShader* BurningShader[ETR2_COUNT]; @@ -210,78 +295,89 @@ namespace video enum E_TRANSFORMATION_STATE_BURNING_VIDEO { ETS_VIEW_PROJECTION = ETS_COUNT, - ETS_CURRENT, - ETS_CLIPSCALE, - ETS_VIEW_INVERSE, - ETS_WORLD_INVERSE, + ETS_PROJ_MODEL_VIEW, + ETS_MODEL_VIEW, + ETS_NORMAL, //3x3 ModelView Tansposed Inverse - ETS_COUNT_BURNING + ETS_COUNT_BURNING = 16 }; enum E_TRANSFORMATION_FLAG { - ETF_IDENTITY = 1, - ETF_TEXGEN_CAMERA_NORMAL = 2, - ETF_TEXGEN_CAMERA_REFLECTION = 4, + ETF_VALID = 1, + ETF_IDENTITY = 2, + ETF_TEXGEN_CAMERA_SPHERE = 4, + ETF_TEXGEN_CAMERA_REFLECTION = 8, + ETF_TEXGEN_WRAP = 16, + ETF_TEXGEN_MASK = ETF_TEXGEN_CAMERA_SPHERE | ETF_TEXGEN_CAMERA_REFLECTION | ETF_TEXGEN_WRAP }; - u32 TransformationFlag[ETS_COUNT_BURNING]; - core::matrix4 Transformation[ETS_COUNT_BURNING]; + core::matrix4 Transformation[2][ETS_COUNT_BURNING]; + size_t TransformationFlag[2][ETS_COUNT_BURNING]; // E_TRANSFORMATION_FLAG - void getCameraPosWorldSpace (); - void getLightPosObjectSpace (); + size_t TransformationStack; // 0 .. 3D , 1 .. 2D + void setRenderStates2DMode(const video::SColor& color,video::ITexture* texture,bool useAlphaChannelOfTexture); + void setRenderStates3DMode(); + + //ETS_CLIPSCALE, // moved outside to stay at 16 matrices + f32 Transformation_ETS_CLIPSCALE[2][4]; + void transform_calc(E_TRANSFORMATION_STATE_BURNING_VIDEO state); + + //core::recti ViewPort; + AbsRectangle Scissor; // Vertex Cache - static const SVSize vSize[]; - SVertexCache VertexCache; - void VertexCache_reset (const void* vertices, u32 vertexCount, + int VertexCache_reset (const void* vertices, u32 vertexCount, const void* indices, u32 indexCount, E_VERTEX_TYPE vType,scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType); - void VertexCache_get ( const s4DVertex ** face ); - void VertexCache_getbypass ( s4DVertex ** face ); + void VertexCache_get (s4DVertexPair* face[4] ); + void VertexCache_map_source_format(); void VertexCache_fill ( const u32 sourceIndex,const u32 destIndex ); - s4DVertex * VertexCache_getVertex ( const u32 sourceIndex ); + s4DVertexPair* VertexCache_getVertex ( const u32 sourceIndex ) const; // culling & clipping - u32 clipToHyperPlane ( s4DVertex * dest, const s4DVertex * source, u32 inCount, const sVec4 &plane ); - u32 clipToFrustumTest ( const s4DVertex * v ) const; - u32 clipToFrustum ( s4DVertex *source, s4DVertex * temp, const u32 vIn ); + //size_t inline clipToHyperPlane (s4DVertexPair* burning_restrict dest, const s4DVertexPair* burning_restrict source, const size_t inCount, const sVec4 &plane ); + //size_t inline clipToFrustumTest ( const s4DVertex * v ) const; + public: + size_t clipToFrustum( const size_t vIn /*, const size_t clipmask_for_face*/ ); + protected: + + // holds transformed, clipped vertices for a triangle. triangle expands on clipping + // Buffer is in in pairs of 4DVertex (0 ... ndc, 1 .. dc and projected) + SAligned4DVertex Clipper; + SAligned4DVertex Clipper_temp; #ifdef SOFTWARE_DRIVER_2_LIGHTING + void lightVertex_eye ( s4DVertex *dest, u32 vertexargb ); +#endif - void lightVertex ( s4DVertex *dest, u32 vertexargb ); //! Sets the fog mode. virtual void setFog(SColor color, E_FOG_TYPE fogType, f32 start, f32 end, f32 density, bool pixelFog, bool rangeFog) _IRR_OVERRIDE_; -#endif - // holds transformed, clipped vertices - SAlignedVertex CurrentOut; - SAlignedVertex Temp; + void ndc_2_dc_and_project (s4DVertexPair* dest,const s4DVertexPair* source, const size_t vIn ) const; - 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, u32 tex, const core::dimension2du& texSize ) const; - f32 texelarea ( const s4DVertex *v0, int tex ) const; + //const is misleading. **v is const that true, but not *v.. + f32 screenarea_inside (const s4DVertexPair* burning_restrict const face[] ) const; + s32 lodFactor_inside ( const s4DVertexPair* burning_restrict const face[], const size_t tex, f32 dc_area, f32 lod_bias ) const; + void select_polygon_mipmap_inside ( s4DVertex* burning_restrict face[], const size_t tex, const CSoftwareTexture2_Bound& b ) 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, u32 tex, const core::dimension2du& texSize ) const; - - - SBurningShaderLightSpace LightSpace; + void getCameraPosWorldSpace(); + SBurningShaderEyeSpace EyeSpace; SBurningShaderMaterial Material; - static const sVec4 NDCPlane[6]; + static const sVec4 NDCPlane[6+2]; + + //! Built-in 2D quad for 2D rendering. + S3DVertex Quad2DVertices[4]; + }; } // end namespace video diff --git a/source/Irrlicht/CSoftwareTexture2.cpp b/source/Irrlicht/CSoftwareTexture2.cpp index 44a7e6be..b17e462d 100644 --- a/source/Irrlicht/CSoftwareTexture2.cpp +++ b/source/Irrlicht/CSoftwareTexture2.cpp @@ -9,6 +9,7 @@ #include "SoftwareDriver2_helper.h" #include "CSoftwareTexture2.h" #include "CSoftwareDriver2.h" +#include "CBlit.h" #include "os.h" namespace irr @@ -16,125 +17,204 @@ namespace irr namespace video { +//! stretches srcRect src to dstRect dst, applying a sliding window box filter in linear color space (sRGB->linear->sRGB) +void Resample_subSampling(eBlitter op, video::IImage* dst, const core::rect* dstRect, const video::IImage* src, const core::rect* srcRect, size_t flags); + //! constructor -CSoftwareTexture2::CSoftwareTexture2(IImage* image, const io::path& name, u32 flags) - : ITexture(name, ETT_2D), MipMapLOD(0), Flags ( flags ), OriginalFormat(video::ECF_UNKNOWN) +CSoftwareTexture2::CSoftwareTexture2(IImage* image, const io::path& name, u32 flags, CBurningVideoDriver* driver) + : ITexture(name +#if !defined(PATCH_SUPERTUX_8_0_1_with_1_9_0) + , ETT_2D +#endif + ) + ,MipMapLOD(0), Flags(flags), Driver(driver) { #ifdef _DEBUG setDebugName("CSoftwareTexture2"); #endif #ifndef SOFTWARE_DRIVER_2_MIPMAPPING - Flags &= ~GEN_MIPMAP; + Flags &= ~(GEN_MIPMAP| GEN_MIPMAP_AUTO); #endif - + //set baseclass properties DriverType = EDT_BURNINGSVIDEO; ColorFormat = BURNINGSHADER_COLOR_FORMAT; IsRenderTarget = (Flags & IS_RENDERTARGET) != 0; - - memset32 ( MipMap, 0, sizeof ( MipMap ) ); + HasMipMaps = (Flags & GEN_MIPMAP) != 0; + MipMap0_Area[0] = 1; + MipMap0_Area[1] = 1; + LodBIAS = 0.75f; + for ( size_t i = 0; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i ) MipMap[i] = 0; + if (!image) return; - if (image) + OriginalSize = image->getDimension(); + OriginalColorFormat = image->getColorFormat(); + + +#if defined(IRRLICHT_sRGB) + if ( Flags & IMAGE_IS_LINEAR ) image->set_sRGB(0); +#else + //guessing linear image + if (name.find("light") >= 0 || + name.find("bump") >= 0 || + name.find("height") >= 0 + ) { - bool IsCompressed = false; - - if (IImage::isCompressedFormat(image->getColorFormat())) - { - os::Printer::log("Texture compression not available.", ELL_ERROR); - IsCompressed = true; - } - - OriginalSize = image->getDimension(); - OriginalFormat = image->getColorFormat(); - - core::dimension2d optSize( - OriginalSize.getOptimalSize(0 != (Flags & NP2_SIZE), - false, true, - SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE) - ); - - if (OriginalSize == optSize) - { - MipMap[0] = new CImage(BURNINGSHADER_COLOR_FORMAT, image->getDimension()); - - if (!IsCompressed) - image->copyTo(MipMap[0]); - } - else - { - char buf[256]; - core::stringw showName ( name ); - snprintf_irr ( buf, 256, "Burningvideo: Warning Texture %ls reformat %dx%d -> %dx%d,%d", - showName.c_str(), - OriginalSize.Width, OriginalSize.Height, optSize.Width, optSize.Height, - BURNINGSHADER_COLOR_FORMAT - ); - - OriginalSize = optSize; - os::Printer::log ( buf, ELL_WARNING ); - MipMap[0] = new CImage(BURNINGSHADER_COLOR_FORMAT, optSize); - - if (!IsCompressed) - image->copyToScalingBoxFilter ( MipMap[0],0, false ); - } - - Size = MipMap[MipMapLOD]->getDimension(); - Pitch = MipMap[MipMapLOD]->getPitch(); - - OrigImageDataSizeInPixels = (f32) 0.3f * MipMap[0]->getImageDataSizeInPixels(); - - HasMipMaps = (Flags & GEN_MIPMAP) != 0; - - regenerateMipMapLevels(image->getMipMapsData()); + Flags |= TEXTURE_IS_LINEAR | IMAGE_IS_LINEAR; } +#endif + + bool isCompressed = IImage::isCompressedFormat(OriginalColorFormat); + if (isCompressed) + { + os::Printer::log("Texture compression not available.", ELL_ERROR); + } + + //visual studio code warning + u32 maxTexSize = SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE; + core::dimension2d optSize( OriginalSize.getOptimalSize( + (Flags & ALLOW_NPOT) ? 0 : 1, // requirePowerOfTwo + false, // requireSquare + (Flags & ALLOW_NPOT) ? 1 : maxTexSize == 0, // larger + (Flags & ALLOW_NPOT) ? 0 : maxTexSize // maxValue + ) + ); + + if (OriginalSize == optSize) + { + MipMap[0] = new CImage(BURNINGSHADER_COLOR_FORMAT, image->getDimension()); +#if defined(IRRLICHT_sRGB) + MipMap[0]->set_sRGB( (Flags & TEXTURE_IS_LINEAR ) ? 0 : image->get_sRGB() ); +#endif + if (!isCompressed) + image->copyTo(MipMap[0]); + } + else + { + char buf[256]; + core::stringw showName ( name ); + snprintf_irr ( buf, sizeof(buf), "Burningvideo: Warning Texture %ls reformat %ux%u,%d -> %ux%u,%d", + showName.c_str(), + OriginalSize.Width, OriginalSize.Height, OriginalColorFormat, + optSize.Width, optSize.Height,BURNINGSHADER_COLOR_FORMAT + ); + + os::Printer::log ( buf, ELL_WARNING ); + MipMap[0] = new CImage(BURNINGSHADER_COLOR_FORMAT, optSize); +#if defined(IRRLICHT_sRGB) + MipMap[0]->set_sRGB( (Flags & TEXTURE_IS_LINEAR ) ? 0 : image->get_sRGB() ); +#endif + if (!isCompressed) + { + //image->copyToScalingBoxFilter ( MipMap[0],0, false ); + Resample_subSampling(BLITTER_TEXTURE,MipMap[0],0,image,0, Flags); + } + // if Original Size is used for calculation ( 2D position, font) it will be wrong + //OriginalSize = optSize; + } + + //select highest mipmap 0 + regenerateMipMapLevels(image->getMipMapsData()); } //! destructor CSoftwareTexture2::~CSoftwareTexture2() { - for ( s32 i = 0; i!= SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i ) + for ( size_t i = 0; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i ) { if ( MipMap[i] ) + { MipMap[i]->drop(); + MipMap[i] = 0; + } } } + //! Regenerates the mip map levels of the texture. Useful after locking and //! modifying the texture +#if !defined(PATCH_SUPERTUX_8_0_1_with_1_9_0) void CSoftwareTexture2::regenerateMipMapLevels(void* data, u32 layer) +#else +void CSoftwareTexture2::regenerateMipMapLevels(void* data) +#endif { - if (!hasMipMaps()) - return; - - s32 i; + int i; // release for ( i = 1; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i ) { if ( MipMap[i] ) + { MipMap[i]->drop(); + MipMap[i] = 0; + } } core::dimension2d newSize; - core::dimension2d origSize = Size; - for (i=1; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i) + if (HasMipMaps && ( (Flags & GEN_MIPMAP_AUTO) || 0 == data ) ) { - newSize = MipMap[i-1]->getDimension(); - newSize.Width = core::s32_max ( 1, newSize.Width >> SOFTWARE_DRIVER_2_MIPMAPPING_SCALE ); - newSize.Height = core::s32_max ( 1, newSize.Height >> SOFTWARE_DRIVER_2_MIPMAPPING_SCALE ); - origSize.Width = core::s32_max(1, origSize.Width >> 1); - origSize.Height = core::s32_max(1, origSize.Height >> 1); - - if (data) + //need memory also if autogen mipmap disabled + for (i = 1; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i) { - if (OriginalFormat != BURNINGSHADER_COLOR_FORMAT) + const core::dimension2du& upperDim = MipMap[i - 1]->getDimension(); + //isotropic + newSize.Width = core::s32_max(SOFTWARE_DRIVER_2_MIPMAPPING_MIN_SIZE, upperDim.Width >> 1); + newSize.Height = core::s32_max(SOFTWARE_DRIVER_2_MIPMAPPING_MIN_SIZE, upperDim.Height >> 1); + if (upperDim == newSize) + break; + + MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize); +#if defined(IRRLICHT_sRGB) + MipMap[i]->set_sRGB(MipMap[i - 1]->get_sRGB()); +#endif + //MipMap[i]->fill ( 0xFFFF4040 ); + //MipMap[i-1]->copyToScalingBoxFilter( MipMap[i], 0, false ); + Resample_subSampling(BLITTER_TEXTURE, MipMap[i], 0, MipMap[0], 0, Flags); + } + } + else if (HasMipMaps && data) + { + //deactivated outside mipdata until TA knows how to handle this. + + //query mipmap dimension + u8* mip_current = (u8*)data; + const u8* mip_end = (u8*)data; + + core::dimension2d origSize = OriginalSize; + i = 1; + do + { + if (origSize.Width > 1) origSize.Width >>= 1; + if (origSize.Height > 1) origSize.Height >>= 1; + mip_end += IImage::getDataSizeFromFormat(OriginalColorFormat, origSize.Width, origSize.Height); + i += 1; + } while ((origSize.Width != 1 || origSize.Height != 1) && i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX); + + //TODO: this is not true + LodBIAS = i*0.75f; + + origSize = OriginalSize; + for (i = 1; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX && mip_current < mip_end; ++i) + { + const core::dimension2du& upperDim = MipMap[i - 1]->getDimension(); + //isotropic + newSize.Width = core::s32_max(SOFTWARE_DRIVER_2_MIPMAPPING_MIN_SIZE, upperDim.Width >> 1); + newSize.Height = core::s32_max(SOFTWARE_DRIVER_2_MIPMAPPING_MIN_SIZE, upperDim.Height >> 1); + if (upperDim == newSize) + break; + + if (origSize.Width > 1) origSize.Width >>= 1; + if (origSize.Height > 1) origSize.Height >>= 1; + + if (OriginalColorFormat != BURNINGSHADER_COLOR_FORMAT) { - IImage* tmpImage = new CImage(OriginalFormat, origSize, data, true, false); + IImage* tmpImage = new CImage(OriginalColorFormat, origSize, mip_current, true, false); MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize); - if (origSize==newSize) + if (origSize == newSize) tmpImage->copyTo(MipMap[i]); else tmpImage->copyToScalingBoxFilter(MipMap[i]); @@ -142,33 +222,121 @@ void CSoftwareTexture2::regenerateMipMapLevels(void* data, u32 layer) } else { - if (origSize==newSize) - MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize, data, false); + if (origSize == newSize) + MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize, mip_current, false); else { MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize); - IImage* tmpImage = new CImage(BURNINGSHADER_COLOR_FORMAT, origSize, data, true, false); + IImage* tmpImage = new CImage(BURNINGSHADER_COLOR_FORMAT, origSize, mip_current, true, false); tmpImage->copyToScalingBoxFilter(MipMap[i]); tmpImage->drop(); } } - data = (u8*)data +origSize.getArea()*IImage::getBitsPerPixelFromFormat(OriginalFormat)/8; + mip_current += IImage::getDataSizeFromFormat(OriginalColorFormat, origSize.Width, origSize.Height); + } + } + + + //visualize mipmap + for (i=1; i < 0 && i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i) + { +/* + static u32 color[] = { + 0x30bf7f00,0x3040bf00,0x30bf00bf,0x3000bf00, + 0x300080bf,0x30bf4000,0x300040bf,0x307f00bf, + 0x30bf0000,0x3000bfbf,0x304000bf,0x307fbf00, + 0x8000bf7f,0x80bf0040,0x80bfbf00,0x800000bf + }; +*/ + static u32 color[] = { + 0xFFFFFFFF,0xFFFF0000,0xFF00FF00,0xFF0000FF, + 0xFFFFFF00,0xFF00FFFF,0xFFFF00FF,0xFF0000FF, + 0xFF0000FF,0xFF0000FF,0xFF0000FF,0xFF0000FF, + 0xFF0000FF,0xFF0000FF,0xFF0000FF,0xFFFF00FF + }; + + if ( MipMap[i] ) + { + core::rect p (core::position2di(0,0),MipMap[i]->getDimension()); + SColor c((color[i & 15] & 0x00FFFFFF) | 0xFF000000); + Blit(BLITTER_TEXTURE_ALPHA_COLOR_BLEND, MipMap[i], 0, 0, MipMap[i], &p, c.color); + } + } + + //save mipmap chain + if ( 0 ) + { + char buf[256]; + const char* name = getName().getPath().c_str(); + int filename = 0; + //int ext = -1; + i = 0; + while (name[i]) + { + if (name[i] == '/' || name[i] == '\\') filename = i + 1; + //if (name[i] == '.') ext = i; + i += 1; + } + for (i = 0; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i) + { + if (MipMap[i]) + { + snprintf_irr(buf, sizeof(buf),"mip/%s_%02d.png", name + filename,i); + Driver->writeImageToFile(MipMap[i], buf); + } + } + } + + calcDerivative(); +} + +void CSoftwareTexture2::calcDerivative() +{ + //reset current MipMap + MipMapLOD = 0; + if (MipMap[0]) + { + const core::dimension2du& dim = MipMap[0]->getDimension(); + MipMap0_Area[0] = dim.Width; + MipMap0_Area[1] = dim.Height; // screensize of a triangle + + Size = dim; // MipMap[MipMapLOD]->getDimension(); + Pitch = MipMap[MipMapLOD]->getPitch(); + } + + //preCalc mipmap texel center boundaries + for ( s32 i = 0; i < SOFTWARE_DRIVER_2_MIPMAPPING_MAX; ++i ) + { + CSoftwareTexture2_Bound& b = TexBound[i]; + if (MipMap[i]) + { + const core::dimension2du& dim = MipMap[i]->getDimension(); + //f32 u = 1.f / dim.Width; + //f32 v = 1.f / dim.Height; + + b.w = dim.Width - 1.f; + b.h = dim.Height - 1.f; + b.cx = 0.f; //u*0.005f; + b.cy = 0.f; //v*0.005f; } else { - MipMap[i] = new CImage(BURNINGSHADER_COLOR_FORMAT, newSize); - - //static u32 color[] = { 0, 0xFFFF0000, 0xFF00FF00,0xFF0000FF,0xFFFFFF00,0xFFFF00FF,0xFF00FFFF,0xFF0F0F0F }; - MipMap[i]->fill ( 0 ); - MipMap[0]->copyToScalingBoxFilter( MipMap[i], 0, false ); + b.w = 0.f; + b.h = 0.f; + b.cx = 0.f; + b.cy = 0.f; } } + } /* Software Render Target 2 */ CSoftwareRenderTarget2::CSoftwareRenderTarget2(CBurningVideoDriver* driver) : Driver(driver) +#if defined(PATCH_SUPERTUX_8_0_1_with_1_9_0) +, IRenderTarget(0) +#endif { DriverType = EDT_BURNINGSVIDEO; @@ -216,6 +384,290 @@ ITexture* CSoftwareRenderTarget2::getTexture() const } + +static const float srgb_8bit_to_linear_float[1 << 8] = { + 0.0f, 3.03527e-4f, 6.07054e-4f, 9.10581e-4f, + 0.001214108f, 0.001517635f, 0.001821162f, 0.0021246888f, + 0.002428216f, 0.002731743f, 0.00303527f, 0.0033465358f, + 0.0036765074f, 0.004024717f, 0.004391442f, 0.0047769537f, + 0.005181517f, 0.005605392f, 0.0060488335f, 0.006512091f, + 0.0069954107f, 0.007499032f, 0.008023193f, 0.008568126f, + 0.009134059f, 0.009721218f, 0.010329823f, 0.010960095f, + 0.011612245f, 0.012286489f, 0.0129830325f, 0.013702083f, + 0.014443845f, 0.015208516f, 0.015996294f, 0.016807377f, + 0.017641956f, 0.018500222f, 0.019382363f, 0.020288564f, + 0.021219011f, 0.022173885f, 0.023153368f, 0.024157634f, + 0.025186861f, 0.026241222f, 0.027320893f, 0.02842604f, + 0.029556835f, 0.030713445f, 0.031896032f, 0.033104766f, + 0.034339808f, 0.035601314f, 0.036889452f, 0.038204372f, + 0.039546236f, 0.0409152f, 0.04231141f, 0.04373503f, + 0.045186203f, 0.046665087f, 0.048171826f, 0.049706567f, + 0.051269464f, 0.05286065f, 0.05448028f, 0.056128494f, + 0.057805438f, 0.059511244f, 0.06124606f, 0.06301002f, + 0.06480327f, 0.066625945f, 0.068478175f, 0.0703601f, + 0.07227185f, 0.07421357f, 0.07618539f, 0.07818743f, + 0.08021983f, 0.082282715f, 0.084376216f, 0.086500466f, + 0.08865559f, 0.09084172f, 0.093058966f, 0.09530747f, + 0.097587354f, 0.09989873f, 0.10224174f, 0.10461649f, + 0.107023105f, 0.10946172f, 0.111932434f, 0.11443538f, + 0.11697067f, 0.119538434f, 0.122138776f, 0.12477182f, + 0.12743768f, 0.13013647f, 0.13286832f, 0.13563333f, + 0.13843162f, 0.14126329f, 0.14412847f, 0.14702727f, + 0.14995979f, 0.15292616f, 0.15592647f, 0.15896083f, + 0.16202939f, 0.1651322f, 0.1682694f, 0.17144111f, + 0.1746474f, 0.17788842f, 0.18116425f, 0.18447499f, + 0.18782078f, 0.19120169f, 0.19461784f, 0.19806932f, + 0.20155625f, 0.20507874f, 0.20863687f, 0.21223076f, + 0.21586053f, 0.21952623f, 0.22322798f, 0.2269659f, + 0.23074007f, 0.23455061f, 0.2383976f, 0.24228115f, + 0.24620135f, 0.2501583f, 0.25415212f, 0.25818288f, + 0.2622507f, 0.26635563f, 0.27049783f, 0.27467734f, + 0.2788943f, 0.28314877f, 0.28744087f, 0.29177067f, + 0.2961383f, 0.3005438f, 0.30498734f, 0.30946895f, + 0.31398875f, 0.3185468f, 0.32314324f, 0.32777813f, + 0.33245155f, 0.33716366f, 0.34191445f, 0.3467041f, + 0.35153264f, 0.35640016f, 0.36130682f, 0.36625263f, + 0.3712377f, 0.37626216f, 0.38132605f, 0.38642946f, + 0.3915725f, 0.39675525f, 0.4019778f, 0.40724024f, + 0.41254264f, 0.4178851f, 0.4232677f, 0.42869052f, + 0.43415368f, 0.4396572f, 0.44520122f, 0.45078582f, + 0.45641103f, 0.46207702f, 0.4677838f, 0.4735315f, + 0.4793202f, 0.48514995f, 0.4910209f, 0.496933f, + 0.5028865f, 0.50888133f, 0.5149177f, 0.5209956f, + 0.52711517f, 0.53327644f, 0.5394795f, 0.5457245f, + 0.55201143f, 0.55834043f, 0.5647115f, 0.57112485f, + 0.57758045f, 0.58407843f, 0.59061885f, 0.5972018f, + 0.60382736f, 0.61049557f, 0.6172066f, 0.62396044f, + 0.63075715f, 0.6375969f, 0.6444797f, 0.65140563f, + 0.65837485f, 0.66538733f, 0.67244315f, 0.6795425f, + 0.6866853f, 0.6938718f, 0.7011019f, 0.7083758f, + 0.71569353f, 0.7230551f, 0.73046076f, 0.73791045f, + 0.74540424f, 0.7529422f, 0.7605245f, 0.76815116f, + 0.7758222f, 0.7835378f, 0.791298f, 0.7991027f, + 0.8069523f, 0.8148466f, 0.82278574f, 0.8307699f, + 0.838799f, 0.8468732f, 0.8549926f, 0.8631572f, + 0.8713671f, 0.8796224f, 0.8879231f, 0.8962694f, + 0.9046612f, 0.91309863f, 0.92158186f, 0.9301109f, + 0.9386857f, 0.9473065f, 0.9559733f, 0.9646863f, + 0.9734453f, 0.9822506f, 0.9911021f, 1.0f, +}; +/* +int linear_to_srgb_8bit(const float x) { + if (x <= 0.f) return 0; + if (x >= 1.f) return 255; + const float *table = SRGB_8BIT_TO_LINEAR_FLOAT; + int y = 0; + for (int i = 128; i != 0; i >>= 1) { + if (table[y + i] <= x) + y += i; + } + if (x - table[y] <= table[y + 1] - x) + return y; + else + return y + 1; +} +*/ + + +u32 linear_to_srgb_8bit(const float v) +{ + ieee754 c; + c.f = v; + const register size_t x = c.u; + const u32 *table = (u32*)srgb_8bit_to_linear_float; + register u32 y = 0; + y += table[y + 128] <= x ? 128 : 0; + y += table[y + 64] <= x ? 64 : 0; + y += table[y + 32] <= x ? 32 : 0; + y += table[y + 16] <= x ? 16 : 0; + y += table[y + 8] <= x ? 8 : 0; + y += table[y + 4] <= x ? 4 : 0; + y += table[y + 2] <= x ? 2 : 0; + y += table[y + 1] <= x ? 1 : 0; + + return y; +} + +// 2D Region half open [x0;x1[ +struct absrect2 +{ + s32 x0; + s32 y0; + s32 x1; + s32 y1; +}; + +static inline int clipTest(absrect2 &o, const core::rect* a, const absrect2& b) +{ + if (a == 0) + { + o.x0 = b.x0; + o.y0 = b.y0; + o.x1 = b.x1; + o.y1 = b.y1; + } + else + { + o.x0 = core::s32_max(a->UpperLeftCorner.X, b.x0); + o.x1 = core::s32_min(a->LowerRightCorner.X, b.x1); + o.y0 = core::s32_max(a->UpperLeftCorner.Y, b.y0); + o.y1 = core::s32_min(a->LowerRightCorner.Y, b.y1); + } + int clipTest = 0; + clipTest |= o.x0 >= o.x1 ? 1 : 0; + clipTest |= o.y0 >= o.y1 ? 2 : 0; + return clipTest; +} + +//! stretches srcRect src to dstRect dst, applying a sliding window box filter in linear color space (sRGB->linear->sRGB) +// todo: texture jumps (mip selection problem) +void Resample_subSampling(eBlitter op, video::IImage* dst, const core::rect* dstRect, + const video::IImage* src, const core::rect* srcRect,size_t flags) +{ + const absrect2 dst_clip = { 0,0,(s32)dst->getDimension().Width,(s32)dst->getDimension().Height }; + absrect2 dc; + if (clipTest(dc, dstRect, dst_clip)) return; + const video::ECOLOR_FORMAT dstFormat = dst->getColorFormat(); + u8* dstData = (u8*)dst->getData(); + + const absrect2 src_clip = { 0,0,(s32)src->getDimension().Width,(s32)src->getDimension().Height }; + absrect2 sc; + if (clipTest(sc, srcRect, src_clip)) return; + const video::ECOLOR_FORMAT srcFormat = src->getColorFormat(); + const u8* srcData = (u8*)src->getData(); + +#if defined(IRRLICHT_sRGB) + const int dst_sRGB = dst->get_sRGB(); + const int src_sRGB = src->get_sRGB(); +#else + const int dst_sRGB = (flags & CSoftwareTexture2::TEXTURE_IS_LINEAR) ? 0 : 1; + const int src_sRGB = (flags & CSoftwareTexture2::IMAGE_IS_LINEAR) ? 0 : 1; +#endif + + + + float scale[2]; + scale[0] = (float)(sc.x1 - sc.x0) / (float)(dc.x1 - dc.x0); + scale[1] = (float)(sc.y1 - sc.y0) / (float)(dc.y1 - dc.y0); + const float rs = 1.f / (scale[0] * scale[1]); + + float sum[4]; + u32 sbgra = 0; + + float f[4]; + int fi[4]; + f[3] = (float)sc.y0; + for (int dy = dc.y0; dy < dc.y1; ++dy) + { + f[1] = f[3]; + f[3] = sc.y0 + (dy + 1 - dc.y0)*scale[1]; + if (f[3] >= sc.y1) f[3] = sc.y1 - 0.001f; //todo:1.f/dim should be enough + + f[2] = (float)sc.x0; + for (int dx = dc.x0; dx < dc.x1; ++dx) + { + f[0] = f[2]; + f[2] = sc.x0 + (dx + 1 - dc.x0)*scale[0]; + if (f[2] >= sc.x1) f[2] = sc.x1 - 0.001f; + + //accumulate linear color + sum[0] = 0.f; + sum[1] = 0.f; + sum[2] = 0.f; + sum[3] = 0.f; + + //sample border + fi[0] = (int)(f[0]); + fi[1] = (int)(f[1]); + fi[2] = (int)(f[2]); + fi[3] = (int)(f[3]); + + float w[2]; + for (int fy = fi[1]; fy <= fi[3]; ++fy) + { + w[1] = 1.f; + if (fy == fi[1]) w[1] -= f[1] - fy; + if (fy == fi[3]) w[1] -= fy + 1 - f[3]; + + for (int fx = fi[0]; fx <= fi[2]; ++fx) + { + w[0] = 1.f; + if (fx == fi[0]) w[0] -= f[0] - fx; + if (fx == fi[2]) w[0] -= fx + 1 - f[2]; + + const float ws = w[1] * w[0] * rs; + + switch (srcFormat) + { + case video::ECF_A1R5G5B5: sbgra = video::A1R5G5B5toA8R8G8B8(*(u16*)(srcData + (fy*src_clip.x1) * 2 + (fx * 2))); break; + case video::ECF_R5G6B5: sbgra = video::R5G6B5toA8R8G8B8(*(u16*)(srcData + (fy*src_clip.x1) * 2 + (fx * 2))); break; + case video::ECF_A8R8G8B8: sbgra = *(u32*)(srcData + (fy*src_clip.x1) * 4 + (fx * 4)); break; + case video::ECF_R8G8B8: + { + const u8* p = srcData + (fy*src_clip.x1) * 3 + (fx * 3); + sbgra = 0xFF000000 | p[0] << 16 | p[1] << 8 | p[2]; + } break; + default: break; + } + if (src_sRGB) + { + sum[0] += srgb_8bit_to_linear_float[(sbgra) & 0xFF] * ws; + sum[1] += srgb_8bit_to_linear_float[(sbgra >> 8) & 0xFF] * ws; + sum[2] += srgb_8bit_to_linear_float[(sbgra >> 16) & 0xFF] * ws; + sum[3] += ((sbgra >> 24) & 0xFF) * ws; + } + else + { + sum[0] += ((sbgra) & 0xFF) * ws; + sum[1] += ((sbgra >> 8) & 0xFF) * ws; + sum[2] += ((sbgra >> 16) & 0xFF) * ws; + sum[3] += ((sbgra >> 24) & 0xFF) * ws; + } + + } + } + switch (op) + { + case BLITTER_TEXTURE_ALPHA_BLEND: + case BLITTER_TEXTURE_ALPHA_COLOR_BLEND: + break; + default: + break; + } + if (dst_sRGB) + { + sbgra = linear_to_srgb_8bit(sum[0]) | + linear_to_srgb_8bit(sum[1]) << 8 | + linear_to_srgb_8bit(sum[2]) << 16 | + (u32)(sum[3]) << 24; + } + else + { + sbgra = (u32)(sum[0]) | + (u32)(sum[1]) << 8 | + (u32)(sum[2]) << 16 | + (u32)(sum[3]) << 24; + } + switch (dstFormat) + { + case video::ECF_A8R8G8B8: *(u32*)(dstData + (dy*dst_clip.x1) * 4 + (dx * 4)) = sbgra; break; + case video::ECF_R8G8B8: + { + u8* p = dstData + (dy*dst_clip.x1) * 3 + (dx * 3); + p[2] = (sbgra) & 0xFF; + p[1] = (sbgra >> 8) & 0xFF; + p[0] = (sbgra >> 16) & 0xFF; + } break; + case video::ECF_A1R5G5B5: *(u16*)(dstData + (dy*dst_clip.x1) * 2 + (dx * 2)) = video::A8R8G8B8toA1R5G5B5(sbgra); break; + case video::ECF_R5G6B5: *(u16*)(dstData + (dy*dst_clip.x1) * 2 + (dx * 2)) = video::A8R8G8B8toR5G6B5(sbgra); break; + default: + break; + } + } + } + +} + } // end namespace video } // end namespace irr diff --git a/source/Irrlicht/CSoftwareTexture2.h b/source/Irrlicht/CSoftwareTexture2.h index ac3c1fc5..4f6be486 100644 --- a/source/Irrlicht/CSoftwareTexture2.h +++ b/source/Irrlicht/CSoftwareTexture2.h @@ -21,6 +21,14 @@ class CBurningVideoDriver; /*! interface for a Video Driver dependent Texture. */ +struct CSoftwareTexture2_Bound +{ + f32 w; // width - 0.5f; + f32 h; // height- 0.5f; + f32 cx; // texelcenter x 1.f/width*0.5f + f32 cy; // texelcenter y 1.f/height*0.5f +}; + class CSoftwareTexture2 : public ITexture { public: @@ -28,21 +36,34 @@ public: //! constructor enum eTex2Flags { - GEN_MIPMAP = 1, - IS_RENDERTARGET = 2, - NP2_SIZE = 4, + GEN_MIPMAP = 1, // has mipmaps + GEN_MIPMAP_AUTO = 2, // automatic mipmap generation + IS_RENDERTARGET = 4, + ALLOW_NPOT = 8, //allow non power of two + IMAGE_IS_LINEAR = 16, + TEXTURE_IS_LINEAR = 32, }; - CSoftwareTexture2(IImage* surface, const io::path& name, u32 flags); + CSoftwareTexture2(IImage* surface, const io::path& name, u32 flags /*eTex2Flags*/, CBurningVideoDriver* driver); //! destructor virtual ~CSoftwareTexture2(); + u32 getMipmapLevel(s32 newLevel) const + { + if ( newLevel < 0 ) newLevel = 0; + else if ( newLevel >= SOFTWARE_DRIVER_2_MIPMAPPING_MAX ) newLevel = SOFTWARE_DRIVER_2_MIPMAPPING_MAX - 1; + + while ( newLevel > 0 && MipMap[newLevel] == 0 ) newLevel -= 1; + return newLevel; + } + //! lock function virtual void* lock(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel, u32 layer, E_TEXTURE_LOCK_FLAGS lockFlags = ETLF_FLIP_Y_UP_RTT) _IRR_OVERRIDE_ { if (Flags & GEN_MIPMAP) { - MipMapLOD = mipmapLevel; + //called from outside. must test + MipMapLOD = getMipmapLevel(mipmapLevel); Size = MipMap[MipMapLOD]->getDimension(); Pitch = MipMap[MipMapLOD]->getPitch(); } @@ -55,14 +76,19 @@ public: { } - //! Returns the size of the largest mipmap. + //! compare the area drawn with the area of the texture f32 getLODFactor( const f32 texArea ) const { - return OrigImageDataSizeInPixels * texArea; + return MipMap0_Area[0]* MipMap0_Area[1] * 0.5f * texArea; //return MipMap[0]->getImageDataSizeInPixels () * texArea; } - //! returns unoptimized surface + const u32* getMipMap0_Area() const + { + return MipMap0_Area; + } + + //! returns unoptimized surface (misleading name. burning can scale down originalimage) virtual CImage* getImage() const { return MipMap[0]; @@ -74,16 +100,27 @@ public: return MipMap[MipMapLOD]; } + //precalculated dimx-1/dimx*0.5f + const CSoftwareTexture2_Bound& getTexBound() const + { + return TexBound[MipMapLOD]; + } + virtual void regenerateMipMapLevels(void* data = 0, u32 layer = 0) _IRR_OVERRIDE_; + f32 get_lod_bias() const { return LodBIAS; } private: - f32 OrigImageDataSizeInPixels; + void calcDerivative(); - CImage * MipMap[SOFTWARE_DRIVER_2_MIPMAPPING_MAX]; + //! controls MipmapSelection. relation between drawn area and image size + u32 MipMapLOD; // 0 .. original Texture pot -SOFTWARE_DRIVER_2_MIPMAPPING_MAX + u32 Flags; //eTex2Flags + CBurningVideoDriver* Driver; - u32 MipMapLOD; - u32 Flags; - ECOLOR_FORMAT OriginalFormat; + CImage* MipMap[SOFTWARE_DRIVER_2_MIPMAPPING_MAX]; + CSoftwareTexture2_Bound TexBound[SOFTWARE_DRIVER_2_MIPMAPPING_MAX]; + u32 MipMap0_Area[2]; + f32 LodBIAS; }; /*! @@ -103,9 +140,9 @@ protected: CBurningVideoDriver* Driver; }; - } // end namespace video } // end namespace irr -#endif +#endif // __C_SOFTWARE_2_TEXTURE_H_INCLUDED__ + diff --git a/source/Irrlicht/CTRGouraud2.cpp b/source/Irrlicht/CTRGouraud2.cpp index 194cc68b..d0488b57 100644 --- a/source/Irrlicht/CTRGouraud2.cpp +++ b/source/Irrlicht/CTRGouraud2.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -83,13 +83,11 @@ public: CTRGouraud2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle (const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; + //virtual bool canWireFrame () { return true; } - -private: - void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; +protected: + virtual void scanline_bilinear (); }; @@ -136,8 +134,8 @@ void CTRGouraud2::scanline_bilinear () #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -145,7 +143,7 @@ void CTRGouraud2::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -182,6 +180,7 @@ void CTRGouraud2::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -193,34 +192,31 @@ void CTRGouraud2::scanline_bilinear () #ifdef IPOL_C0 tFixPoint r0, g0, b0; -#ifdef INVERSE_W - f32 inversew; -#endif + f32 inversew = FIX_POINT_F32_MUL * COLOR_MAX; #endif for ( s32 i = 0; i <= dx; ++i ) { + //if test active only first pixel + if ( (0 == EdgeTestPass) & i ) break; #ifdef CMP_Z if ( line.z[0] < z[i] ) #endif #ifdef CMP_W - if ( line.w[0] >= z[i] ) + if (line.w[0] >= z[i] ) #endif { #ifdef IPOL_C0 + #ifdef INVERSE_W - inversew = core::reciprocal ( line.w[0] ); - - getSample_color ( r0, g0, b0, line.c[0][0] * inversew ); -#else - getSample_color ( r0, g0, b0, line.c[0][0] ); + inversew = fix_inverse32_color(line.w[0]); #endif - - dst[i] = fix_to_color ( r0, g0, b0 ); + vec4_to_fix( r0, g0, b0, line.c[0][0],inversew ); + dst[i] = fix_to_sample( r0, g0, b0 ); #else - dst[i] = COLOR_BRIGHT_WHITE; + dst[i] = PrimitiveColor; #endif #ifdef WRITE_Z @@ -251,7 +247,7 @@ void CTRGouraud2::scanline_bilinear () } -void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRGouraud2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( a->Pos.y > b->Pos.y ) swapVertexPointer(&a, &b); @@ -262,10 +258,10 @@ void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4D const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_edge( ca ); + scan.invDeltaY[1] = reciprocal_edge( ba ); + scan.invDeltaY[2] = reciprocal_edge( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -351,8 +347,8 @@ void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4D #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -421,6 +417,7 @@ void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4D // render a scanline scanline_bilinear (); + if ( EdgeTestPass & edge_test_first_line ) break; scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -454,7 +451,7 @@ void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4D } // rasterize lower sub-triangle - if ( (f32) 0.0 != scan.invDeltaY[2] ) + if ( (f32) 0.0 != scan.invDeltaY[2] ) { // advance to middle point if( (f32) 0.0 != scan.invDeltaY[1] ) @@ -510,8 +507,8 @@ void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4D #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -581,6 +578,7 @@ void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4D // render a scanline scanline_bilinear (); + if ( EdgeTestPass & edge_test_first_line ) break; scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -630,6 +628,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTriangleRendererGouraud2(CBurningVideoDriver* driver) { + // ETR_GOURAUD . no texture #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRGouraud2(driver); #else diff --git a/source/Irrlicht/CTRGouraudAlpha2.cpp b/source/Irrlicht/CTRGouraudAlpha2.cpp index 837ab3e4..dd425f8b 100644 --- a/source/Irrlicht/CTRGouraudAlpha2.cpp +++ b/source/Irrlicht/CTRGouraudAlpha2.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -84,15 +84,12 @@ public: CTRGouraudAlpha2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle ( const s4DVertex* burning_restrict a,const s4DVertex* burning_restrict b,const s4DVertex* burning_restrict c ) _IRR_OVERRIDE_; private: void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; - }; //! constructor @@ -142,8 +139,8 @@ void CTRGouraudAlpha2::scanline_bilinear () #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -151,7 +148,7 @@ void CTRGouraudAlpha2::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -188,6 +185,7 @@ void CTRGouraudAlpha2::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -198,9 +196,7 @@ void CTRGouraudAlpha2::scanline_bilinear () #ifdef IPOL_C0 -#ifdef INVERSE_W - f32 inversew; -#endif + f32 inversew = FIX_POINT_F32_MUL; tFixPoint a0; tFixPoint r0, g0, b0; @@ -220,22 +216,20 @@ void CTRGouraudAlpha2::scanline_bilinear () { #ifdef IPOL_C0 #ifdef INVERSE_W - inversew = core::reciprocal ( line.w[0] ); - - getSample_color ( a0, r0, g0, b0, line.c[0][0] * inversew ); -#else - getSample_color ( a0, r0, g0, b0, line.c[0][0] ); + inversew = reciprocal_zero_no ( line.w[0] ); #endif + vec4_to_fix( a0, r0, g0, b0, line.c[0][0],inversew ); color_to_fix ( r1, g1, b1, dst[i] ); + fix_color_norm(a0); r2 = r1 + imulFix ( a0, r0 - r1 ); g2 = g1 + imulFix ( a0, g0 - g1 ); b2 = b1 + imulFix ( a0, b0 - b1 ); - dst[i] = fix_to_color ( r2, g2, b2 ); + dst[i] = fix4_to_sample( a0,r2, g2, b2 ); #else - dst[i] = COLOR_BRIGHT_WHITE; + dst[i] = PrimitiveColor; #endif #ifdef WRITE_Z z[i] = line.z[0]; @@ -265,7 +259,7 @@ void CTRGouraudAlpha2::scanline_bilinear () } -void CTRGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRGouraudAlpha2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -276,9 +270,9 @@ void CTRGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -365,8 +359,8 @@ void CTRGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -524,8 +518,8 @@ void CTRGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -642,6 +636,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTriangleRendererGouraudAlpha2(CBurningVideoDriver* driver) { + // ETR_GOURAUD_ALPHA unused #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRGouraudAlpha2(driver); #else diff --git a/source/Irrlicht/CTRGouraudAlphaNoZ2.cpp b/source/Irrlicht/CTRGouraudAlphaNoZ2.cpp index b5453df0..d921cb03 100644 --- a/source/Irrlicht/CTRGouraudAlphaNoZ2.cpp +++ b/source/Irrlicht/CTRGouraudAlphaNoZ2.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -84,14 +84,11 @@ public: CTRGouraudAlphaNoZ2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle (const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; - }; //! constructor @@ -138,8 +135,8 @@ void CTRGouraudAlphaNoZ2::scanline_bilinear () #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -147,7 +144,7 @@ void CTRGouraudAlphaNoZ2::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -184,6 +181,7 @@ void CTRGouraudAlphaNoZ2::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -192,11 +190,10 @@ void CTRGouraudAlphaNoZ2::scanline_bilinear () + f32 inversew = FIX_POINT_F32_MUL * COLOR_MAX; + #ifdef IPOL_C0 -#ifdef INVERSE_W - f32 inversew; -#endif tFixPoint a0; tFixPoint r0, g0, b0; @@ -224,22 +221,21 @@ void CTRGouraudAlphaNoZ2::scanline_bilinear () #ifdef IPOL_C0 #ifdef IPOL_W - inversew = core::reciprocal ( line.w[0] ); - - getSample_color ( a0, r0, g0, b0, line.c[0][0] * inversew ); -#else - getSample_color ( a0, r0, g0, b0, line.c[0][0] ); + inversew = fix_inverse32_color(line.w[0]); #endif + vec4_to_fix( a0, r0, g0, b0, line.c[0][0],inversew ); + color_to_fix ( r1, g1, b1, dst[i] ); + fix_color_norm(a0); r2 = r1 + imulFix ( a0, r0 - r1 ); g2 = g1 + imulFix ( a0, g0 - g1 ); b2 = b1 + imulFix ( a0, b0 - b1 ); - dst[i] = fix_to_color ( r2, g2, b2 ); + dst[i] = fix_to_sample( r2, g2, b2 ); #else - dst[i] = COLOR_BRIGHT_WHITE; + dst[i] = PrimitiveColor; #endif @@ -264,7 +260,7 @@ void CTRGouraudAlphaNoZ2::scanline_bilinear () } -void CTRGouraudAlphaNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRGouraudAlphaNoZ2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -275,9 +271,9 @@ void CTRGouraudAlphaNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,c const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -363,8 +359,8 @@ void CTRGouraudAlphaNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,c #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -522,8 +518,8 @@ void CTRGouraudAlphaNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,c #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -640,6 +636,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTRGouraudAlphaNoZ2(CBurningVideoDriver* driver) { + //ETR_GOURAUD_ALPHA_NOZ - draw2DRectangle Gradient #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRGouraudAlphaNoZ2(driver); #else diff --git a/source/Irrlicht/CTRGouraudNoZ2.cpp b/source/Irrlicht/CTRGouraudNoZ2.cpp new file mode 100644 index 00000000..2e0bc393 --- /dev/null +++ b/source/Irrlicht/CTRGouraudNoZ2.cpp @@ -0,0 +1,641 @@ +// Copyright (C) 2002-2012 Nikolaus Gebhardt / Thomas Alten +// This file is part of the "Irrlicht Engine". +// For conditions of distribution and use, see copyright notice in irrlicht.h + +#include "IrrCompileConfig.h" +#include "IBurningShader.h" + +#ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ + +// compile flag for this file +#undef USE_ZBUFFER +#undef IPOL_Z +#undef CMP_Z +#undef WRITE_Z + +#undef IPOL_W +#undef CMP_W +#undef WRITE_W + +#undef SUBTEXEL +#undef INVERSE_W + +#undef IPOL_C0 +#undef IPOL_T0 +#undef IPOL_T1 + +// define render case +#define SUBTEXEL +#define INVERSE_W + +#define USE_ZBUFFER +#define IPOL_W +//#define CMP_W +//#define WRITE_W + +#define IPOL_C0 +//#define IPOL_T0 +//#define IPOL_T1 + +// apply global override +#ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT + #undef INVERSE_W +#endif + +#ifndef SOFTWARE_DRIVER_2_SUBTEXEL + #undef SUBTEXEL +#endif + +#if BURNING_MATERIAL_MAX_COLORS < 1 + #undef IPOL_C0 +#endif + +#if !defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) && defined ( USE_ZBUFFER ) + #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT + #undef IPOL_W + #endif + #define IPOL_Z + + #ifdef CMP_W + #undef CMP_W + #define CMP_Z + #endif + + #ifdef WRITE_W + #undef WRITE_W + #define WRITE_Z + #endif + +#endif + + +namespace irr +{ + +namespace video +{ + +class CTRGouraudNoZ2 : public IBurningShader +{ +public: + + //! constructor + CTRGouraudNoZ2(CBurningVideoDriver* driver); + + //! draws an indexed triangle list + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; + virtual bool canWireFrame () { return true; } + +protected: + virtual void scanline_bilinear (); +}; + +//! constructor +CTRGouraudNoZ2::CTRGouraudNoZ2(CBurningVideoDriver* driver) +: IBurningShader(driver) +{ + #ifdef _DEBUG + setDebugName("CTRGouraudNoZ2"); + #endif +} + + + +/*! +*/ +void CTRGouraudNoZ2::scanline_bilinear () +{ + tVideoSample *dst; + +#ifdef USE_ZBUFFER + //fp24 *z; +#endif + + s32 xStart; + s32 xEnd; + s32 dx; + +#ifdef SUBTEXEL + f32 subPixel; +#endif + +#ifdef IPOL_Z + f32 slopeZ; +#endif +#ifdef IPOL_W + fp24 slopeW; +#endif +#ifdef IPOL_C0 + sVec4 slopeC; +#endif +#ifdef IPOL_T0 + sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; +#endif + + // apply top-left fill-convention, left + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); + + dx = xEnd - xStart; + + if ( dx < 0 ) + return; + + // slopes + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); + +#ifdef IPOL_Z + slopeZ = (line.z[1] - line.z[0]) * invDeltaX; +#endif +#ifdef IPOL_W + slopeW = (line.w[1] - line.w[0]) * invDeltaX; +#endif +#ifdef IPOL_C0 + slopeC = (line.c[0][1] - line.c[0][0]) * invDeltaX; +#endif +#ifdef IPOL_T0 + slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; +#endif +#ifdef IPOL_T1 + slopeT[1] = (line.t[1][1] - line.t[1][0]) * invDeltaX; +#endif + +#ifdef SUBTEXEL + subPixel = ( (f32) xStart ) - line.x[0]; +#ifdef IPOL_Z + line.z[0] += slopeZ * subPixel; +#endif +#ifdef IPOL_W + line.w[0] += slopeW * subPixel; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC * subPixel; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0] * subPixel; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1] * subPixel; +#endif +#endif + + SOFTWARE_DRIVER_2_CLIPCHECK; + dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; + +#ifdef USE_ZBUFFER + //z = (fp24*) DepthBuffer->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart; +#endif + + + +#ifdef IPOL_C0 + tFixPoint r0, g0, b0; + + f32 inversew = FIX_POINT_F32_MUL * COLOR_MAX; + +#endif + + for ( s32 i = 0; i <= dx; ++i ) + { + if ( (0 == EdgeTestPass) & i ) break; + +#ifdef CMP_Z + if ( line.z[0] < z[i] ) +#endif +#ifdef CMP_W + if (line.w[0] >= z[i] ) +#endif + + { +#ifdef IPOL_C0 +#ifdef INVERSE_W + inversew = fix_inverse32_color(line.w[0]); +#endif + vec4_to_fix(r0, g0, b0, line.c[0][0], inversew); + dst[i] = fix_to_sample(r0, g0, b0); +#else + dst[i] = PrimitiveColor; +#endif + +#ifdef WRITE_Z + z[i] = line.z[0]; +#endif +#ifdef WRITE_W + z[i] = line.w[0]; +#endif + + } + +#ifdef IPOL_Z + line.z[0] += slopeZ; +#endif +#ifdef IPOL_W + line.w[0] += slopeW; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0]; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1]; +#endif + } + +} + +void CTRGouraudNoZ2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) +{ + // sort on height, y + if ( a->Pos.y > b->Pos.y ) swapVertexPointer(&a, &b); + if ( a->Pos.y > c->Pos.y ) swapVertexPointer(&a, &c); + if ( b->Pos.y > c->Pos.y ) swapVertexPointer(&b, &c); + + const f32 ca = c->Pos.y - a->Pos.y; + const f32 ba = b->Pos.y - a->Pos.y; + const f32 cb = c->Pos.y - b->Pos.y; + + // calculate delta y of the edges + scan.invDeltaY[0] = reciprocal_edge( ca ); + scan.invDeltaY[1] = reciprocal_edge( ba ); + scan.invDeltaY[2] = reciprocal_edge( cb ); + + if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) + return; + + // find if the major edge is left or right aligned + f32 temp[4]; + + temp[0] = a->Pos.x - c->Pos.x; + temp[1] = -ca; + temp[2] = b->Pos.x - a->Pos.x; + temp[3] = ba; + + scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1; + scan.right = 1 - scan.left; + + // calculate slopes for the major edge + scan.slopeX[0] = (c->Pos.x - a->Pos.x) * scan.invDeltaY[0]; + scan.x[0] = a->Pos.x; + +#ifdef IPOL_Z + scan.slopeZ[0] = (c->Pos.z - a->Pos.z) * scan.invDeltaY[0]; + scan.z[0] = a->Pos.z; +#endif + +#ifdef IPOL_W + scan.slopeW[0] = (c->Pos.w - a->Pos.w) * scan.invDeltaY[0]; + scan.w[0] = a->Pos.w; +#endif + +#ifdef IPOL_C0 + scan.slopeC[0][0] = (c->Color[0] - a->Color[0]) * scan.invDeltaY[0]; + scan.c[0][0] = a->Color[0]; +#endif + +#ifdef IPOL_T0 + scan.slopeT[0][0] = (c->Tex[0] - a->Tex[0]) * scan.invDeltaY[0]; + scan.t[0][0] = a->Tex[0]; +#endif + +#ifdef IPOL_T1 + scan.slopeT[1][0] = (c->Tex[1] - a->Tex[1]) * scan.invDeltaY[0]; + scan.t[1][0] = a->Tex[1]; +#endif + + // top left fill convention y run + s32 yStart; + s32 yEnd; + +#ifdef SUBTEXEL + f32 subPixel; +#endif + + + // rasterize upper sub-triangle + if ( (f32) 0.0 != scan.invDeltaY[1] ) + { + // calculate slopes for top edge + scan.slopeX[1] = (b->Pos.x - a->Pos.x) * scan.invDeltaY[1]; + scan.x[1] = a->Pos.x; + +#ifdef IPOL_Z + scan.slopeZ[1] = (b->Pos.z - a->Pos.z) * scan.invDeltaY[1]; + scan.z[1] = a->Pos.z; +#endif + +#ifdef IPOL_W + scan.slopeW[1] = (b->Pos.w - a->Pos.w) * scan.invDeltaY[1]; + scan.w[1] = a->Pos.w; +#endif + +#ifdef IPOL_C0 + scan.slopeC[0][1] = (b->Color[0] - a->Color[0]) * scan.invDeltaY[1]; + scan.c[0][1] = a->Color[0]; +#endif + +#ifdef IPOL_T0 + scan.slopeT[0][1] = (b->Tex[0] - a->Tex[0]) * scan.invDeltaY[1]; + scan.t[0][1] = a->Tex[0]; +#endif + +#ifdef IPOL_T1 + scan.slopeT[1][1] = (b->Tex[1] - a->Tex[1]) * scan.invDeltaY[1]; + scan.t[1][1] = a->Tex[1]; +#endif + + // apply top-left fill convention, top part + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); + +#ifdef SUBTEXEL + subPixel = ( (f32) yStart ) - a->Pos.y; + + // correct to pixel center + scan.x[0] += scan.slopeX[0] * subPixel; + scan.x[1] += scan.slopeX[1] * subPixel; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0] * subPixel; + scan.z[1] += scan.slopeZ[1] * subPixel; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0] * subPixel; + scan.w[1] += scan.slopeW[1] * subPixel; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0] * subPixel; + scan.c[0][1] += scan.slopeC[0][1] * subPixel; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0] * subPixel; + scan.t[0][1] += scan.slopeT[0][1] * subPixel; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0] * subPixel; + scan.t[1][1] += scan.slopeT[1][1] * subPixel; +#endif + +#endif + + // rasterize the edge scanlines + for( line.y = yStart; line.y <= yEnd; ++line.y) + { + line.x[scan.left] = scan.x[0]; + line.x[scan.right] = scan.x[1]; + +#ifdef IPOL_Z + line.z[scan.left] = scan.z[0]; + line.z[scan.right] = scan.z[1]; +#endif + +#ifdef IPOL_W + line.w[scan.left] = scan.w[0]; + line.w[scan.right] = scan.w[1]; +#endif + +#ifdef IPOL_C0 + line.c[0][scan.left] = scan.c[0][0]; + line.c[0][scan.right] = scan.c[0][1]; +#endif + +#ifdef IPOL_T0 + line.t[0][scan.left] = scan.t[0][0]; + line.t[0][scan.right] = scan.t[0][1]; +#endif + +#ifdef IPOL_T1 + line.t[1][scan.left] = scan.t[1][0]; + line.t[1][scan.right] = scan.t[1][1]; +#endif + + // render a scanline + scanline_bilinear (); + if ( EdgeTestPass & edge_test_first_line ) break; + + scan.x[0] += scan.slopeX[0]; + scan.x[1] += scan.slopeX[1]; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0]; + scan.z[1] += scan.slopeZ[1]; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0]; + scan.w[1] += scan.slopeW[1]; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0]; + scan.c[0][1] += scan.slopeC[0][1]; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0]; + scan.t[0][1] += scan.slopeT[0][1]; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0]; + scan.t[1][1] += scan.slopeT[1][1]; +#endif + } + } + + // rasterize lower sub-triangle + if ( (f32) 0.0 != scan.invDeltaY[2] ) + { + // advance to middle point + if( (f32) 0.0 != scan.invDeltaY[1] ) + { + temp[0] = b->Pos.y - a->Pos.y; // dy + + scan.x[0] = a->Pos.x + scan.slopeX[0] * temp[0]; +#ifdef IPOL_Z + scan.z[0] = a->Pos.z + scan.slopeZ[0] * temp[0]; +#endif +#ifdef IPOL_W + scan.w[0] = a->Pos.w + scan.slopeW[0] * temp[0]; +#endif +#ifdef IPOL_C0 + scan.c[0][0] = a->Color[0] + scan.slopeC[0][0] * temp[0]; +#endif +#ifdef IPOL_T0 + scan.t[0][0] = a->Tex[0] + scan.slopeT[0][0] * temp[0]; +#endif +#ifdef IPOL_T1 + scan.t[1][0] = a->Tex[1] + scan.slopeT[1][0] * temp[0]; +#endif + + } + + // calculate slopes for bottom edge + scan.slopeX[1] = (c->Pos.x - b->Pos.x) * scan.invDeltaY[2]; + scan.x[1] = b->Pos.x; + +#ifdef IPOL_Z + scan.slopeZ[1] = (c->Pos.z - b->Pos.z) * scan.invDeltaY[2]; + scan.z[1] = b->Pos.z; +#endif + +#ifdef IPOL_W + scan.slopeW[1] = (c->Pos.w - b->Pos.w) * scan.invDeltaY[2]; + scan.w[1] = b->Pos.w; +#endif + +#ifdef IPOL_C0 + scan.slopeC[0][1] = (c->Color[0] - b->Color[0]) * scan.invDeltaY[2]; + scan.c[0][1] = b->Color[0]; +#endif + +#ifdef IPOL_T0 + scan.slopeT[0][1] = (c->Tex[0] - b->Tex[0]) * scan.invDeltaY[2]; + scan.t[0][1] = b->Tex[0]; +#endif + +#ifdef IPOL_T1 + scan.slopeT[1][1] = (c->Tex[1] - b->Tex[1]) * scan.invDeltaY[2]; + scan.t[1][1] = b->Tex[1]; +#endif + + // apply top-left fill convention, top part + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); + +#ifdef SUBTEXEL + + subPixel = ( (f32) yStart ) - b->Pos.y; + + // correct to pixel center + scan.x[0] += scan.slopeX[0] * subPixel; + scan.x[1] += scan.slopeX[1] * subPixel; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0] * subPixel; + scan.z[1] += scan.slopeZ[1] * subPixel; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0] * subPixel; + scan.w[1] += scan.slopeW[1] * subPixel; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0] * subPixel; + scan.c[0][1] += scan.slopeC[0][1] * subPixel; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0] * subPixel; + scan.t[0][1] += scan.slopeT[0][1] * subPixel; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0] * subPixel; + scan.t[1][1] += scan.slopeT[1][1] * subPixel; +#endif + +#endif + + // rasterize the edge scanlines + for( line.y = yStart; line.y <= yEnd; ++line.y) + { + line.x[scan.left] = scan.x[0]; + line.x[scan.right] = scan.x[1]; + +#ifdef IPOL_Z + line.z[scan.left] = scan.z[0]; + line.z[scan.right] = scan.z[1]; +#endif + +#ifdef IPOL_W + line.w[scan.left] = scan.w[0]; + line.w[scan.right] = scan.w[1]; +#endif + +#ifdef IPOL_C0 + line.c[0][scan.left] = scan.c[0][0]; + line.c[0][scan.right] = scan.c[0][1]; +#endif + +#ifdef IPOL_T0 + line.t[0][scan.left] = scan.t[0][0]; + line.t[0][scan.right] = scan.t[0][1]; +#endif + +#ifdef IPOL_T1 + line.t[1][scan.left] = scan.t[1][0]; + line.t[1][scan.right] = scan.t[1][1]; +#endif + + // render a scanline + scanline_bilinear (); + if ( EdgeTestPass & edge_test_first_line ) break; + + scan.x[0] += scan.slopeX[0]; + scan.x[1] += scan.slopeX[1]; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0]; + scan.z[1] += scan.slopeZ[1]; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0]; + scan.w[1] += scan.slopeW[1]; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0]; + scan.c[0][1] += scan.slopeC[0][1]; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0]; + scan.t[0][1] += scan.slopeT[0][1]; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0]; + scan.t[1][1] += scan.slopeT[1][1]; +#endif + + } + } + +} + + +} // end namespace video +} // end namespace irr + +#endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ + +namespace irr +{ +namespace video +{ + +//! creates a flat triangle renderer +IBurningShader* createTriangleRendererGouraudNoZ2(CBurningVideoDriver* driver) +{ + //ETR_GOURAUD_NOZ - no texture no depth test no depth write + #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ + return new CTRGouraudNoZ2(driver); + #else + return 0; + #endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ +} + + +} // end namespace video +} // end namespace irr + + + diff --git a/source/Irrlicht/CTRNormalMap.cpp b/source/Irrlicht/CTRNormalMap.cpp index bc72b75c..5df81c7a 100644 --- a/source/Irrlicht/CTRNormalMap.cpp +++ b/source/Irrlicht/CTRNormalMap.cpp @@ -21,6 +21,7 @@ #undef INVERSE_W #undef IPOL_C0 +#undef IPOL_C1 #undef IPOL_T0 #undef IPOL_T1 #undef IPOL_T2 @@ -36,6 +37,7 @@ #define WRITE_W #define IPOL_C0 +#define IPOL_C1 #define IPOL_T0 #define IPOL_T1 #define IPOL_L0 @@ -49,10 +51,18 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif +#if BURNING_MATERIAL_MAX_COLORS < 2 + #undef IPOL_C1 +#endif + +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT < 1 + #undef IPOL_L0 +#endif + #if !defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) && defined ( USE_ZBUFFER ) #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT #undef IPOL_W @@ -87,14 +97,11 @@ public: CTRNormalMap(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; - + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; + virtual void OnSetMaterial(const SBurningShaderMaterial& material) _IRR_OVERRIDE_; private: - void scanline_bilinear (); - - sScanConvertData scan; - sScanLineData line; + void fragmentShader(); }; @@ -108,10 +115,13 @@ CTRNormalMap::CTRNormalMap(CBurningVideoDriver* driver) } +void CTRNormalMap::OnSetMaterial(const SBurningShaderMaterial& material) +{ +} /*! */ -void CTRNormalMap::scanline_bilinear () +void CTRNormalMap::fragmentShader() { tVideoSample *dst; @@ -135,18 +145,18 @@ void CTRNormalMap::scanline_bilinear () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif #ifdef IPOL_L0 - sVec3 slopeL[BURNING_MATERIAL_MAX_TANGENT]; + sVec3Pack_unpack slopeL[BURNING_MATERIAL_MAX_LIGHT_TANGENT]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -154,7 +164,7 @@ void CTRNormalMap::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -165,6 +175,9 @@ void CTRNormalMap::scanline_bilinear () #ifdef IPOL_C0 slopeC[0] = (line.c[0][1] - line.c[0][0]) * invDeltaX; #endif +#ifdef IPOL_C1 + slopeC[1] = (line.c[1][1] - line.c[1][0]) * invDeltaX; +#endif #ifdef IPOL_T0 slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; #endif @@ -189,6 +202,9 @@ void CTRNormalMap::scanline_bilinear () #ifdef IPOL_C0 line.c[0][0] += slopeC[0] * subPixel; #endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1] * subPixel; +#endif #ifdef IPOL_T0 line.t[0][0] += slopeT[0] * subPixel; #endif @@ -203,6 +219,7 @@ void CTRNormalMap::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -210,25 +227,33 @@ void CTRNormalMap::scanline_bilinear () #endif - f32 inversew; + f32 inversew = FIX_POINT_F32_MUL; - tFixPoint tx0, tx1; - tFixPoint ty0, ty1; + tFixPoint tx0, ty0; + +#ifdef IPOL_T1 + tFixPoint tx1, ty1; +#endif tFixPoint r0, g0, b0; tFixPoint r1, g1, b1; tFixPoint r2, g2, b2; +#ifdef IPOL_L0 tFixPoint lx, ly, lz; - tFixPoint ndotl; - - sVec3 light; +#endif + tFixPoint ndotl = FIX_POINT_ONE; #ifdef IPOL_C0 - tFixPoint r3, g3, b3; + tFixPoint a3,r3, g3, b3; #endif +#ifdef IPOL_C1 + tFixPoint aFog = FIX_POINT_ONE; +#endif + + for ( s32 i = 0; i <= dx; i++ ) { #ifdef CMP_Z @@ -240,88 +265,13 @@ void CTRNormalMap::scanline_bilinear () { #ifdef INVERSE_W inversew = fix_inverse32 ( line.w[0] ); - - tx0 = tofix ( line.t[0][0].x,inversew); - ty0 = tofix ( line.t[0][0].y,inversew); - tx1 = tofix ( line.t[1][0].x,inversew); - ty1 = tofix ( line.t[1][0].y,inversew); - +#endif #ifdef IPOL_C0 - r3 = tofix ( line.c[0][0].y ,inversew ); - g3 = tofix ( line.c[0][0].z ,inversew ); - b3 = tofix ( line.c[0][0].w ,inversew ); -#endif - -#else - inversew = FIX_POINT_F32_MUL; - tx0 = tofix(line.t[0][0].x, inversew); - ty0 = tofix(line.t[0][0].y, inversew); - tx1 = tofix(line.t[1][0].x, inversew); - ty1 = tofix(line.t[1][0].y, inversew); - -#ifdef IPOL_C0 - r3 = tofix ( line.c[0][0].y ); - g3 = tofix ( line.c[0][0].z ); - b3 = tofix ( line.c[0][0].w ); -#endif - -#endif - getSample_texture ( r0, g0, b0, &IT[0], tx0, ty0 ); - - // normal map - getSample_texture ( r1, g1, b1, &IT[1], tx1, ty1 ); - - r1 = ( r1 - FIX_POINT_HALF_COLOR) >> (COLOR_MAX_LOG2-1); - g1 = ( g1 - FIX_POINT_HALF_COLOR) >> (COLOR_MAX_LOG2-1); - b1 = ( b1 - FIX_POINT_HALF_COLOR) >> (COLOR_MAX_LOG2-1); - -/* - sVec3 l = line.l[0][0] * inversew; - l.setLength( 2.f ); - - lx = tofix ( l.x - 0.5f ); - ly = tofix ( l.y - 0.5f ); - lz = tofix ( l.z - 0.5f ); -*/ - - lx = tofix ( line.l[0][0].x, inversew ); - ly = tofix ( line.l[0][0].y, inversew ); - lz = tofix ( line.l[0][0].z, inversew ); - - // DOT 3 Normal Map light in tangent space - ndotl = saturateFix ( FIX_POINT_HALF_COLOR + (( imulFix ( r1, lx ) + imulFix ( g1, ly ) + imulFix ( b1, lz ) ) << (COLOR_MAX_LOG2-1)) ); - -#ifdef IPOL_C0 - - // N . L - r2 = imulFix ( imulFix_tex1 ( r0, ndotl ), r3 ); - g2 = imulFix ( imulFix_tex1 ( g0, ndotl ), g3 ); - b2 = imulFix ( imulFix_tex1 ( b0, ndotl ), b3 ); - -/* - // heightmap: (1 - neu ) + alt - 0.5, on_minus_srcalpha + add signed - // emboss bump map - a4 -= a1; - r2 = clampfix_maxcolor ( clampfix_mincolor ( imulFix ( r0 + a4, r3 ) ) ); - g2 = clampfix_maxcolor ( clampfix_mincolor ( imulFix ( g0 + a4, g3 ) ) ); - b2 = clampfix_maxcolor ( clampfix_mincolor ( imulFix ( b0 + a4, b3 ) ) ); -*/ - -/* - r2 = clampfix_maxcolor ( imulFix_tex1 ( r2, r1 ) ); - g2 = clampfix_maxcolor ( imulFix_tex1 ( g2, g1 ) ); - b2 = clampfix_maxcolor ( imulFix_tex1 ( b2, b1 ) ); -*/ -#else - r2 = clampfix_maxcolor ( imulFix_tex4 ( r0, r1 ) ); - g2 = clampfix_maxcolor ( imulFix_tex4 ( g0, g1 ) ); - b2 = clampfix_maxcolor ( imulFix_tex4 ( b0, b1 ) ); -#endif - - - dst[i] = fix_to_color ( r2, g2, b2 ); - + //vertex alpha blend ( and omit depthwrite ,hacky..) + a3 = tofix(line.c[0][0].x, inversew); + if (a3 + 2 >= FIX_POINT_ONE) + { #ifdef WRITE_Z z[i] = line.z[0]; #endif @@ -329,6 +279,87 @@ void CTRNormalMap::scanline_bilinear () z[i] = line.w[0]; #endif } +#endif + +#ifdef IPOL_C1 + //complete inside fog + if (TL_Flag & TL_FOG) + { + aFog = tofix(line.c[1][0].a, inversew); + if (aFog <= 0) + { + dst[i] = fog_color_sample; + continue; + } + } +#endif + + tx0 = tofix ( line.t[0][0].x,inversew); + ty0 = tofix ( line.t[0][0].y,inversew); + tx1 = tofix ( line.t[1][0].x,inversew); + ty1 = tofix ( line.t[1][0].y,inversew); + + // diffuse map + getSample_texture ( r0, g0, b0, &IT[0], tx0, ty0 ); + + // normal map ( same texcoord0 but different mipmapping) + getSample_texture ( r1, g1, b1, &IT[1], tx1, ty1 ); + + r1 = ( r1 - FIX_POINT_HALF_COLOR) >> (COLOR_MAX_LOG2-1); + g1 = ( g1 - FIX_POINT_HALF_COLOR) >> (COLOR_MAX_LOG2-1); + b1 = ( b1 - FIX_POINT_HALF_COLOR) >> (COLOR_MAX_LOG2-1); + +#ifdef IPOL_L0 + lx = tofix ( line.l[0][0].x, inversew ); + ly = tofix ( line.l[0][0].y, inversew ); + lz = tofix ( line.l[0][0].z, inversew ); + + // DOT 3 Normal Map light in tangent space + //max(dot(LightVector, Normal), 0.0); + ndotl = clampfix_mincolor( (imulFix_simple(r1,lx) + imulFix_simple(g1,ly) + imulFix_simple(b1,lz) ) ); +#endif + +#ifdef IPOL_C0 + + //LightColor[0] + r3 = tofix(line.c[0][0].y, inversew); + g3 = tofix(line.c[0][0].z, inversew); + b3 = tofix(line.c[0][0].w, inversew); + + // Lambert * LightColor[0] * Diffuse Texture; + r2 = imulFix (imulFix_simple( r3, ndotl ), r0 ); + g2 = imulFix (imulFix_simple( g3, ndotl ), g0 ); + b2 = imulFix (imulFix_simple( b3, ndotl ), b0 ); + + //vertex alpha blend ( and omit depthwrite ,hacky..) + if (a3 + 2 < FIX_POINT_ONE) + { + color_to_fix(r1, g1, b1, dst[i]); + r2 = r1 + imulFix(a3, r2 - r1); + g2 = g1 + imulFix(a3, g2 - g1); + b2 = b1 + imulFix(a3, b2 - b1); + } + +#ifdef IPOL_C1 + //mix with distance + if (aFog < FIX_POINT_ONE) + { + r2 = fog_color[1] + imulFix(aFog, r2 - fog_color[1]); + g2 = fog_color[2] + imulFix(aFog, g2 - fog_color[2]); + b2 = fog_color[3] + imulFix(aFog, b2 - fog_color[3]); + } +#endif + dst[i] = fix_to_sample(r2, g2, b2); + + +#else + r2 = imulFix_tex4 ( r0, r1 ); + g2 = imulFix_tex4 ( g0, g1 ); + b2 = imulFix_tex4 ( b0, b1 ); + dst[i] = fix_to_sample(r2, g2, b2); +#endif + + } #ifdef IPOL_Z line.z[0] += slopeZ; @@ -339,6 +370,9 @@ void CTRNormalMap::scanline_bilinear () #ifdef IPOL_C0 line.c[0][0] += slopeC[0]; #endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1]; +#endif #ifdef IPOL_T0 line.t[0][0] += slopeT[0]; #endif @@ -355,7 +389,7 @@ void CTRNormalMap::scanline_bilinear () } -void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRNormalMap::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -366,9 +400,9 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -403,6 +437,11 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 scan.c[0][0] = a->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][0] = (c->Color[1] - a->Color[1]) * scan.invDeltaY[0]; + scan.c[1][0] = a->Color[1]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][0] = (c->Tex[0] - a->Tex[0]) * scan.invDeltaY[0]; scan.t[0][0] = a->Tex[0]; @@ -433,7 +472,6 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 // rasterize upper sub-triangle - //if ( (f32) 0.0 != scan.invDeltaY[1] ) if ( F32_GREATER_0 ( scan.invDeltaY[1] ) ) { // calculate slopes for top edge @@ -455,6 +493,11 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 scan.c[0][1] = a->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][1] = (b->Color[1] - a->Color[1]) * scan.invDeltaY[1]; + scan.c[1][1] = a->Color[1]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][1] = (b->Tex[0] - a->Tex[0]) * scan.invDeltaY[1]; scan.t[0][1] = a->Tex[0]; @@ -476,8 +519,8 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -501,6 +544,11 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 scan.c[0][1] += scan.slopeC[0][1] * subPixel; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0] * subPixel; + scan.c[1][1] += scan.slopeC[1][1] * subPixel; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0] * subPixel; scan.t[0][1] += scan.slopeT[0][1] * subPixel; @@ -544,6 +592,11 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 line.c[0][scan.right] = scan.c[0][1]; #endif +#ifdef IPOL_C1 + line.c[1][scan.left] = scan.c[1][0]; + line.c[1][scan.right] = scan.c[1][1]; +#endif + #ifdef IPOL_T0 line.t[0][scan.left] = scan.t[0][0]; line.t[0][scan.right] = scan.t[0][1]; @@ -565,7 +618,7 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 #endif // render a scanline - scanline_bilinear (); + fragmentShader (); scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -585,6 +638,11 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 scan.c[0][1] += scan.slopeC[0][1]; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0]; + scan.c[1][1] += scan.slopeC[1][1]; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0]; scan.t[0][1] += scan.slopeT[0][1]; @@ -609,11 +667,9 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 } // rasterize lower sub-triangle - //if ( (f32) 0.0 != scan.invDeltaY[2] ) if ( F32_GREATER_0 ( scan.invDeltaY[2] ) ) { // advance to middle point - //if( (f32) 0.0 != scan.invDeltaY[1] ) if ( F32_GREATER_0 ( scan.invDeltaY[1] ) ) { temp[0] = b->Pos.y - a->Pos.y; // dy @@ -628,6 +684,9 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 #ifdef IPOL_C0 scan.c[0][0] = a->Color[0] + scan.slopeC[0][0] * temp[0]; #endif +#ifdef IPOL_C1 + scan.c[1][0] = a->Color[1] + scan.slopeC[1][0] * temp[0]; +#endif #ifdef IPOL_T0 scan.t[0][0] = a->Tex[0] + scan.slopeT[0][0] * temp[0]; #endif @@ -638,7 +697,7 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 scan.t[2][0] = a->Tex[2] + scan.slopeT[2][0] * temp[0]; #endif #ifdef IPOL_L0 - scan.l[0][0] = a->LightTangent[0] + scan.slopeL[0][0] * temp[0]; + scan.l[0][0] = sVec3Pack_unpack(a->LightTangent[0]) + scan.slopeL[0][0] * temp[0]; #endif } @@ -662,6 +721,11 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 scan.c[0][1] = b->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][1] = (c->Color[1] - b->Color[1]) * scan.invDeltaY[2]; + scan.c[1][1] = b->Color[1]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][1] = (c->Tex[0] - b->Tex[0]) * scan.invDeltaY[2]; scan.t[0][1] = b->Tex[0]; @@ -683,8 +747,8 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -709,6 +773,11 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 scan.c[0][1] += scan.slopeC[0][1] * subPixel; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0] * subPixel; + scan.c[1][1] += scan.slopeC[1][1] * subPixel; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0] * subPixel; scan.t[0][1] += scan.slopeT[0][1] * subPixel; @@ -752,6 +821,11 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 line.c[0][scan.right] = scan.c[0][1]; #endif +#ifdef IPOL_C1 + line.c[1][scan.left] = scan.c[1][0]; + line.c[1][scan.right] = scan.c[1][1]; +#endif + #ifdef IPOL_T0 line.t[0][scan.left] = scan.t[0][0]; line.t[0][scan.right] = scan.t[0][1]; @@ -773,7 +847,7 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 #endif // render a scanline - scanline_bilinear (); + fragmentShader(); scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -793,6 +867,11 @@ void CTRNormalMap::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4 scan.c[0][1] += scan.slopeC[0][1]; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0]; + scan.c[1][1] += scan.slopeC[1][1]; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0]; scan.t[0][1] += scan.slopeT[0][1]; diff --git a/source/Irrlicht/CTRStencilShadow.cpp b/source/Irrlicht/CTRStencilShadow.cpp index 02ed525d..82b5ed3d 100644 --- a/source/Irrlicht/CTRStencilShadow.cpp +++ b/source/Irrlicht/CTRStencilShadow.cpp @@ -47,7 +47,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -84,19 +84,10 @@ public: CTRStencilShadow(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; - virtual void setParam ( u32 index, f32 value) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: - // fragment shader - typedef void (CTRStencilShadow::*tFragmentShader) (); - void fragment_zfail_decr (); - void fragment_zfail_incr (); - - tFragmentShader fragmentShader; - - sScanConvertData scan; - sScanLineData line; + void fragmentShader(); }; @@ -112,36 +103,14 @@ CTRStencilShadow::CTRStencilShadow(CBurningVideoDriver* driver) /*! */ -void CTRStencilShadow::setParam ( u32 index, f32 value) +void CTRStencilShadow::fragmentShader() { - u32 val = (u32) value; - - // glStencilOp (fail,zfail,zpass - if ( index == 1 && val == 1 ) - { - fragmentShader = &CTRStencilShadow::fragment_zfail_incr; - } - else - if ( index == 1 && val == 2 ) - { - fragmentShader = &CTRStencilShadow::fragment_zfail_decr; - } -} - -/*! -*/ -void CTRStencilShadow::fragment_zfail_decr () -{ - if (!Stencil) - return; - //tVideoSample *dst; - #ifdef USE_ZBUFFER fp24 *z; #endif #ifdef USE_SBUFFER - u32 *stencil; + tStencilSample *stencil; #endif s32 xStart; @@ -158,27 +127,19 @@ void CTRStencilShadow::fragment_zfail_decr () #ifdef IPOL_W fp24 slopeW; #endif -#ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; -#endif -#ifdef IPOL_T0 - sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; -#endif -#ifdef IPOL_L0 - sVec3 slopeL[BURNING_MATERIAL_MAX_TANGENT]; -#endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; - if ( dx < 0 ) return; + SOFTWARE_DRIVER_2_CLIPCHECK; + // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -186,21 +147,6 @@ void CTRStencilShadow::fragment_zfail_decr () #ifdef IPOL_W slopeW = (line.w[1] - line.w[0]) * invDeltaX; #endif -#ifdef IPOL_C0 - slopeC[0] = (line.c[0][1] - line.c[0][0]) * invDeltaX; -#endif -#ifdef IPOL_T0 - slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; -#endif -#ifdef IPOL_T1 - slopeT[1] = (line.t[1][1] - line.t[1][0]) * invDeltaX; -#endif -#ifdef IPOL_T2 - slopeT[2] = (line.t[2][1] - line.t[2][0]) * invDeltaX; -#endif -#ifdef IPOL_L0 - slopeL[0] = (line.l[0][1] - line.l[0][0]) * invDeltaX; -#endif #ifdef SUBTEXEL subPixel = ( (f32) xStart ) - line.x[0]; @@ -210,23 +156,8 @@ void CTRStencilShadow::fragment_zfail_decr () #ifdef IPOL_W line.w[0] += slopeW * subPixel; #endif -#ifdef IPOL_C0 - line.c[0][0] += slopeC[0] * subPixel; #endif -#ifdef IPOL_T0 - line.t[0][0] += slopeT[0] * subPixel; -#endif -#ifdef IPOL_T1 - line.t[1][0] += slopeT[1] * subPixel; -#endif -#ifdef IPOL_T2 - line.t[2][0] += slopeT[2] * subPixel; -#endif -#ifdef IPOL_L0 - line.l[0][0] += slopeL[0] * subPixel; -#endif -#endif - + SOFTWARE_DRIVER_2_CLIPCHECK; //dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -234,30 +165,43 @@ void CTRStencilShadow::fragment_zfail_decr () #endif #ifdef USE_SBUFFER - stencil = (u32*) Stencil->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart; + stencil = (tStencilSample*) Stencil->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #endif #ifdef INVERSE_W - f32 inversew; + f32 inversew = FIX_POINT_F32_MUL; #endif - -#ifdef IPOL_C0 - tFixPoint r3, g3, b3; -#endif - - for ( s32 i = 0; i <= dx; i++ ) + s32 i; + for (i = 0; i <= dx; i++) { #ifdef CMP_Z - if ( line.z[0] < z[i] ) + if (line.z[0] < z[i]) #endif #ifdef CMP_W - if ( line.w[0] < z[i] ) + if (line.w[0] > z[i]) #endif + { + // zpass + switch (stencilOp[2]) + { + case StencilOp_INCR: stencil[i] += 1; break; + case StencilOp_DECR: stencil[i] -= 1; break;// core::s32_max(0, stencil[i] - 1); break; + default: + case StencilOp_KEEP: break; + } + } + else { // zfail - stencil[i] -= 1; + switch (stencilOp[1]) + { + case StencilOp_INCR: stencil[i] += 1; break; + case StencilOp_DECR: stencil[i] -= 1; break;// core::s32_max(0, stencil[i] - 1); break; + default: + case StencilOp_KEEP: break; + } } #ifdef IPOL_Z @@ -265,181 +209,13 @@ void CTRStencilShadow::fragment_zfail_decr () #endif #ifdef IPOL_W line.w[0] += slopeW; -#endif -#ifdef IPOL_C0 - line.c[0][0] += slopeC[0]; -#endif -#ifdef IPOL_T0 - line.t[0][0] += slopeT[0]; -#endif -#ifdef IPOL_T1 - line.t[1][0] += slopeT[1]; -#endif -#ifdef IPOL_T2 - line.t[2][0] += slopeT[2]; -#endif -#ifdef IPOL_L0 - line.l[0][0] += slopeL[0]; #endif } + } -/*! -*/ -void CTRStencilShadow::fragment_zfail_incr() -{ - if (!Stencil) - return; - //tVideoSample *dst; -#ifdef USE_ZBUFFER - fp24 *z; -#endif - -#ifdef USE_SBUFFER - u32 *stencil; -#endif - - s32 xStart; - s32 xEnd; - s32 dx; - - -#ifdef SUBTEXEL - f32 subPixel; -#endif - -#ifdef IPOL_Z - f32 slopeZ; -#endif -#ifdef IPOL_W - fp24 slopeW; -#endif -#ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; -#endif -#ifdef IPOL_T0 - sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; -#endif -#ifdef IPOL_L0 - sVec3 slopeL[BURNING_MATERIAL_MAX_TANGENT]; -#endif - - // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; - - dx = xEnd - xStart; - - if ( dx < 0 ) - return; - - // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); - -#ifdef IPOL_Z - slopeZ = (line.z[1] - line.z[0]) * invDeltaX; -#endif -#ifdef IPOL_W - slopeW = (line.w[1] - line.w[0]) * invDeltaX; -#endif -#ifdef IPOL_C0 - slopeC[0] = (line.c[0][1] - line.c[0][0]) * invDeltaX; -#endif -#ifdef IPOL_T0 - slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; -#endif -#ifdef IPOL_T1 - slopeT[1] = (line.t[1][1] - line.t[1][0]) * invDeltaX; -#endif -#ifdef IPOL_T2 - slopeT[2] = (line.t[2][1] - line.t[2][0]) * invDeltaX; -#endif -#ifdef IPOL_L0 - slopeL[0] = (line.l[0][1] - line.l[0][0]) * invDeltaX; -#endif - -#ifdef SUBTEXEL - subPixel = ( (f32) xStart ) - line.x[0]; -#ifdef IPOL_Z - line.z[0] += slopeZ * subPixel; -#endif -#ifdef IPOL_W - line.w[0] += slopeW * subPixel; -#endif -#ifdef IPOL_C0 - line.c[0][0] += slopeC[0] * subPixel; -#endif -#ifdef IPOL_T0 - line.t[0][0] += slopeT[0] * subPixel; -#endif -#ifdef IPOL_T1 - line.t[1][0] += slopeT[1] * subPixel; -#endif -#ifdef IPOL_T2 - line.t[2][0] += slopeT[2] * subPixel; -#endif -#ifdef IPOL_L0 - line.l[0][0] += slopeL[0] * subPixel; -#endif -#endif - - //dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; - -#ifdef USE_ZBUFFER - z = (fp24*) DepthBuffer->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart; -#endif - -#ifdef USE_SBUFFER - stencil = (u32*) Stencil->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart; -#endif - -#ifdef INVERSE_W - f32 inversew; -#endif - -#ifdef IPOL_C0 - tFixPoint r3, g3, b3; -#endif - - for ( s32 i = 0; i <= dx; i++ ) - { -#ifdef CMP_Z - if ( line.z[0] < z[i] ) -#endif -#ifdef CMP_W - if ( line.w[0] < z[i] ) -#endif - { - // zfail - stencil[i] += 1; - } - -#ifdef IPOL_Z - line.z[0] += slopeZ; -#endif -#ifdef IPOL_W - line.w[0] += slopeW; -#endif -#ifdef IPOL_C0 - line.c[0][0] += slopeC[0]; -#endif -#ifdef IPOL_T0 - line.t[0][0] += slopeT[0]; -#endif -#ifdef IPOL_T1 - line.t[1][0] += slopeT[1]; -#endif -#ifdef IPOL_T2 - line.t[2][0] += slopeT[2]; -#endif -#ifdef IPOL_L0 - line.l[0][0] += slopeL[0]; -#endif - } -} - -void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRStencilShadow::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -450,9 +226,9 @@ void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -516,7 +292,6 @@ void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons #endif // rasterize upper sub-triangle - //if ( (f32) 0.0 != scan.invDeltaY[1] ) if ( F32_GREATER_0 ( scan.invDeltaY[1] ) ) { // calculate slopes for top edge @@ -559,8 +334,8 @@ void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -648,7 +423,7 @@ void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons #endif // render a scanline - (this->*fragmentShader) (); + fragmentShader (); scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -766,8 +541,8 @@ void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -856,7 +631,7 @@ void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons #endif // render a scanline - (this->*fragmentShader) (); + fragmentShader (); scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -915,6 +690,7 @@ namespace video //! creates a triangle renderer IBurningShader* createTRStencilShadow(CBurningVideoDriver* driver) { + //ETR_STENCIL_SHADOW #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRStencilShadow(driver); #else diff --git a/source/Irrlicht/CTRTextureBlend.cpp b/source/Irrlicht/CTRTextureBlend.cpp index e3ba0791..da178eb1 100644 --- a/source/Irrlicht/CTRTextureBlend.cpp +++ b/source/Irrlicht/CTRTextureBlend.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -76,19 +76,32 @@ namespace irr namespace video { -class CTRTextureBlend : public IBurningShader -{ -public: + class CTRTextureBlend : public IBurningShader + { + public: - //! constructor - CTRTextureBlend(CBurningVideoDriver* driver); + //! constructor + CTRTextureBlend(CBurningVideoDriver* driver); - //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + //! draws an indexed triangle list + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; + virtual void OnSetMaterial(const SBurningShaderMaterial& material) _IRR_OVERRIDE_; - virtual void setZCompareFunc ( u32 func) _IRR_OVERRIDE_; - virtual void setParam ( u32 index, f32 value) _IRR_OVERRIDE_; +#if defined(PATCH_SUPERTUX_8_0_1) + virtual void setZCompareFunc(u32 func) + { + depth_func = (E_COMPARISON_FUNC)func; + } + virtual void setParam(u32 index, f32 value) + { + SBurningShaderMaterial material; + material.org.ZBuffer = depth_func; + material.org.MaterialTypeParam = value; + OnSetMaterial(material); + } + +#endif private: // fragment shader @@ -102,12 +115,11 @@ private: void fragment_one_one_minus_src_alpha (); void fragment_one_minus_dst_alpha_one(); void fragment_src_alpha_one(); + void fragment_src_alpha_one_minus_src_alpha(); tFragmentShader fragmentShader; - sScanConvertData scan; - sScanLineData line; - u32 ZCompare; + E_COMPARISON_FUNC depth_func; }; //! constructor @@ -118,26 +130,23 @@ CTRTextureBlend::CTRTextureBlend(CBurningVideoDriver* driver) setDebugName("CTRTextureBlend"); #endif - ZCompare = 1; + depth_func = ECFN_LESSEQUAL; + fragmentShader = &CTRTextureBlend::fragment_dst_color_zero; } /*! */ -void CTRTextureBlend::setZCompareFunc ( u32 func) +void CTRTextureBlend::OnSetMaterial(const SBurningShaderMaterial& material) { - ZCompare = func; -} + int showname = 0; -/*! -*/ -void CTRTextureBlend::setParam ( u32 index, f32 value) -{ - u8 showname = 0; + depth_func = (E_COMPARISON_FUNC)material.org.ZBuffer; + AlphaRef = 0; // tofix(material.org.MaterialTypeParam, FIXPOINT_COLOR_MAX); E_BLEND_FACTOR srcFact,dstFact; E_MODULATE_FUNC modulate; u32 alphaSrc; - unpack_textureBlendFunc ( srcFact, dstFact, modulate, alphaSrc, value ); + unpack_textureBlendFunc ( srcFact, dstFact, modulate, alphaSrc, material.org.MaterialTypeParam); fragmentShader = 0; @@ -145,43 +154,39 @@ void CTRTextureBlend::setParam ( u32 index, f32 value) { fragmentShader = &CTRTextureBlend::fragment_dst_color_zero; } - else - if ( srcFact == EBF_DST_COLOR && dstFact == EBF_ONE ) + else if ( srcFact == EBF_DST_COLOR && dstFact == EBF_ONE ) { fragmentShader = &CTRTextureBlend::fragment_dst_color_one; } - else - if ( srcFact == EBF_DST_COLOR && dstFact == EBF_SRC_ALPHA) + else if ( srcFact == EBF_DST_COLOR && dstFact == EBF_SRC_ALPHA) { fragmentShader = &CTRTextureBlend::fragment_dst_color_src_alpha; } - else - if ( srcFact == EBF_DST_COLOR && dstFact == EBF_ONE_MINUS_DST_ALPHA) + else if ( srcFact == EBF_DST_COLOR && dstFact == EBF_ONE_MINUS_DST_ALPHA) { fragmentShader = &CTRTextureBlend::fragment_dst_color_one_minus_dst_alpha; } - else - if ( srcFact == EBF_ZERO && dstFact == EBF_ONE_MINUS_SRC_COLOR ) + else if ( srcFact == EBF_ZERO && dstFact == EBF_ONE_MINUS_SRC_COLOR ) { fragmentShader = &CTRTextureBlend::fragment_zero_one_minus_scr_color; } - else - if ( srcFact == EBF_ONE && dstFact == EBF_ONE_MINUS_SRC_ALPHA) + else if ( srcFact == EBF_ONE && dstFact == EBF_ONE_MINUS_SRC_ALPHA) { fragmentShader = &CTRTextureBlend::fragment_one_one_minus_src_alpha; } - else - if ( srcFact == EBF_ONE_MINUS_DST_ALPHA && dstFact == EBF_ONE ) + else if ( srcFact == EBF_ONE_MINUS_DST_ALPHA && dstFact == EBF_ONE ) { fragmentShader = &CTRTextureBlend::fragment_one_minus_dst_alpha_one; } - else - if ( srcFact == EBF_SRC_ALPHA && dstFact == EBF_ONE ) + else if ( srcFact == EBF_SRC_ALPHA && dstFact == EBF_ONE ) { fragmentShader = &CTRTextureBlend::fragment_src_alpha_one; } - else - if ( srcFact == EBF_SRC_COLOR && dstFact == EBF_SRC_ALPHA ) + else if (srcFact == EBF_SRC_ALPHA && dstFact == EBF_ONE_MINUS_SRC_ALPHA) + { + fragmentShader = &CTRTextureBlend::fragment_src_alpha_one_minus_src_alpha; + } + else if ( srcFact == EBF_SRC_COLOR && dstFact == EBF_SRC_ALPHA ) { fragmentShader = &CTRTextureBlend::fragment_src_color_src_alpha; } @@ -213,7 +218,7 @@ void CTRTextureBlend::setParam ( u32 index, f32 value) { char buf[128]; snprintf_irr ( buf, 128, "missing shader: %s %s",n[srcFact], n[dstFact] ); - os::Printer::log( buf, ELL_INFORMATION ); + os::Printer::log( buf, ELL_WARNING); lsrcFact = srcFact; ldstFact = dstFact; @@ -248,15 +253,15 @@ void CTRTextureBlend::fragment_dst_color_src_alpha () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -264,7 +269,7 @@ void CTRTextureBlend::fragment_dst_color_src_alpha () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -301,6 +306,7 @@ void CTRTextureBlend::fragment_dst_color_src_alpha () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -315,9 +321,10 @@ void CTRTextureBlend::fragment_dst_color_src_alpha () s32 i; - switch ( ZCompare ) + switch (depth_func) { - case 1: + default: + case ECFN_LESSEQUAL: for ( i = 0; i <= dx; ++i ) { #ifdef CMP_W @@ -342,7 +349,7 @@ void CTRTextureBlend::fragment_dst_color_src_alpha () color_to_fix ( r1, g1, b1, dst[i] ); - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex2 ( r0, r1 ) ), + dst[i] = fix_to_sample( clampfix_maxcolor ( imulFix_tex2 ( r0, r1 ) ), clampfix_maxcolor ( imulFix_tex2 ( g0, g1 ) ), clampfix_maxcolor ( imulFix_tex2 ( b0, b1 ) ) ); @@ -385,7 +392,7 @@ void CTRTextureBlend::fragment_dst_color_src_alpha () color_to_fix ( r1, g1, b1, dst[i] ); - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex2 ( r0, r1 ) ), + dst[i] = fix_to_sample( clampfix_maxcolor ( imulFix_tex2 ( r0, r1 ) ), clampfix_maxcolor ( imulFix_tex2 ( g0, g1 ) ), clampfix_maxcolor ( imulFix_tex2 ( b0, b1 ) ) ); @@ -432,23 +439,22 @@ void CTRTextureBlend::fragment_src_color_src_alpha () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; - if ( dx < 0 ) return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -485,6 +491,7 @@ void CTRTextureBlend::fragment_src_color_src_alpha () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -497,11 +504,16 @@ void CTRTextureBlend::fragment_src_color_src_alpha () tFixPoint a0, r0, g0, b0; tFixPoint r1, g1, b1; +#ifdef IPOL_C0 + tFixPoint a2,r2, g2, b2; +#endif + s32 i; - switch ( ZCompare ) + switch (depth_func) { - case 1: + default: + case ECFN_LESSEQUAL: for ( i = 0; i <= dx; ++i ) { #ifdef CMP_W @@ -509,9 +521,9 @@ void CTRTextureBlend::fragment_src_color_src_alpha () #endif { - + //solves example 08. todo: depth_write. #ifdef WRITE_W - z[i] = line.w[0]; + //z[i] = line.w[0]; #endif #ifdef INVERSE_W @@ -519,13 +531,21 @@ void CTRTextureBlend::fragment_src_color_src_alpha () #endif getSample_texture ( a0, r0, g0, b0, &IT[0], tofix ( line.t[0][0].x,iw), tofix ( line.t[0][0].y,iw) ); - color_to_fix ( r1, g1, b1, dst[i] ); -// u32 check = imulFix_tex1( r0, r1 ); - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex1( r0, r1 ) + imulFix_tex1( r1, a0 ) ), - clampfix_maxcolor ( imulFix_tex1( g0, g1 ) + imulFix_tex1( g1, a0 ) ), - clampfix_maxcolor ( imulFix_tex1( b0, b1 ) + imulFix_tex1( b1, a0 ) ) +#ifdef IPOL_C0 + vec4_to_fix(a2,r2, g2, b2, line.c[0][0], iw); + //a0 = imulFix(a0, a2); why is vertex color enabled and not vertex_alpha? + r0 = imulFix_simple(r0, r2); + g0 = imulFix_simple(g0, g2); + b0 = imulFix_simple(b0, b2); +#endif + + color_to_fix ( r1, g1, b1, dst[i] ); + dst[i] = fix_to_sample( clampfix_maxcolor ( imulFix_tex1( r0, r0 ) + imulFix_tex1( r1, a0 ) ), + clampfix_maxcolor ( imulFix_tex1( g0, g0 ) + imulFix_tex1( g1, a0 ) ), + clampfix_maxcolor ( imulFix_tex1( b0, b0 ) + imulFix_tex1( b1, a0 ) ) ); + } #ifdef IPOL_W @@ -565,7 +585,7 @@ void CTRTextureBlend::fragment_src_color_src_alpha () color_to_fix ( r1, g1, b1, dst[i] ); - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex2 ( r0, r1 ) ), + dst[i] = fix_to_sample( clampfix_maxcolor ( imulFix_tex2 ( r0, r1 ) ), clampfix_maxcolor ( imulFix_tex2 ( g0, g1 ) ), clampfix_maxcolor ( imulFix_tex2 ( b0, b1 ) ) ); @@ -582,6 +602,7 @@ void CTRTextureBlend::fragment_src_color_src_alpha () line.c[0][0] += slopeC[0]; #endif }break; + } // zcompare } @@ -612,15 +633,15 @@ void CTRTextureBlend::fragment_one_one_minus_src_alpha() fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -628,7 +649,7 @@ void CTRTextureBlend::fragment_one_one_minus_src_alpha() return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2 ( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -665,6 +686,7 @@ void CTRTextureBlend::fragment_one_one_minus_src_alpha() #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -676,13 +698,15 @@ void CTRTextureBlend::fragment_one_one_minus_src_alpha() tFixPoint a0,r0, g0, b0; tFixPoint r1, g1, b1; +#ifdef IPOL_C0 tFixPoint r2, g2, b2; - +#endif s32 i; - switch ( ZCompare ) + switch (depth_func) { - case 1: + default: + case ECFN_LESSEQUAL: for ( i = 0; i <= dx; ++i ) { #ifdef CMP_W @@ -704,16 +728,16 @@ void CTRTextureBlend::fragment_one_one_minus_src_alpha() color_to_fix1 ( r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); - dst[i] = fix_to_color ( imulFix ( r0 + imulFix ( r1, a0 ), r2 ), - imulFix ( g0 + imulFix ( g1, a0 ), g2 ), - imulFix ( b0 + imulFix ( b1, a0 ), b2 ) + dst[i] = fix_to_sample( imulFix ( r0 + imulFix_simple( r1, a0 ), r2 ), + imulFix ( g0 + imulFix_simple( g1, a0 ), g2 ), + imulFix ( b0 + imulFix_simple( b1, a0 ), b2 ) ); #else - dst[i] = fix_to_color ( r0 + imulFix ( r1, a0 ), - g0 + imulFix ( g1, a0 ), - b0 + imulFix ( b1, a0 ) + dst[i] = fix_to_sample( r0 + imulFix_simple( r1, a0 ), + g0 + imulFix_simple( g1, a0 ), + b0 + imulFix_simple( b1, a0 ) ); #endif @@ -753,16 +777,16 @@ void CTRTextureBlend::fragment_one_one_minus_src_alpha() color_to_fix1 ( r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); - dst[i] = fix_to_color ( imulFix ( r0 + imulFix ( r1, a0 ), r2 ), - imulFix ( g0 + imulFix ( g1, a0 ), g2 ), - imulFix ( b0 + imulFix ( b1, a0 ), b2 ) + dst[i] = fix_to_sample( imulFix ( r0 + imulFix_simple( r1, a0 ), r2 ), + imulFix ( g0 + imulFix_simple( g1, a0 ), g2 ), + imulFix ( b0 + imulFix_simple( b1, a0 ), b2 ) ); #else - dst[i] = fix_to_color ( r0 + imulFix ( r1, a0 ), - g0 + imulFix ( g1, a0 ), - b0 + imulFix ( b1, a0 ) + dst[i] = fix_to_sample( r0 + imulFix_simple( r1, a0 ), + g0 + imulFix_simple( g1, a0 ), + b0 + imulFix_simple( b1, a0 ) ); #endif @@ -779,6 +803,7 @@ void CTRTextureBlend::fragment_one_one_minus_src_alpha() line.c[0][0] += slopeC[0]; #endif }break; + } // zcompare } @@ -809,15 +834,15 @@ void CTRTextureBlend::fragment_one_minus_dst_alpha_one () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -825,7 +850,7 @@ void CTRTextureBlend::fragment_one_minus_dst_alpha_one () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -862,6 +887,7 @@ void CTRTextureBlend::fragment_one_minus_dst_alpha_one () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -873,13 +899,15 @@ void CTRTextureBlend::fragment_one_minus_dst_alpha_one () tFixPoint r0, g0, b0; tFixPoint a1, r1, g1, b1; +#ifdef IPOL_C0 tFixPoint r2, g2, b2; - +#endif s32 i; - switch ( ZCompare ) + switch (depth_func) { - case 1: + default: + case ECFN_LESSEQUAL: for ( i = 0; i <= dx; ++i ) { #ifdef CMP_W @@ -899,17 +927,17 @@ void CTRTextureBlend::fragment_one_minus_dst_alpha_one () getSample_texture ( r0, g0, b0, IT + 0, tofix ( line.t[0][0].x,iw),tofix ( line.t[0][0].y,iw) ); color_to_fix1 ( a1, r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); a1 = FIX_POINT_ONE - a1; - dst[i] = fix_to_color ( imulFix ( imulFix ( r0, a1 ) + r1, r2 ), - imulFix ( imulFix ( g0, a1 ) + g1, g2 ), - imulFix ( imulFix ( b0, a1 ) + b1, b2 ) + dst[i] = fix_to_sample( imulFix (imulFix_simple( r0, a1 ) + r1, r2 ), + imulFix (imulFix_simple( g0, a1 ) + g1, g2 ), + imulFix (imulFix_simple( b0, a1 ) + b1, b2 ) ); #else - dst[i] = fix_to_color ( imulFix ( r0, a1) + r0, - imulFix ( g0, a1) + g0, - imulFix ( b0, a1) + b0 + dst[i] = fix_to_sample(imulFix_simple( r0, a1) + r0, + imulFix_simple( g0, a1) + g0, + imulFix_simple( b0, a1) + b0 ); #endif @@ -948,17 +976,17 @@ void CTRTextureBlend::fragment_one_minus_dst_alpha_one () color_to_fix1 ( a1, r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); a1 = FIX_POINT_ONE - a1; - dst[i] = fix_to_color ( imulFix ( imulFix ( r0, a1 ) + r1, r2 ), - imulFix ( imulFix ( g0, a1 ) + g1, g2 ), - imulFix ( imulFix ( b0, a1 ) + b1, b2 ) + dst[i] = fix_to_sample( imulFix (imulFix_simple( r0, a1 ) + r1, r2 ), + imulFix (imulFix_simple( g0, a1 ) + g1, g2 ), + imulFix (imulFix_simple( b0, a1 ) + b1, b2 ) ); #else - dst[i] = fix_to_color ( imulFix ( r0, a1) + r0, - imulFix ( g0, a1) + g0, - imulFix ( b0, a1) + b0 + dst[i] = fix_to_sample(imulFix_simple( r0, a1) + r0, + imulFix_simple( g0, a1) + g0, + imulFix_simple( b0, a1) + b0 ); #endif @@ -975,6 +1003,7 @@ void CTRTextureBlend::fragment_one_minus_dst_alpha_one () line.c[0][0] += slopeC[0]; #endif }break; + } // zcompare } @@ -1005,15 +1034,15 @@ void CTRTextureBlend::fragment_src_alpha_one () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -1021,7 +1050,7 @@ void CTRTextureBlend::fragment_src_alpha_one () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -1058,6 +1087,7 @@ void CTRTextureBlend::fragment_src_alpha_one () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -1069,13 +1099,15 @@ void CTRTextureBlend::fragment_src_alpha_one () tFixPoint a0, r0, g0, b0; tFixPoint r1, g1, b1; +#ifdef IPOL_C0 tFixPoint r2, g2, b2; - +#endif s32 i; - switch ( ZCompare ) + switch (depth_func) { - case 1: + default: + case ECFN_LESSEQUAL: for ( i = 0; i <= dx; ++i ) { #ifdef CMP_W @@ -1092,32 +1124,32 @@ void CTRTextureBlend::fragment_src_alpha_one () getSample_texture ( a0, r0, g0, b0, IT + 0, tofix ( line.t[0][0].x,iw),tofix ( line.t[0][0].y,iw) ); if ( a0 > 0 ) { - a0 >>= 8; + fix_color_norm(a0); color_to_fix ( r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); - dst[i] = fix4_to_color ( a0, - clampfix_maxcolor ( imulFix (r0,a0 ) + r1), - clampfix_maxcolor ( imulFix (g0,a0 ) + g1), - clampfix_maxcolor ( imulFix (b0,a0 ) + b1) + dst[i] = fix4_to_sample( a0, + clampfix_maxcolor (imulFix_simple(r0,a0) + r1), + clampfix_maxcolor (imulFix_simple(g0,a0) + g1), + clampfix_maxcolor (imulFix_simple(b0,a0) + b1) ); /* - a0 >>= 8; - dst[i] = fix4_to_color ( a0, - imulFix ( imulFix ( r0, a0 ) + r1, r2 ), - imulFix ( imulFix ( g0, a0 ) + g1, g2 ), - imulFix ( imulFix ( b0, a0 ) + b1, b2 ) + fix_color_norm(a0); + dst[i] = fix4_to_sample ( a0, + imulFix ( imulFix_simple ( r0, a0 ) + r1, r2 ), + imulFix ( imulFix_simple ( g0, a0 ) + g1, g2 ), + imulFix ( imulFix_simple ( b0, a0 ) + b1, b2 ) ); */ #else - dst[i] = fix4_to_color ( a0, - clampfix_maxcolor ( imulFix (r0,a0 ) + r1 ), - clampfix_maxcolor ( imulFix (g0,a0 ) + g1 ), - clampfix_maxcolor ( imulFix (b0,a0 ) + b1 ) + dst[i] = fix4_to_sample( a0, + clampfix_maxcolor (imulFix_simple(r0,a0 ) + r1 ), + clampfix_maxcolor (imulFix_simple(g0,a0 ) + g1 ), + clampfix_maxcolor (imulFix_simple(b0,a0 ) + b1 ) ); #endif @@ -1156,32 +1188,32 @@ void CTRTextureBlend::fragment_src_alpha_one () getSample_texture ( a0, r0, g0, b0, IT + 0, tofix ( line.t[0][0].x,iw),tofix ( line.t[0][0].y,iw) ); if ( a0 > 0 ) { - a0 >>= 8; + fix_color_norm(a0); color_to_fix ( r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); - dst[i] = fix4_to_color ( a0, - clampfix_maxcolor ( imulFix ( imulFix (r0,a0 ) + r1, r2 ) ), - clampfix_maxcolor ( imulFix ( imulFix (g0,a0 ) + g1, g2 ) ), - clampfix_maxcolor ( imulFix ( imulFix (b0,a0 ) + b1, b2 ) ) + dst[i] = fix4_to_sample( a0, + clampfix_maxcolor ( imulFix (imulFix_simple(r0,a0 ) + r1, r2 ) ), + clampfix_maxcolor ( imulFix (imulFix_simple(g0,a0 ) + g1, g2 ) ), + clampfix_maxcolor ( imulFix (imulFix_simple(b0,a0 ) + b1, b2 ) ) ); /* - a0 >>= 8; - dst[i] = fix4_to_color ( a0, - imulFix ( imulFix ( r0, a0 ) + r1, r2 ), - imulFix ( imulFix ( g0, a0 ) + g1, g2 ), - imulFix ( imulFix ( b0, a0 ) + b1, b2 ) + fix_color_norm(a0); + dst[i] = fix4_to_sample ( a0, + imulFix ( imulFix_simple ( r0, a0 ) + r1, r2 ), + imulFix ( imulFix_simple ( g0, a0 ) + g1, g2 ), + imulFix ( imulFix_simple ( b0, a0 ) + b1, b2 ) ); */ #else - dst[i] = fix4_to_color ( a0, - clampfix_maxcolor ( imulFix (r0,a0 ) + r1 ), - clampfix_maxcolor ( imulFix (g0,a0 ) + g1 ), - clampfix_maxcolor ( imulFix (b0,a0 ) + b1 ) + dst[i] = fix4_to_sample( a0, + clampfix_maxcolor (imulFix_simple(r0,a0 ) + r1 ), + clampfix_maxcolor (imulFix_simple(g0,a0 ) + g1 ), + clampfix_maxcolor (imulFix_simple(b0,a0 ) + b1 ) ); #endif @@ -1201,6 +1233,160 @@ void CTRTextureBlend::fragment_src_alpha_one () line.c[0][0] += slopeC[0]; #endif }break; + + } // zcompare + +} + + +/*! +*/ +void CTRTextureBlend::fragment_src_alpha_one_minus_src_alpha() +{ + tVideoSample *dst; + +#ifdef USE_ZBUFFER + fp24 *z; +#endif + + s32 xStart; + s32 xEnd; + s32 dx; + + +#ifdef SUBTEXEL + f32 subPixel; +#endif + +#ifdef IPOL_Z + f32 slopeZ; +#endif +#ifdef IPOL_W + fp24 slopeW; +#endif +#ifdef IPOL_C0 + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; +#endif +#ifdef IPOL_T0 + sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; +#endif + + // apply top-left fill-convention, left + xStart = fill_convention_left(line.x[0]); + xEnd = fill_convention_right(line.x[1]); + + dx = xEnd - xStart; + if (dx < 0) + return; + + // slopes + const f32 invDeltaX = reciprocal_zero2(line.x[1] - line.x[0]); + +#ifdef IPOL_Z + slopeZ = (line.z[1] - line.z[0]) * invDeltaX; +#endif +#ifdef IPOL_W + slopeW = (line.w[1] - line.w[0]) * invDeltaX; +#endif +#ifdef IPOL_C0 + slopeC[0] = (line.c[0][1] - line.c[0][0]) * invDeltaX; +#endif +#ifdef IPOL_T0 + slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; +#endif +#ifdef IPOL_T1 + slopeT[1] = (line.t[1][1] - line.t[1][0]) * invDeltaX; +#endif + +#ifdef SUBTEXEL + subPixel = ((f32)xStart) - line.x[0]; +#ifdef IPOL_Z + line.z[0] += slopeZ * subPixel; +#endif +#ifdef IPOL_W + line.w[0] += slopeW * subPixel; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC[0] * subPixel; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0] * subPixel; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1] * subPixel; +#endif +#endif + + SOFTWARE_DRIVER_2_CLIPCHECK; + dst = (tVideoSample*)RenderTarget->getData() + (line.y * RenderTarget->getDimension().Width) + xStart; + +#ifdef USE_ZBUFFER + z = (fp24*)DepthBuffer->lock() + (line.y * RenderTarget->getDimension().Width) + xStart; +#endif + + + f32 iw = FIX_POINT_F32_MUL; + + tFixPoint a0, r0, g0, b0; + tFixPoint r1, g1, b1; + tFixPoint a2, r2, g2, b2; + + s32 i; + + switch (depth_func) + { + default: + case ECFN_LESSEQUAL: + for (i = 0; i <= dx; ++i) + { +#ifdef CMP_W + if (line.w[0] >= z[i]) +#endif + + { +#ifdef WRITE_W + //z[i] = line.w[0]; +#endif + +#ifdef INVERSE_W + iw = fix_inverse32(line.w[0]); +#endif + + getSample_texture(a0, r0, g0, b0, &IT[0], tofix(line.t[0][0].x, iw), tofix(line.t[0][0].y, iw)); + if (a0 > AlphaRef) + { +#ifdef IPOL_C0 + vec4_to_fix(a2, r2, g2, b2, line.c[0][0], iw); + //a0 = imulFix(a0, a2); why is vertex color enabled and not vertex_alpha? + r0 = imulFix_simple(r0, r2); + g0 = imulFix_simple(g0, g2); + b0 = imulFix_simple(b0, b2); +#endif + + color_to_fix(r1, g1, b1, dst[i]); + + fix_color_norm(a0); + + r2 = r1 + imulFix(a0, r0 - r1); + g2 = g1 + imulFix(a0, g0 - g1); + b2 = b1 + imulFix(a0, b0 - b1); + dst[i] = fix4_to_sample(a0, r2, g2, b2); + } + + } + +#ifdef IPOL_W + line.w[0] += slopeW; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0]; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC[0]; +#endif + } + break; + } // zcompare } @@ -1232,15 +1418,15 @@ void CTRTextureBlend::fragment_dst_color_one_minus_dst_alpha () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -1248,7 +1434,7 @@ void CTRTextureBlend::fragment_dst_color_one_minus_dst_alpha () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -1285,6 +1471,7 @@ void CTRTextureBlend::fragment_dst_color_one_minus_dst_alpha () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -1296,13 +1483,15 @@ void CTRTextureBlend::fragment_dst_color_one_minus_dst_alpha () tFixPoint r0, g0, b0; tFixPoint a1, r1, g1, b1; +#ifdef IPOL_C0 tFixPoint r2, g2, b2; - +#endif s32 i; - switch ( ZCompare ) + switch (depth_func) { - case 1: + default: + case ECFN_LESSEQUAL: for ( i = 0; i <= dx; ++i ) { #ifdef CMP_W @@ -1322,15 +1511,15 @@ void CTRTextureBlend::fragment_dst_color_one_minus_dst_alpha () getSample_texture ( r0, g0, b0, IT + 0, tofix ( line.t[0][0].x,iw),tofix ( line.t[0][0].y,iw) ); color_to_fix1 ( a1, r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); a1 = FIX_POINT_ONE - a1; - dst[i] = fix_to_color ( imulFix ( imulFix ( r1, r0 + a1 ), r2 ), + dst[i] = fix_to_sample( imulFix ( imulFix ( r1, r0 + a1 ), r2 ), imulFix ( imulFix ( g1, g0 + a1 ), g2 ), imulFix ( imulFix ( b1, b0 + a1 ), b2 ) ); #else - dst[i] = fix_to_color ( imulFix ( r1, r0 + a1 ), + dst[i] = fix_to_sample( imulFix ( r1, r0 + a1 ), imulFix ( g1, g0 + a1 ), imulFix ( b1, b0 + a1 ) ); @@ -1371,15 +1560,15 @@ void CTRTextureBlend::fragment_dst_color_one_minus_dst_alpha () color_to_fix1 ( a1, r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); a1 = FIX_POINT_ONE - a1; - dst[i] = fix_to_color ( imulFix ( imulFix ( r1, r0 + a1 ), r2 ), + dst[i] = fix_to_sample( imulFix ( imulFix ( r1, r0 + a1 ), r2 ), imulFix ( imulFix ( g1, g0 + a1 ), g2 ), imulFix ( imulFix ( b1, b0 + a1 ), b2 ) ); #else - dst[i] = fix_to_color ( imulFix ( r1, r0 + a1 ), + dst[i] = fix_to_sample( imulFix ( r1, r0 + a1 ), imulFix ( g1, g0 + a1 ), imulFix ( b1, b0 + a1 ) ); @@ -1428,15 +1617,15 @@ void CTRTextureBlend::fragment_dst_color_zero () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -1444,7 +1633,7 @@ void CTRTextureBlend::fragment_dst_color_zero () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -1481,6 +1670,7 @@ void CTRTextureBlend::fragment_dst_color_zero () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -1492,13 +1682,15 @@ void CTRTextureBlend::fragment_dst_color_zero () tFixPoint r0, g0, b0; tFixPoint r1, g1, b1; +#ifdef IPOL_C0 tFixPoint r2, g2, b2; - +#endif s32 i; - switch ( ZCompare ) + switch (depth_func) { - case 1: + default: + case ECFN_LESSEQUAL: for ( i = 0; i <= dx; ++i ) { #ifdef CMP_W @@ -1519,15 +1711,15 @@ void CTRTextureBlend::fragment_dst_color_zero () color_to_fix1 ( r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); - dst[i] = fix_to_color ( imulFix ( imulFix ( r0, r1 ), r2 ), - imulFix ( imulFix ( g0, g1 ), g2 ), - imulFix ( imulFix ( b0, b1 ), b2 ) ); + dst[i] = fix_to_sample( imulFix (imulFix_simple( r0, r1 ), r2 ), + imulFix (imulFix_simple( g0, g1 ), g2 ), + imulFix (imulFix_simple( b0, b1 ), b2 ) ); #else - dst[i] = fix_to_color ( imulFix ( r0, r1 ), - imulFix ( g0, g1 ), - imulFix ( b0, b1 ) + dst[i] = fix_to_sample(imulFix_simple( r0, r1 ), + imulFix_simple( g0, g1 ), + imulFix_simple( b0, b1 ) ); #endif @@ -1566,16 +1758,16 @@ void CTRTextureBlend::fragment_dst_color_zero () color_to_fix1 ( r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); - dst[i] = fix_to_color ( imulFix ( imulFix ( r0, r1 ), r2 ), - imulFix ( imulFix ( g0, g1 ), g2 ), - imulFix ( imulFix ( b0, b1 ), b2 ) + dst[i] = fix_to_sample( imulFix (imulFix_simple( r0, r1 ), r2 ), + imulFix (imulFix_simple( g0, g1 ), g2 ), + imulFix (imulFix_simple( b0, b1 ), b2 ) ); #else - dst[i] = fix_to_color ( imulFix ( r0, r1 ), - imulFix ( g0, g1 ), - imulFix ( b0, b1 ) + dst[i] = fix_to_sample(imulFix_simple( r0, r1 ), + imulFix_simple( g0, g1 ), + imulFix_simple( b0, b1 ) ); #endif @@ -1622,15 +1814,15 @@ void CTRTextureBlend::fragment_dst_color_one () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -1638,7 +1830,7 @@ void CTRTextureBlend::fragment_dst_color_one () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -1675,6 +1867,7 @@ void CTRTextureBlend::fragment_dst_color_one () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -1686,13 +1879,15 @@ void CTRTextureBlend::fragment_dst_color_one () tFixPoint r0, g0, b0; tFixPoint r1, g1, b1; +#ifdef IPOL_C0 tFixPoint r2, g2, b2; - +#endif s32 i; - switch ( ZCompare ) + switch (depth_func) { - case 1: + default: + case ECFN_LESSEQUAL: for ( i = 0; i <= dx; ++i ) { #ifdef CMP_W @@ -1712,15 +1907,15 @@ void CTRTextureBlend::fragment_dst_color_one () getSample_texture ( r0, g0, b0, IT + 0, tofix ( line.t[0][0].x,iw),tofix ( line.t[0][0].y,iw) ); color_to_fix ( r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex1 ( r0, r1 ) + r1 ), + dst[i] = fix_to_sample( clampfix_maxcolor ( imulFix_tex1 ( r0, r1 ) + r1 ), clampfix_maxcolor ( imulFix_tex1 ( g0, g1 ) + g1 ), clampfix_maxcolor ( imulFix_tex1 ( b0, b1 ) + b1 ) ); #else - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex1 ( r0, r1 ) + r1 ), + dst[i] = fix_to_sample( clampfix_maxcolor ( imulFix_tex1 ( r0, r1 ) + r1 ), clampfix_maxcolor ( imulFix_tex1 ( g0, g1 ) + g1 ), clampfix_maxcolor ( imulFix_tex1 ( b0, b1 ) + b1 ) ); @@ -1761,15 +1956,15 @@ void CTRTextureBlend::fragment_dst_color_one () color_to_fix ( r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex1 ( r0, r1 ) + r1 ), + dst[i] = fix_to_sample( clampfix_maxcolor ( imulFix_tex1 ( r0, r1 ) + r1 ), clampfix_maxcolor ( imulFix_tex1 ( g0, g1 ) + g1 ), clampfix_maxcolor ( imulFix_tex1 ( b0, b1 ) + b1 ) ); #else - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex1 ( r0, r1 ) + r1 ), + dst[i] = fix_to_sample( clampfix_maxcolor ( imulFix_tex1 ( r0, r1 ) + r1 ), clampfix_maxcolor ( imulFix_tex1 ( g0, g1 ) + g1 ), clampfix_maxcolor ( imulFix_tex1 ( b0, b1 ) + b1 ) ); @@ -1819,15 +2014,15 @@ void CTRTextureBlend::fragment_zero_one_minus_scr_color () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -1835,7 +2030,7 @@ void CTRTextureBlend::fragment_zero_one_minus_scr_color () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -1872,6 +2067,7 @@ void CTRTextureBlend::fragment_zero_one_minus_scr_color () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -1883,13 +2079,15 @@ void CTRTextureBlend::fragment_zero_one_minus_scr_color () tFixPoint r0, g0, b0; tFixPoint r1, g1, b1; +#ifdef IPOL_C0 tFixPoint r2, g2, b2; - +#endif s32 i; - switch ( ZCompare ) + switch (depth_func) { - case 1: + default: + case ECFN_LESSEQUAL: for ( i = 0; i <= dx; ++i ) { #ifdef CMP_W @@ -1909,17 +2107,17 @@ void CTRTextureBlend::fragment_zero_one_minus_scr_color () getSample_texture ( r0, g0, b0, IT + 0, tofix ( line.t[0][0].x,iw),tofix ( line.t[0][0].y,iw) ); color_to_fix1 ( r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); - dst[i] = fix_to_color ( imulFix ( FIX_POINT_ONE - r0, r1 ), - imulFix ( FIX_POINT_ONE - g0, g1 ), - imulFix ( FIX_POINT_ONE - b0, b1 ) + dst[i] = fix_to_sample(imulFix( FIX_POINT_ONE - r0, r1 ), + imulFix( FIX_POINT_ONE - g0, g1 ), + imulFix( FIX_POINT_ONE - b0, b1 ) ); #else - dst[i] = fix_to_color ( imulFix ( FIX_POINT_ONE - r0, r1 ), - imulFix ( FIX_POINT_ONE - g0, g1 ), - imulFix ( FIX_POINT_ONE - b0, b1 ) + dst[i] = fix_to_sample(imulFix( FIX_POINT_ONE - r0, r1 ), + imulFix( FIX_POINT_ONE - g0, g1 ), + imulFix( FIX_POINT_ONE - b0, b1 ) ); #endif @@ -1957,17 +2155,17 @@ void CTRTextureBlend::fragment_zero_one_minus_scr_color () getSample_texture ( r0, g0, b0, IT + 0, tofix ( line.t[0][0].x,iw),tofix ( line.t[0][0].y,iw) ); color_to_fix1 ( r1, g1, b1, dst[i] ); #ifdef IPOL_C0 - getSample_color ( r2, g2, b2, line.c[0][0],iw ); + vec4_to_fix( r2, g2, b2, line.c[0][0],iw ); - dst[i] = fix_to_color ( imulFix ( FIX_POINT_ONE - r0, r1 ), - imulFix ( FIX_POINT_ONE - g0, g1 ), - imulFix ( FIX_POINT_ONE - b0, b1 ) + dst[i] = fix_to_sample(imulFix( FIX_POINT_ONE - r0, r1 ), + imulFix( FIX_POINT_ONE - g0, g1 ), + imulFix( FIX_POINT_ONE - b0, b1 ) ); #else - dst[i] = fix_to_color ( imulFix ( FIX_POINT_ONE - r0, r1 ), - imulFix ( FIX_POINT_ONE - g0, g1 ), - imulFix ( FIX_POINT_ONE - b0, b1 ) + dst[i] = fix_to_sample(imulFix( FIX_POINT_ONE - r0, r1 ), + imulFix( FIX_POINT_ONE - g0, g1 ), + imulFix( FIX_POINT_ONE - b0, b1 ) ); #endif @@ -1990,7 +2188,7 @@ void CTRTextureBlend::fragment_zero_one_minus_scr_color () -void CTRTextureBlend::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureBlend::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { if ( 0 == fragmentShader ) return; @@ -2004,9 +2202,9 @@ void CTRTextureBlend::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -2092,8 +2290,8 @@ void CTRTextureBlend::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -2251,8 +2449,8 @@ void CTRTextureBlend::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -2371,6 +2569,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTRTextureBlend(CBurningVideoDriver* driver) { + // EMT_ONETEXTURE_BLEND #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRTextureBlend(driver); #else diff --git a/source/Irrlicht/CTRTextureDetailMap2.cpp b/source/Irrlicht/CTRTextureDetailMap2.cpp index f5653ab5..3e75c2d9 100644 --- a/source/Irrlicht/CTRTextureDetailMap2.cpp +++ b/source/Irrlicht/CTRTextureDetailMap2.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -84,13 +84,11 @@ public: CTRTextureDetailMap2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; + virtual bool canWireFrame () { return true; } - -private: - void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; +protected: + virtual void scanline_bilinear (); }; @@ -138,8 +136,8 @@ void CTRTextureDetailMap2::scanline_bilinear () #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -147,7 +145,7 @@ void CTRTextureDetailMap2::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -184,6 +182,7 @@ void CTRTextureDetailMap2::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -203,6 +202,8 @@ void CTRTextureDetailMap2::scanline_bilinear () for ( s32 i = 0; i <= dx; ++i ) { + if ( (0 == EdgeTestPass) & i ) break; + #ifdef CMP_Z if ( line.z[0] < z[i] ) #endif @@ -222,16 +223,13 @@ void CTRTextureDetailMap2::scanline_bilinear () getSample_texture ( r0, g0, b0, &IT[0], tx0,ty0 ); getSample_texture ( r1, g1, b1, &IT[1], tx1,ty1 ); - // bias half color - r1 += -FIX_POINT_HALF_COLOR; - g1 += -FIX_POINT_HALF_COLOR; - b1 += -FIX_POINT_HALF_COLOR; + // add signed - r2 = clampfix_mincolor ( clampfix_maxcolor ( r0 + r1 ) ); - g2 = clampfix_mincolor ( clampfix_maxcolor ( g0 + g1 ) ); - b2 = clampfix_mincolor ( clampfix_maxcolor ( b0 + b1 ) ); + r2 = clampfix_mincolor ( clampfix_maxcolor ( r0 + r1 - FIX_POINT_HALF_COLOR ) ); + g2 = clampfix_mincolor ( clampfix_maxcolor ( g0 + g1 - FIX_POINT_HALF_COLOR ) ); + b2 = clampfix_mincolor ( clampfix_maxcolor ( b0 + b1 - FIX_POINT_HALF_COLOR ) ); - dst[i] = fix_to_color ( r2, g2, b2 ); + dst[i] = fix_to_sample( r2, g2, b2 ); #ifdef WRITE_Z z[i] = line.z[0]; @@ -261,7 +259,7 @@ void CTRTextureDetailMap2::scanline_bilinear () } -void CTRTextureDetailMap2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureDetailMap2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -272,9 +270,9 @@ void CTRTextureDetailMap2::drawTriangle ( const s4DVertex *a,const s4DVertex *b, const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_edge( ca ); + scan.invDeltaY[1] = reciprocal_edge( ba ); + scan.invDeltaY[2] = reciprocal_edge( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -360,8 +358,8 @@ void CTRTextureDetailMap2::drawTriangle ( const s4DVertex *a,const s4DVertex *b, #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -519,8 +517,8 @@ void CTRTextureDetailMap2::drawTriangle ( const s4DVertex *a,const s4DVertex *b, #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL diff --git a/source/Irrlicht/CTRTextureGouraud2.cpp b/source/Irrlicht/CTRTextureGouraud2.cpp index 7bcc512b..ef864606 100644 --- a/source/Irrlicht/CTRTextureGouraud2.cpp +++ b/source/Irrlicht/CTRTextureGouraud2.cpp @@ -21,8 +21,11 @@ #undef INVERSE_W #undef IPOL_C0 +#undef IPOL_C1 +#undef IPOL_C2 #undef IPOL_T0 #undef IPOL_T1 +#undef IPOL_L0 // define render case #define SUBTEXEL @@ -34,8 +37,11 @@ #define WRITE_W #define IPOL_C0 +#define IPOL_C1 +//#define IPOL_C2 #define IPOL_T0 //#define IPOL_T1 +//#define IPOL_L0 // apply global override #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT @@ -46,10 +52,23 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif +#if BURNING_MATERIAL_MAX_COLORS < 2 + #undef IPOL_C1 +#endif + +#if BURNING_MATERIAL_MAX_COLORS < 3 +#undef IPOL_C2 +#endif + +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT < 1 + #undef IPOL_L0 +#endif + + #if !defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) && defined ( USE_ZBUFFER ) #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT #undef IPOL_W @@ -83,14 +102,12 @@ public: CTRTextureGouraud2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; + virtual bool canWireFrame () { return true; } private: - void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; - + void fragmentShader (); }; //! constructor @@ -106,7 +123,7 @@ CTRTextureGouraud2::CTRTextureGouraud2(CBurningVideoDriver* driver) /*! */ -void CTRTextureGouraud2::scanline_bilinear () +void CTRTextureGouraud2::fragmentShader () { tVideoSample *dst; @@ -130,15 +147,19 @@ void CTRTextureGouraud2::scanline_bilinear () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif +#ifdef IPOL_L0 + sVec3Pack_unpack slopeL[BURNING_MATERIAL_MAX_LIGHT_TANGENT]; +#endif + // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -146,7 +167,7 @@ void CTRTextureGouraud2::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -155,7 +176,13 @@ void CTRTextureGouraud2::scanline_bilinear () slopeW = (line.w[1] - line.w[0]) * invDeltaX; #endif #ifdef IPOL_C0 - slopeC = (line.c[0][1] - line.c[0][0]) * invDeltaX; + slopeC[0] = (line.c[0][1] - line.c[0][0]) * invDeltaX; +#endif +#ifdef IPOL_C1 + slopeC[1] = (line.c[1][1] - line.c[1][0]) * invDeltaX; +#endif +#ifdef IPOL_C2 + slopeC[2] = (line.c[2][1] - line.c[2][0]) * invDeltaX; #endif #ifdef IPOL_T0 slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; @@ -163,6 +190,10 @@ void CTRTextureGouraud2::scanline_bilinear () #ifdef IPOL_T1 slopeT[1] = (line.t[1][1] - line.t[1][0]) * invDeltaX; #endif +#ifdef IPOL_L0 + slopeL[0] = (line.l[0][1] - line.l[0][0]) * invDeltaX; +#endif + #ifdef SUBTEXEL subPixel = ( (f32) xStart ) - line.x[0]; @@ -173,7 +204,13 @@ void CTRTextureGouraud2::scanline_bilinear () line.w[0] += slopeW * subPixel; #endif #ifdef IPOL_C0 - line.c[0][0] += slopeC * subPixel; + line.c[0][0] += slopeC[0] * subPixel; +#endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1] * subPixel; +#endif +#ifdef IPOL_C2 + line.c[2][0] += slopeC[2] * subPixel; #endif #ifdef IPOL_T0 line.t[0][0] += slopeT[0] * subPixel; @@ -181,8 +218,12 @@ void CTRTextureGouraud2::scanline_bilinear () #ifdef IPOL_T1 line.t[1][0] += slopeT[1] * subPixel; #endif +#ifdef IPOL_L0 + line.l[0][0] += slopeL[0] * subPixel; +#endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -195,18 +236,29 @@ void CTRTextureGouraud2::scanline_bilinear () tFixPoint tx0; tFixPoint ty0; - tFixPoint r0, g0, b0; - #ifdef IPOL_C0 + tFixPoint r0, g0, b0; tFixPoint r1, g1, b1; #endif -#ifdef BURNINGVIDEO_RENDERER_FAST +#ifdef IPOL_C1 + tFixPoint aFog = FIX_POINT_ONE; +#endif + + +#ifdef IPOL_C2 + tFixPoint r3, g3, b3; +#endif + +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff u32 dIndex = ( line.y & 3 ) << 2; #endif for ( s32 i = 0; i <= dx; ++i ) { + //if test active only first pixel + if ( (0 == EdgeTestPass) & i ) break; + #ifdef CMP_Z if ( line.z[0] < z[i] ) #endif @@ -221,41 +273,70 @@ void CTRTextureGouraud2::scanline_bilinear () z[i] = line.w[0]; #endif - #ifdef INVERSE_W inversew = fix_inverse32 ( line.w[0] ); +#endif + +#ifdef IPOL_C1 + //complete inside fog + if (TL_Flag & TL_FOG) + { + aFog = tofix(line.c[1][0].a, inversew); + if (aFog <= 0) + { + dst[i] = fog_color_sample; + continue; + } + } +#endif tx0 = tofix ( line.t[0][0].x, inversew); ty0 = tofix ( line.t[0][0].y, inversew); + #ifdef IPOL_C0 - r1 = tofix ( line.c[0][0].y ,inversew ); - g1 = tofix ( line.c[0][0].z ,inversew ); - b1 = tofix ( line.c[0][0].w ,inversew ); + + getSample_texture(r0, g0, b0, &IT[0], tx0, ty0); + vec4_to_fix(r1, g1, b1, line.c[0][0], inversew); + + r0 = imulFix_simple(r0, r1); + g0 = imulFix_simple(g0, g1); + b0 = imulFix_simple(b0, b1); + +#ifdef IPOL_C1 + + //specular highlight + if (TL_Flag & TL_SPECULAR) + { + vec4_to_fix(r1, g1, b1, line.c[1][0], inversew*COLOR_MAX); + r0 = clampfix_maxcolor(r1 + r0); + g0 = clampfix_maxcolor(g1 + g0); + b0 = clampfix_maxcolor(b1 + b0); + } + //mix with distance + if (aFog < FIX_POINT_ONE) + { + r0 = fog_color[1] + imulFix(aFog, r0 - fog_color[1]); + g0 = fog_color[2] + imulFix(aFog, g0 - fog_color[2]); + b0 = fog_color[3] + imulFix(aFog, b0 - fog_color[3]); + } + dst[i] = fix_to_sample(r0, g0, b0); + +#else + dst[i] = fix_to_sample( + imulFix_simple(r0, r1), + imulFix_simple(g0, g1), + imulFix_simple(b0, b1) + ); #endif #else - tx0 = tofix(line.t[0][0].x, inversew); - ty0 = tofix(line.t[0][0].y, inversew); -#ifdef IPOL_C0 - getTexel_plain2 ( r1, g1, b1, line.c[0][0] ); -#endif -#endif -#ifdef IPOL_C0 - getSample_texture ( r0, g0, b0, &IT[0], tx0,ty0 ); - - dst[i] = fix_to_color ( imulFix ( r0, r1 ), - imulFix ( g0, g1 ), - imulFix ( b0, b1 ) - ); -#else - -#ifdef BURNINGVIDEO_RENDERER_FAST +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff const tFixPointu d = dithermask [ dIndex | ( i ) & 3 ]; dst[i] = getTexel_plain ( &IT[0], d + tx0, d + ty0 ); #else getSample_texture ( r0, g0, b0, &IT[0], tx0,ty0 ); - dst[i] = fix_to_color ( r0, g0, b0 ); + dst[i] = fix_to_sample( r0, g0, b0 ); #endif #endif @@ -269,19 +350,28 @@ void CTRTextureGouraud2::scanline_bilinear () line.w[0] += slopeW; #endif #ifdef IPOL_C0 - line.c[0][0] += slopeC; + line.c[0][0] += slopeC[0]; +#endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1]; +#endif +#ifdef IPOL_C2 + line.c[2][0] += slopeC[2]; #endif #ifdef IPOL_T0 line.t[0][0] += slopeT[0]; #endif #ifdef IPOL_T1 line.t[1][0] += slopeT[1]; +#endif +#ifdef IPOL_L0 + line.l[0][0] += slopeL[0]; #endif } } -void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureGouraud2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -292,9 +382,9 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -329,6 +419,16 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.c[0][0] = a->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][0] = (c->Color[1] - a->Color[1]) * scan.invDeltaY[0]; + scan.c[1][0] = a->Color[1]; +#endif + +#ifdef IPOL_C2 + scan.slopeC[2][0] = (c->Color[2] - a->Color[2]) * scan.invDeltaY[0]; + scan.c[2][0] = a->Color[2]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][0] = (c->Tex[0] - a->Tex[0]) * scan.invDeltaY[0]; scan.t[0][0] = a->Tex[0]; @@ -339,6 +439,11 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.t[1][0] = a->Tex[1]; #endif +#ifdef IPOL_L0 + scan.slopeL[0][0] = (c->LightTangent[0] - a->LightTangent[0]) * scan.invDeltaY[0]; + scan.l[0][0] = a->LightTangent[0]; +#endif + // top left fill convention y run s32 yStart; s32 yEnd; @@ -348,7 +453,7 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co #endif // rasterize upper sub-triangle - if ( (f32) 0.0 != scan.invDeltaY[1] ) + if ( F32_GREATER_0(scan.invDeltaY[1]) ) { // calculate slopes for top edge scan.slopeX[1] = (b->Pos.x - a->Pos.x) * scan.invDeltaY[1]; @@ -369,6 +474,16 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.c[0][1] = a->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][1] = (b->Color[1] - a->Color[1]) * scan.invDeltaY[1]; + scan.c[1][1] = a->Color[1]; +#endif + +#ifdef IPOL_C2 + scan.slopeC[2][1] = (b->Color[2] - a->Color[2]) * scan.invDeltaY[1]; + scan.c[2][1] = a->Color[2]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][1] = (b->Tex[0] - a->Tex[0]) * scan.invDeltaY[1]; scan.t[0][1] = a->Tex[0]; @@ -379,9 +494,14 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.t[1][1] = a->Tex[1]; #endif +#ifdef IPOL_L0 + scan.slopeL[0][1] = (b->LightTangent[0] - a->LightTangent[0]) * scan.invDeltaY[1]; + scan.l[0][1] = a->LightTangent[0]; +#endif + // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -405,6 +525,16 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.c[0][1] += scan.slopeC[0][1] * subPixel; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0] * subPixel; + scan.c[1][1] += scan.slopeC[1][1] * subPixel; +#endif + +#ifdef IPOL_C2 + scan.c[2][0] += scan.slopeC[2][0] * subPixel; + scan.c[2][1] += scan.slopeC[2][1] * subPixel; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0] * subPixel; scan.t[0][1] += scan.slopeT[0][1] * subPixel; @@ -415,6 +545,11 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.t[1][1] += scan.slopeT[1][1] * subPixel; #endif +#ifdef IPOL_L0 + scan.l[0][0] += scan.slopeL[0][0] * subPixel; + scan.l[0][1] += scan.slopeL[0][1] * subPixel; +#endif + #endif // rasterize the edge scanlines @@ -438,6 +573,16 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co line.c[0][scan.right] = scan.c[0][1]; #endif +#ifdef IPOL_C1 + line.c[1][scan.left] = scan.c[1][0]; + line.c[1][scan.right] = scan.c[1][1]; +#endif + +#ifdef IPOL_C2 + line.c[2][scan.left] = scan.c[2][0]; + line.c[2][scan.right] = scan.c[2][1]; +#endif + #ifdef IPOL_T0 line.t[0][scan.left] = scan.t[0][0]; line.t[0][scan.right] = scan.t[0][1]; @@ -448,8 +593,15 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co line.t[1][scan.right] = scan.t[1][1]; #endif +#ifdef IPOL_L0 + line.l[0][scan.left] = scan.l[0][0]; + line.l[0][scan.right] = scan.l[0][1]; +#endif + // render a scanline - scanline_bilinear (); + fragmentShader (); + if ( EdgeTestPass & edge_test_first_line ) break; + scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -469,6 +621,16 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.c[0][1] += scan.slopeC[0][1]; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0]; + scan.c[1][1] += scan.slopeC[1][1]; +#endif + +#ifdef IPOL_C2 + scan.c[2][0] += scan.slopeC[2][0]; + scan.c[2][1] += scan.slopeC[2][1]; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0]; scan.t[0][1] += scan.slopeT[0][1]; @@ -479,14 +641,19 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.t[1][1] += scan.slopeT[1][1]; #endif +#ifdef IPOL_L0 + scan.l[0][0] += scan.slopeL[0][0]; + scan.l[0][1] += scan.slopeL[0][1]; +#endif + } } // rasterize lower sub-triangle - if ( (f32) 0.0 != scan.invDeltaY[2] ) + if (F32_GREATER_0(scan.invDeltaY[2]) ) { // advance to middle point - if( (f32) 0.0 != scan.invDeltaY[1] ) + if(F32_GREATER_0(scan.invDeltaY[1]) ) { temp[0] = b->Pos.y - a->Pos.y; // dy @@ -500,6 +667,12 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co #ifdef IPOL_C0 scan.c[0][0] = a->Color[0] + scan.slopeC[0][0] * temp[0]; #endif +#ifdef IPOL_C1 + scan.c[1][0] = a->Color[1] + scan.slopeC[1][0] * temp[0]; +#endif +#ifdef IPOL_C2 + scan.c[2][0] = a->Color[2] + scan.slopeC[2][0] * temp[0]; +#endif #ifdef IPOL_T0 scan.t[0][0] = a->Tex[0] + scan.slopeT[0][0] * temp[0]; #endif @@ -507,6 +680,9 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.t[1][0] = a->Tex[1] + scan.slopeT[1][0] * temp[0]; #endif +#ifdef IPOL_L0 + scan.l[0][0] = sVec3Pack_unpack(a->LightTangent[0]) + scan.slopeL[0][0] * temp[0]; +#endif } // calculate slopes for bottom edge @@ -528,6 +704,16 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.c[0][1] = b->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][1] = (c->Color[1] - b->Color[1]) * scan.invDeltaY[2]; + scan.c[1][1] = b->Color[1]; +#endif + +#ifdef IPOL_C2 + scan.slopeC[2][1] = (c->Color[2] - b->Color[2]) * scan.invDeltaY[2]; + scan.c[2][1] = b->Color[2]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][1] = (c->Tex[0] - b->Tex[0]) * scan.invDeltaY[2]; scan.t[0][1] = b->Tex[0]; @@ -538,9 +724,14 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.t[1][1] = b->Tex[1]; #endif +#ifdef IPOL_L0 + scan.slopeL[0][1] = (c->LightTangent[0] - b->LightTangent[0]) * scan.invDeltaY[2]; + scan.l[0][1] = b->LightTangent[0]; +#endif + // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -565,6 +756,16 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.c[0][1] += scan.slopeC[0][1] * subPixel; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0] * subPixel; + scan.c[1][1] += scan.slopeC[1][1] * subPixel; +#endif + +#ifdef IPOL_C1 + scan.c[2][0] += scan.slopeC[2][0] * subPixel; + scan.c[2][1] += scan.slopeC[2][1] * subPixel; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0] * subPixel; scan.t[0][1] += scan.slopeT[0][1] * subPixel; @@ -575,6 +776,11 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.t[1][1] += scan.slopeT[1][1] * subPixel; #endif +#ifdef IPOL_L0 + scan.l[0][0] += scan.slopeL[0][0] * subPixel; + scan.l[0][1] += scan.slopeL[0][1] * subPixel; +#endif + #endif // rasterize the edge scanlines @@ -598,6 +804,16 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co line.c[0][scan.right] = scan.c[0][1]; #endif +#ifdef IPOL_C1 + line.c[1][scan.left] = scan.c[1][0]; + line.c[1][scan.right] = scan.c[1][1]; +#endif + +#ifdef IPOL_C2 + line.c[2][scan.left] = scan.c[2][0]; + line.c[2][scan.right] = scan.c[2][1]; +#endif + #ifdef IPOL_T0 line.t[0][scan.left] = scan.t[0][0]; line.t[0][scan.right] = scan.t[0][1]; @@ -608,8 +824,15 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co line.t[1][scan.right] = scan.t[1][1]; #endif +#ifdef IPOL_L0 + line.l[0][scan.left] = scan.l[0][0]; + line.l[0][scan.right] = scan.l[0][1]; +#endif + // render a scanline - scanline_bilinear ( ); + fragmentShader (); + if ( EdgeTestPass & edge_test_first_line ) break; + scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -629,6 +852,16 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.c[0][1] += scan.slopeC[0][1]; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0]; + scan.c[1][1] += scan.slopeC[1][1]; +#endif + +#ifdef IPOL_C2 + scan.c[2][0] += scan.slopeC[2][0]; + scan.c[2][1] += scan.slopeC[2][1]; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0]; scan.t[0][1] += scan.slopeT[0][1]; @@ -639,6 +872,11 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co scan.t[1][1] += scan.slopeT[1][1]; #endif +#ifdef IPOL_L0 + scan.l[0][0] += scan.slopeL[0][0]; + scan.l[0][1] += scan.slopeL[0][1]; +#endif + } } @@ -657,6 +895,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTriangleRendererTextureGouraud2(CBurningVideoDriver* driver) { + // ETR_TEXTURE_GOURAUD #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRTextureGouraud2(driver); #else diff --git a/source/Irrlicht/CTRTextureGouraudAdd2.cpp b/source/Irrlicht/CTRTextureGouraudAdd2.cpp index 0f54928f..040c83de 100644 --- a/source/Irrlicht/CTRTextureGouraudAdd2.cpp +++ b/source/Irrlicht/CTRTextureGouraudAdd2.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -84,13 +84,11 @@ public: CTRTextureGouraudAdd2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: void scanline_bilinear (); - sScanLineData line; - }; //! constructor @@ -137,8 +135,8 @@ void CTRTextureGouraudAdd2::scanline_bilinear () #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -146,7 +144,7 @@ void CTRTextureGouraudAdd2::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -183,6 +181,7 @@ void CTRTextureGouraudAdd2::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -193,9 +192,8 @@ void CTRTextureGouraudAdd2::scanline_bilinear () f32 inversew = FIX_POINT_F32_MUL; -#ifdef BURNINGVIDEO_RENDERER_FAST +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff u32 dIndex = ( line.y & 3 ) << 2; - #else tFixPoint tx0; tFixPoint ty0; @@ -216,32 +214,28 @@ void CTRTextureGouraudAdd2::scanline_bilinear () { +#ifdef INVERSE_W + inversew = fix_inverse32(line.w[0]); +#endif -#ifdef BURNINGVIDEO_RENDERER_FAST +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff const tFixPointu d = dithermask [ dIndex | ( i ) & 3 ]; - -#ifdef INVERSE_W - inversew = fix_inverse32 ( line.w[0] ); -#endif - dst[i] = PixelAdd32 ( - dst[i], - getTexel_plain ( &IT[0], d + tofix ( line.t[0][0].x,inversew), - d + tofix ( line.t[0][0].y,inversew) ) - ); + dst[i] = PixelAdd32 ( + dst[i], + getTexel_plain ( &IT[0], d + tofix ( line.t[0][0].x,inversew), + d + tofix ( line.t[0][0].y,inversew) ) + ); #else -#ifdef INVERSE_W - inversew = fix_inverse32 ( line.w[0] ); -#endif tx0 = tofix ( line.t[0][0].x,inversew); ty0 = tofix ( line.t[0][0].y,inversew); getSample_texture ( r0, g0, b0, &IT[0], tx0,ty0 ); color_to_fix ( r1, g1, b1, dst[i] ); - dst[i] = fix_to_color ( clampfix_maxcolor ( r1 + r0 ), + dst[i] = fix_to_sample( clampfix_maxcolor ( r1 + r0 ), clampfix_maxcolor ( g1 + g0 ), clampfix_maxcolor ( b1 + b0 ) ); @@ -275,10 +269,8 @@ void CTRTextureGouraudAdd2::scanline_bilinear () } -void CTRTextureGouraudAdd2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureGouraudAdd2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { - sScanConvertData scan; - // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c); @@ -288,9 +280,9 @@ void CTRTextureGouraudAdd2::drawTriangle ( const s4DVertex *a,const s4DVertex *b const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); // find if the major edge is left or right aligned f32 temp[4]; @@ -373,8 +365,8 @@ void CTRTextureGouraudAdd2::drawTriangle ( const s4DVertex *a,const s4DVertex *b #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -532,8 +524,8 @@ void CTRTextureGouraudAdd2::drawTriangle ( const s4DVertex *a,const s4DVertex *b #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -651,6 +643,8 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTRTextureGouraudAdd2(CBurningVideoDriver* driver) { + //ETR_TEXTURE_GOURAUD_ADD + #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRTextureGouraudAdd2(driver); #else diff --git a/source/Irrlicht/CTRTextureGouraudAddNoZ2.cpp b/source/Irrlicht/CTRTextureGouraudAddNoZ2.cpp index 1c7f586b..4a619530 100644 --- a/source/Irrlicht/CTRTextureGouraudAddNoZ2.cpp +++ b/source/Irrlicht/CTRTextureGouraudAddNoZ2.cpp @@ -33,38 +33,38 @@ #define CMP_W //#define WRITE_W -//#define IPOL_C0 +#define IPOL_C0 #define IPOL_T0 //#define IPOL_T1 // apply global override #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT - #undef INVERSE_W - #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT - #undef IPOL_W - #endif +#undef INVERSE_W #endif #ifndef SOFTWARE_DRIVER_2_SUBTEXEL - #undef SUBTEXEL +#undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR - #undef IPOL_C0 +#if BURNING_MATERIAL_MAX_COLORS < 1 +#undef IPOL_C0 #endif #if !defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) && defined ( USE_ZBUFFER ) - #define IPOL_Z +#ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT +#undef IPOL_W +#endif +#define IPOL_Z - #ifdef CMP_W - #undef CMP_W - #define CMP_Z - #endif +#ifdef CMP_W +#undef CMP_W +#define CMP_Z +#endif - #ifdef WRITE_W - #undef WRITE_W - #define WRITE_Z - #endif +#ifdef WRITE_W +#undef WRITE_W +#define WRITE_Z +#endif #endif @@ -83,13 +83,11 @@ public: CTRTextureGouraudAddNoZ2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: - void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; + void fragmentShader(); }; @@ -106,7 +104,7 @@ CTRTextureGouraudAddNoZ2::CTRTextureGouraudAddNoZ2(CBurningVideoDriver* driver) /*! */ -void CTRTextureGouraudAddNoZ2::scanline_bilinear () +void CTRTextureGouraudAddNoZ2::fragmentShader() { tVideoSample *dst; @@ -137,16 +135,15 @@ void CTRTextureGouraudAddNoZ2::scanline_bilinear () #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; - if ( dx < 0 ) return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -155,7 +152,7 @@ void CTRTextureGouraudAddNoZ2::scanline_bilinear () slopeW = (line.w[1] - line.w[0]) * invDeltaX; #endif #ifdef IPOL_C0 - slopeC = (line.c[1] - line.c[0]) * invDeltaX; + slopeC = (line.c[0][1] - line.c[0][0]) * invDeltaX; #endif #ifdef IPOL_T0 slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; @@ -173,7 +170,7 @@ void CTRTextureGouraudAddNoZ2::scanline_bilinear () line.w[0] += slopeW * subPixel; #endif #ifdef IPOL_C0 - line.c[0] += slopeC * subPixel; + line.c[0][0] += slopeC * subPixel; #endif #ifdef IPOL_T0 line.t[0][0] += slopeT[0] * subPixel; @@ -183,6 +180,7 @@ void CTRTextureGouraudAddNoZ2::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -198,6 +196,10 @@ void CTRTextureGouraudAddNoZ2::scanline_bilinear () tFixPoint r0, g0, b0; tFixPoint r1, g1, b1; +#ifdef IPOL_C0 + tFixPoint r2, g2, b2; +#endif + for ( s32 i = 0; i <= dx; ++i ) { #ifdef CMP_Z @@ -207,20 +209,30 @@ void CTRTextureGouraudAddNoZ2::scanline_bilinear () if ( line.w[0] >= z[i] ) #endif { -#ifdef IPOL_W +#ifdef INVERSE_W inversew = fix_inverse32 ( line.w[0] ); #endif tx0 = tofix ( line.t[0][0].x,inversew); ty0 = tofix ( line.t[0][0].y,inversew); - getSample_texture ( r0, g0, b0, &IT[0], tx0,ty0 ); + getSample_texture(r0, g0, b0, &IT[0], tx0, ty0); - color_to_fix ( r1, g1, b1, dst[i] ); - - dst[i] = fix_to_color ( clampfix_maxcolor ( r1 + (r0 >> 1 ) ), - clampfix_maxcolor ( g1 + (g0 >> 1 ) ), - clampfix_maxcolor ( b1 + (b0 >> 1) ) - ); +#ifdef IPOL_C0 + vec4_to_fix(r2, g2, b2, line.c[0][0], inversew); + r0 = imulFix(r2, r0); + g0 = imulFix(g2, g0); + b0 = imulFix(b2, b0); +#endif + + //glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); + if (r0 | g0 | b0) + { + color_to_fix(r1, g1, b1, dst[i]); + r1 = imulFix_tex1(r1, FIXPOINT_COLOR_MAX - r0); + g1 = imulFix_tex1(g1, FIXPOINT_COLOR_MAX - g0); + b1 = imulFix_tex1(b1, FIXPOINT_COLOR_MAX - b0); + dst[i] = fix_to_sample(r0+r1, g0+g1, b0+b1); + } #ifdef WRITE_Z z[i] = line.z[0]; @@ -237,7 +249,7 @@ void CTRTextureGouraudAddNoZ2::scanline_bilinear () line.w[0] += slopeW; #endif #ifdef IPOL_C0 - line.c[0] += slopeC; + line.c[0][0] += slopeC; #endif #ifdef IPOL_T0 line.t[0][0] += slopeT[0]; @@ -249,8 +261,11 @@ void CTRTextureGouraudAddNoZ2::scanline_bilinear () } -void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureGouraudAddNoZ2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { + //billboard discard + //if (a->Color[0].r <= 0.f) return; + // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c); @@ -260,9 +275,9 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -293,8 +308,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif #ifdef IPOL_C0 - scan.slopeC[0] = (c->Color[0] - a->Color[0]) * scan.invDeltaY[0]; - scan.c[0] = a->Color[0]; + scan.slopeC[0][0] = (c->Color[0] - a->Color[0]) * scan.invDeltaY[0]; + scan.c[0][0] = a->Color[0]; #endif #ifdef IPOL_T0 @@ -316,7 +331,7 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // rasterize upper sub-triangle - if ( (f32) 0.0 != scan.invDeltaY[1] ) + if (F32_GREATER_0(scan.invDeltaY[1]) ) { // calculate slopes for top edge scan.slopeX[1] = (b->Pos.x - a->Pos.x) * scan.invDeltaY[1]; @@ -333,8 +348,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif #ifdef IPOL_C0 - scan.slopeC[1] = (b->Color[0] - a->Color[0]) * scan.invDeltaY[1]; - scan.c[1] = a->Color[0]; + scan.slopeC[0][1] = (b->Color[0] - a->Color[0]) * scan.invDeltaY[1]; + scan.c[0][1] = a->Color[0]; #endif #ifdef IPOL_T0 @@ -348,8 +363,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -369,8 +384,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif #ifdef IPOL_C0 - scan.c[0] += scan.slopeC[0] * subPixel; - scan.c[1] += scan.slopeC[1] * subPixel; + scan.c[0][0] += scan.slopeC[0][0] * subPixel; + scan.c[0][1] += scan.slopeC[0][1] * subPixel; #endif #ifdef IPOL_T0 @@ -402,8 +417,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif #ifdef IPOL_C0 - line.c[scan.left] = scan.c[0]; - line.c[scan.right] = scan.c[1]; + line.c[0][scan.left] = scan.c[0][0]; + line.c[0][scan.right] = scan.c[0][1]; #endif #ifdef IPOL_T0 @@ -417,7 +432,7 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // render a scanline - scanline_bilinear (); + fragmentShader(); scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -433,8 +448,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif #ifdef IPOL_C0 - scan.c[0] += scan.slopeC[0]; - scan.c[1] += scan.slopeC[1]; + scan.c[0][0] += scan.slopeC[0][0]; + scan.c[0][1] += scan.slopeC[0][1]; #endif #ifdef IPOL_T0 @@ -451,10 +466,10 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex } // rasterize lower sub-triangle - if ( (f32) 0.0 != scan.invDeltaY[2] ) + if (F32_GREATER_0(scan.invDeltaY[2]) ) { // advance to middle point - if( (f32) 0.0 != scan.invDeltaY[1] ) + if(F32_GREATER_0(scan.invDeltaY[1]) ) { temp[0] = b->Pos.y - a->Pos.y; // dy @@ -466,7 +481,7 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex scan.w[0] = a->Pos.w + scan.slopeW[0] * temp[0]; #endif #ifdef IPOL_C0 - scan.c[0] = a->Color[0] + scan.slopeC[0] * temp[0]; + scan.c[0][0] = a->Color[0] + scan.slopeC[0][0] * temp[0]; #endif #ifdef IPOL_T0 scan.t[0][0] = a->Tex[0] + scan.slopeT[0][0] * temp[0]; @@ -492,8 +507,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif #ifdef IPOL_C0 - scan.slopeC[1] = (c->Color[0] - b->Color[0]) * scan.invDeltaY[2]; - scan.c[1] = b->Color[0]; + scan.slopeC[0][1] = (c->Color[0] - b->Color[0]) * scan.invDeltaY[2]; + scan.c[0][1] = b->Color[0]; #endif #ifdef IPOL_T0 @@ -507,8 +522,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -529,8 +544,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif #ifdef IPOL_C0 - scan.c[0] += scan.slopeC[0] * subPixel; - scan.c[1] += scan.slopeC[1] * subPixel; + scan.c[0][0] += scan.slopeC[0][0] * subPixel; + scan.c[0][1] += scan.slopeC[0][1] * subPixel; #endif #ifdef IPOL_T0 @@ -562,8 +577,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif #ifdef IPOL_C0 - line.c[scan.left] = scan.c[0]; - line.c[scan.right] = scan.c[1]; + line.c[0][scan.left] = scan.c[0][0]; + line.c[0][scan.right] = scan.c[0][1]; #endif #ifdef IPOL_T0 @@ -577,7 +592,7 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // render a scanline - scanline_bilinear ( ); + fragmentShader( ); scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -593,8 +608,8 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif #ifdef IPOL_C0 - scan.c[0] += scan.slopeC[0]; - scan.c[1] += scan.slopeC[1]; + scan.c[0][0] += scan.slopeC[0][0]; + scan.c[0][1] += scan.slopeC[0][1]; #endif #ifdef IPOL_T0 @@ -625,6 +640,20 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTRTextureGouraudAddNoZ2(CBurningVideoDriver* driver) { + /* + ETR_TEXTURE_GOURAUD_ADD_NO_Z + + Irrlicht: + Material.MaterialType = EMT_TRANSPARENT_ADD_COLOR; + Material.ZBuffer = ECFN_DISABLED; + -> need Material.ZWriteEnable off + + OpenGL + glDisable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); + */ + #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRTextureGouraudAddNoZ2(driver); #else diff --git a/source/Irrlicht/CTRTextureGouraudAlpha.cpp b/source/Irrlicht/CTRTextureGouraudAlpha.cpp index 37bb477c..6e922359 100644 --- a/source/Irrlicht/CTRTextureGouraudAlpha.cpp +++ b/source/Irrlicht/CTRTextureGouraudAlpha.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -84,18 +84,12 @@ public: CTRTextureGouraudAlpha2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; - - virtual void setParam ( u32 index, f32 value) _IRR_OVERRIDE_; - + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; + virtual void OnSetMaterial(const SBurningShaderMaterial& material) _IRR_OVERRIDE_; private: void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; - - u32 AlphaRef; }; //! constructor @@ -105,19 +99,17 @@ CTRTextureGouraudAlpha2::CTRTextureGouraudAlpha2(CBurningVideoDriver* driver) #ifdef _DEBUG setDebugName("CTRTextureGouraudAlpha2"); #endif - - AlphaRef = 0; } /*! */ -void CTRTextureGouraudAlpha2::setParam ( u32 index, f32 value) +void CTRTextureGouraudAlpha2::OnSetMaterial(const SBurningShaderMaterial& material) { -#ifdef BURNINGVIDEO_RENDERER_FAST - AlphaRef = core::floor32_fast( value * 256.f ); +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff + AlphaRef = core::floor32(material.org.MaterialTypeParam * 256.f); #else - AlphaRef = u32_to_fixPoint ( core::floor32_fast( value * 256.f ) ); + AlphaRef = tofix(material.org.MaterialTypeParam, FIXPOINT_COLOR_MAX); #endif } @@ -147,15 +139,15 @@ void CTRTextureGouraudAlpha2::scanline_bilinear () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -163,7 +155,7 @@ void CTRTextureGouraudAlpha2::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -200,6 +192,7 @@ void CTRTextureGouraudAlpha2::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -209,17 +202,15 @@ void CTRTextureGouraudAlpha2::scanline_bilinear () f32 inversew = FIX_POINT_F32_MUL; -#ifdef BURNINGVIDEO_RENDERER_FAST - u32 dIndex = ( line.y & 3 ) << 2; - +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff + u32 dIndex = (line.y & 3) << 2; #else - tFixPoint a0; - tFixPoint r0, g0, b0; -#endif + tFixPoint a0, r0, g0, b0; #ifdef IPOL_C0 tFixPoint r1, g1, b1; tFixPoint r2, g2, b2; +#endif #endif for ( s32 i = 0; i <= dx; ++i ) @@ -233,7 +224,7 @@ void CTRTextureGouraudAlpha2::scanline_bilinear () { -#ifdef BURNINGVIDEO_RENDERER_FAST +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff const tFixPointu d = dithermask [ dIndex | ( i ) & 3 ]; @@ -245,7 +236,7 @@ void CTRTextureGouraudAlpha2::scanline_bilinear () d + tofix ( line.t[0][0].y,inversew) ); - const u32 alpha = ( argb >> 24 ); + const tFixPoint alpha = ( argb >> 24 ); if ( alpha > AlphaRef ) { #ifdef WRITE_Z @@ -263,19 +254,14 @@ void CTRTextureGouraudAlpha2::scanline_bilinear () #ifdef INVERSE_W inversew = fix_inverse32 ( line.w[0] ); +#endif getSample_texture ( a0,r0,g0,b0, &IT[0], tofix ( line.t[0][0].x,inversew), tofix ( line.t[0][0].y,inversew) ); -#else - getSample_texture ( a0,r0,g0,b0, - &IT[0], - tofix ( line.t[0][0].x), - tofix ( line.t[0][0].y) - ); -#endif - if ( (tFixPointu) a0 > AlphaRef ) + + if ( a0 > AlphaRef ) { #ifdef WRITE_Z z[i] = line.z[0]; @@ -284,30 +270,23 @@ void CTRTextureGouraudAlpha2::scanline_bilinear () z[i] = line.w[0]; #endif -#ifdef INVERSE_W - getSample_color ( r2, g2, b2, line.c[0][0], inversew ); -#else - getSample_color ( r2, g2, b2, line.c[0][0] ); -#endif - r0 = imulFix ( r0, r2 ); - g0 = imulFix ( g0, g2 ); - b0 = imulFix ( b0, b2 ); +#ifdef IPOL_C0 + + vec4_to_fix( r2, g2, b2, line.c[0][0], inversew ); + + r0 = imulFix_simple( r0, r2 ); + g0 = imulFix_simple( g0, g2 ); + b0 = imulFix_simple( b0, b2 ); color_to_fix ( r1, g1, b1, dst[i] ); - a0 >>= 8; + fix_color_norm(a0); r2 = r1 + imulFix ( a0, r0 - r1 ); g2 = g1 + imulFix ( a0, g0 - g1 ); b2 = b1 + imulFix ( a0, b0 - b1 ); - dst[i] = fix4_to_color ( a0, r2, g2, b2 ); + dst[i] = fix4_to_sample( a0, r2, g2, b2 ); -/* - dst[i] = PixelBlend32 ( dst[i], - fix_to_color ( r0,g0, b0 ), - fixPointu_to_u32 ( a0 ) - ); -*/ /* getSample_color ( r2, g2, b2, line.c[0][0], inversew * COLOR_MAX ); color_to_fix ( r1, g1, b1, dst[i] ); @@ -315,9 +294,14 @@ void CTRTextureGouraudAlpha2::scanline_bilinear () r2 = r0 + imulFix ( a0, r1 - r0 ); g2 = g0 + imulFix ( a0, g1 - g0 ); b2 = b0 + imulFix ( a0, b1 - b0 ); - dst[i] = fix_to_color ( r2, g2, b2 ); + dst[i] = fix_to_sample ( r2, g2, b2 ); */ - +#else + dst[i] = PixelBlend32 ( dst[i], + fix_to_sample( r0,g0, b0 ), + fixPointu_to_u32 ( a0 ) + ); +#endif } #endif @@ -342,7 +326,7 @@ void CTRTextureGouraudAlpha2::scanline_bilinear () } -void CTRTextureGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureGouraudAlpha2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -353,9 +337,9 @@ void CTRTextureGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -441,8 +425,8 @@ void CTRTextureGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -600,8 +584,8 @@ void CTRTextureGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -720,6 +704,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTRTextureGouraudAlpha(CBurningVideoDriver* driver) { + //ETR_TEXTURE_GOURAUD_ALPHA #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRTextureGouraudAlpha2(driver); #else diff --git a/source/Irrlicht/CTRTextureGouraudAlphaNoZ.cpp b/source/Irrlicht/CTRTextureGouraudAlphaNoZ.cpp index 2830247e..6a550334 100644 --- a/source/Irrlicht/CTRTextureGouraudAlphaNoZ.cpp +++ b/source/Irrlicht/CTRTextureGouraudAlphaNoZ.cpp @@ -21,6 +21,7 @@ #undef INVERSE_W #undef IPOL_C0 +#undef IPOL_C1 #undef IPOL_T0 #undef IPOL_T1 @@ -34,6 +35,7 @@ //#define WRITE_W #define IPOL_C0 +//#define IPOL_C1 #define IPOL_T0 //#define IPOL_T1 @@ -46,10 +48,14 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif +#if BURNING_MATERIAL_MAX_COLORS < 2 + #undef IPOL_C1 +#endif + #if !defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) && defined ( USE_ZBUFFER ) #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT #undef IPOL_W @@ -84,18 +90,34 @@ public: CTRTextureGouraudAlphaNoZ(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; + virtual void OnSetMaterial(const SBurningShaderMaterial& material) _IRR_OVERRIDE_; - virtual void setParam ( u32 index, f32 value) _IRR_OVERRIDE_; +#if defined(PATCH_SUPERTUX_8_0_1) + SBurningShaderMaterial Material; + virtual void setMaterial(const SBurningShaderMaterial &material) + { + Material = material; + } + + virtual void setParam(u32 index, f32 value) + { + OnSetMaterial(Material); +} +#endif private: - void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; + // fragment shader + typedef void (CTRTextureGouraudAlphaNoZ::*tFragmentShader) (); + void fragment_linear(); + void fragment_linear_test(); + void fragment_point_noz(); + + tFragmentShader fragmentShader; + - u32 AlphaRef; }; //! constructor @@ -106,24 +128,37 @@ CTRTextureGouraudAlphaNoZ::CTRTextureGouraudAlphaNoZ(CBurningVideoDriver* driver setDebugName("CTRTextureGouraudAlphaNoZ"); #endif - AlphaRef = 0; + fragmentShader = &CTRTextureGouraudAlphaNoZ::fragment_linear; } /*! */ -void CTRTextureGouraudAlphaNoZ::setParam ( u32 index, f32 value) +void CTRTextureGouraudAlphaNoZ::OnSetMaterial(const SBurningShaderMaterial& material) { -#ifdef BURNINGVIDEO_RENDERER_FAST - AlphaRef = core::floor32_fast( value * 256.f ); +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff + AlphaRef = core::floor32(material.org.MaterialTypeParam * 256.f); #else - AlphaRef = u32_to_fixPoint ( core::floor32_fast( value * 256.f ) ); + AlphaRef = tofix(material.org.MaterialTypeParam, FIXPOINT_COLOR_MAX); #endif + + //check triangle on w = 1.f instead.. +#ifdef SOFTWARE_DRIVER_2_BILINEAR + if (material.Fallback_MaterialType == EMT_TRANSPARENT_ALPHA_CHANNEL_REF) + fragmentShader = &CTRTextureGouraudAlphaNoZ::fragment_linear_test; + else + if ( material.org.TextureLayer[0].BilinearFilter ) + fragmentShader = &CTRTextureGouraudAlphaNoZ::fragment_linear; + else + +#endif + fragmentShader = &CTRTextureGouraudAlphaNoZ::fragment_point_noz; + } /*! */ -void CTRTextureGouraudAlphaNoZ::scanline_bilinear () +void CTRTextureGouraudAlphaNoZ::fragment_linear() { tVideoSample *dst; @@ -147,15 +182,15 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC[MATERIAL_MAX_COLORS]; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -163,7 +198,7 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -174,6 +209,9 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () #ifdef IPOL_C0 slopeC[0] = (line.c[0][1] - line.c[0][0]) * invDeltaX; #endif +#ifdef IPOL_C1 + slopeC[1] = (line.c[1][1] - line.c[1][0]) * invDeltaX; +#endif #ifdef IPOL_T0 slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; #endif @@ -192,6 +230,9 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () #ifdef IPOL_C0 line.c[0][0] += slopeC[0] * subPixel; #endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1] * subPixel; +#endif #ifdef IPOL_T0 line.t[0][0] += slopeT[0] * subPixel; #endif @@ -200,6 +241,7 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -209,7 +251,7 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () f32 inversew = FIX_POINT_F32_MUL; -#ifdef BURNINGVIDEO_RENDERER_FAST +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff u32 dIndex = ( line.y & 3 ) << 2; #else @@ -219,7 +261,11 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () #ifdef IPOL_C0 tFixPoint r1, g1, b1; - tFixPoint r2, g2, b2; + tFixPoint a2,r2, g2, b2; +#endif + +#ifdef IPOL_C1 + tFixPoint a3,r3, g3, b3; #endif for ( s32 i = 0; i <= dx; ++i ) @@ -233,7 +279,7 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () { -#ifdef BURNINGVIDEO_RENDERER_FAST +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff const tFixPointu d = dithermask [ dIndex | ( i ) & 3 ]; @@ -244,7 +290,7 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () d + tofix ( line.t[0][0].y,inversew) ); - const u32 alpha = ( argb >> 24 ); + const tFixPoint alpha = ( argb >> 24 ); if ( alpha > AlphaRef ) { #ifdef WRITE_Z @@ -262,19 +308,14 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () #ifdef INVERSE_W inversew = fix_inverse32 ( line.w[0] ); +#endif getSample_texture ( a0, r0, g0, b0, &IT[0], tofix ( line.t[0][0].x,inversew), tofix ( line.t[0][0].y,inversew) ); -#else - getSample_texture ( a0, r0, g0,b0, - &IT[0], - tofix ( line.t[0][0].x), - tofix ( line.t[0][0].y) - ); -#endif - if ( (tFixPointu) a0 > AlphaRef ) + + if ( a0 > AlphaRef ) { #ifdef WRITE_Z z[i] = line.z[0]; @@ -283,39 +324,30 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () z[i] = line.w[0]; #endif -#ifdef INVERSE_W - getSample_color ( r2, g2, b2, line.c[0][0], inversew ); -#else - getSample_color ( r2, g2, b2, line.c[0][0] ); -#endif - r0 = imulFix ( r0, r2 ); - g0 = imulFix ( g0, g2 ); - b0 = imulFix ( b0, b2 ); +#ifdef IPOL_C0 + + vec4_to_fix( a2,r2, g2, b2, line.c[0][0], inversew ); + + //a0 = imulFix(a0, a2); //2D uses vertexalpha*texelalpha + r0 = imulFix_simple( r0, r2 ); + g0 = imulFix_simple( g0, g2 ); + b0 = imulFix_simple( b0, b2 ); color_to_fix ( r1, g1, b1, dst[i] ); - a0 >>= 8; + fix_color_norm(a0); r2 = r1 + imulFix ( a0, r0 - r1 ); g2 = g1 + imulFix ( a0, g0 - g1 ); b2 = b1 + imulFix ( a0, b0 - b1 ); - dst[i] = fix4_to_color ( a0, r2, g2, b2 ); + dst[i] = fix4_to_sample( a0, r2, g2, b2 ); -/* +#else dst[i] = PixelBlend32 ( dst[i], - fix_to_color ( r0,g0, b0 ), + fix_to_sample( r0,g0, b0 ), fixPointu_to_u32 ( a0 ) ); -*/ -/* - getSample_color ( r2, g2, b2, line.c[0][0], inversew * COLOR_MAX ); - color_to_fix ( r1, g1, b1, dst[i] ); - - r2 = r0 + imulFix ( a0, r1 - r0 ); - g2 = g0 + imulFix ( a0, g1 - g0 ); - b2 = b0 + imulFix ( a0, b1 - b0 ); - dst[i] = fix_to_color ( r2, g2, b2 ); -*/ +#endif } #endif @@ -331,6 +363,9 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () #ifdef IPOL_C0 line.c[0][0] += slopeC[0]; #endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1]; +#endif #ifdef IPOL_T0 line.t[0][0] += slopeT[0]; #endif @@ -341,7 +376,447 @@ void CTRTextureGouraudAlphaNoZ::scanline_bilinear () } -void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +/*! +*/ +void CTRTextureGouraudAlphaNoZ::fragment_linear_test() +{ + tVideoSample *dst; + +#ifdef USE_ZBUFFER + fp24 *z; +#endif + + s32 xStart; + s32 xEnd; + s32 dx; + + +#ifdef SUBTEXEL + f32 subPixel; +#endif + +#ifdef IPOL_Z + f32 slopeZ; +#endif +#ifdef IPOL_W + fp24 slopeW; +#endif +#ifdef IPOL_C0 + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; +#endif +#ifdef IPOL_T0 + sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; +#endif + + // apply top-left fill-convention, left + xStart = fill_convention_left(line.x[0]); + xEnd = fill_convention_right(line.x[1]); + + dx = xEnd - xStart; + + if (dx < 0) + return; + + // slopes + const f32 invDeltaX = reciprocal_zero2(line.x[1] - line.x[0]); + +#ifdef IPOL_Z + slopeZ = (line.z[1] - line.z[0]) * invDeltaX; +#endif +#ifdef IPOL_W + slopeW = (line.w[1] - line.w[0]) * invDeltaX; +#endif +#ifdef IPOL_C0 + slopeC[0] = (line.c[0][1] - line.c[0][0]) * invDeltaX; +#endif +#ifdef IPOL_C1 + slopeC[1] = (line.c[1][1] - line.c[1][0]) * invDeltaX; +#endif +#ifdef IPOL_T0 + slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; +#endif +#ifdef IPOL_T1 + slopeT[1] = (line.t[1][1] - line.t[1][0]) * invDeltaX; +#endif + +#ifdef SUBTEXEL + subPixel = ((f32)xStart) - line.x[0]; +#ifdef IPOL_Z + line.z[0] += slopeZ * subPixel; +#endif +#ifdef IPOL_W + line.w[0] += slopeW * subPixel; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC[0] * subPixel; +#endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1] * subPixel; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0] * subPixel; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1] * subPixel; +#endif +#endif + + SOFTWARE_DRIVER_2_CLIPCHECK; + dst = (tVideoSample*)RenderTarget->getData() + (line.y * RenderTarget->getDimension().Width) + xStart; + +#ifdef USE_ZBUFFER + z = (fp24*)DepthBuffer->lock() + (line.y * RenderTarget->getDimension().Width) + xStart; +#endif + + + f32 inversew = FIX_POINT_F32_MUL; + +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff + u32 dIndex = (line.y & 3) << 2; + +#else + tFixPoint a0; + tFixPoint r0, g0, b0; +#endif + +#ifdef IPOL_C0 + tFixPoint r1, g1, b1; + tFixPoint a2, r2, g2, b2; +#endif + +#ifdef IPOL_C1 + tFixPoint a3, r3, g3, b3; +#endif + + for (s32 i = 0; i <= dx; ++i) + { +#ifdef CMP_Z + if (line.z[0] < z[i]) +#endif +#ifdef CMP_W + if (line.w[0] >= z[i]) +#endif + + { + +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff + + const tFixPointu d = dithermask[dIndex | (i) & 3]; + +#ifdef INVERSE_W + inversew = fix_inverse32(line.w[0]); +#endif + u32 argb = getTexel_plain(&IT[0], d + tofix(line.t[0][0].x, inversew), + d + tofix(line.t[0][0].y, inversew) + ); + + const tFixPoint alpha = (argb >> 24); + if (alpha > AlphaRef) + { +#ifdef WRITE_Z + z[i] = line.z[0]; +#endif +#ifdef WRITE_W + z[i] = line.w[0]; +#endif + + dst[i] = PixelBlend32(dst[i], argb, alpha); + } + + +#else + +#ifdef INVERSE_W + inversew = fix_inverse32(line.w[0]); +#endif + getSample_texture(a0, r0, g0, b0, + &IT[0], + tofix(line.t[0][0].x, inversew), + tofix(line.t[0][0].y, inversew) + ); + + if (a0 > AlphaRef) + { +#ifdef WRITE_Z + z[i] = line.z[0]; +#endif +#ifdef WRITE_W + z[i] = line.w[0]; +#endif + +#ifdef IPOL_C0 + + vec4_to_fix(a2, r2, g2, b2, line.c[0][0], inversew); + + a0 = imulFix(a0, a2); //2D uses vertexalpha*texelalpha + r0 = imulFix(r0, r2); + g0 = imulFix(g0, g2); + b0 = imulFix(b0, b2); + + color_to_fix(r1, g1, b1, dst[i]); + + fix_color_norm(a0); + + r2 = r1 + imulFix(a0, r0 - r1); + g2 = g1 + imulFix(a0, g0 - g1); + b2 = b1 + imulFix(a0, b0 - b1); + dst[i] = fix4_to_sample(a0, r2, g2, b2); + +#else + dst[i] = PixelBlend32(dst[i], + fix_to_sample(r0, g0, b0), + fixPointu_to_u32(a0) + ); +#endif + + } +#endif + + } + +#ifdef IPOL_Z + line.z[0] += slopeZ; +#endif +#ifdef IPOL_W + line.w[0] += slopeW; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC[0]; +#endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1]; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0]; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1]; +#endif + } + +} + + +/*! +*/ +void CTRTextureGouraudAlphaNoZ::fragment_point_noz() +{ + tVideoSample *dst; + +#ifdef USE_ZBUFFER + //fp24 *z; +#endif + + s32 xStart; + s32 xEnd; + s32 dx; + + +#ifdef SUBTEXEL + f32 subPixel; +#endif + +#ifdef IPOL_Z + f32 slopeZ; +#endif +#ifdef IPOL_W + fp24 slopeW; +#endif +#ifdef IPOL_C0 + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; +#endif +#ifdef IPOL_T0 + sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; +#endif + + // apply top-left fill-convention, left + xStart = fill_convention_left(line.x[0]); + xEnd = fill_convention_right(line.x[1]); + + dx = xEnd - xStart; + + if (dx < 0) + return; + + // slopes + const f32 invDeltaX = reciprocal_zero2(line.x[1] - line.x[0]); + +#ifdef IPOL_Z + slopeZ = (line.z[1] - line.z[0]) * invDeltaX; +#endif +#ifdef IPOL_W + slopeW = (line.w[1] - line.w[0]) * invDeltaX; +#endif +#ifdef IPOL_C0 + slopeC[0] = (line.c[0][1] - line.c[0][0]) * invDeltaX; +#endif +#ifdef IPOL_C1 + slopeC[1] = (line.c[1][1] - line.c[1][0]) * invDeltaX; +#endif +#ifdef IPOL_T0 + slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; +#endif +#ifdef IPOL_T1 + slopeT[1] = (line.t[1][1] - line.t[1][0]) * invDeltaX; +#endif + +#ifdef SUBTEXEL + subPixel = ((f32)xStart) - line.x[0]; +#ifdef IPOL_Z + line.z[0] += slopeZ * subPixel; +#endif +#ifdef IPOL_W + line.w[0] += slopeW * subPixel; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC[0] * subPixel; +#endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1] * subPixel; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0] * subPixel; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1] * subPixel; +#endif +#endif + + SOFTWARE_DRIVER_2_CLIPCHECK; + dst = (tVideoSample*)RenderTarget->getData() + (line.y * RenderTarget->getDimension().Width) + xStart; + +#ifdef USE_ZBUFFER + //z = (fp24*)DepthBuffer->lock() + (line.y * RenderTarget->getDimension().Width) + xStart; +#endif + + + f32 inversew = FIX_POINT_F32_MUL; + +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff + u32 dIndex = (line.y & 3) << 2; + +#else + tFixPoint a0; + tFixPoint r0, g0, b0; +#endif + +#ifdef IPOL_C0 + tFixPoint r1, g1, b1; + tFixPoint a2,r2, g2, b2; +#endif + +#ifdef IPOL_C1 + tFixPoint a3, r3, g3, b3; +#endif + for (s32 i = 0; i <= dx; ++i) + { +#ifdef CMP_Z + if (line.z[0] < z[i]) +#endif +#ifdef CMP_W +// if (line.w[0] >= z[i]) +#endif + + { + +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff + + const tFixPointu d = dithermask[dIndex | (i) & 3]; + +#ifdef INVERSE_W + inversew = fix_inverse32(line.w[0]); +#endif + u32 argb = getTexel_plain(&IT[0], d + tofix(line.t[0][0].x, inversew), + d + tofix(line.t[0][0].y, inversew) + ); + + const tFixPoint alpha = (argb >> 24); + if (alpha > AlphaRef) + { +#ifdef WRITE_Z + z[i] = line.z[0]; +#endif +#ifdef WRITE_W + z[i] = line.w[0]; +#endif + + dst[i] = PixelBlend32(dst[i], argb, alpha); + } + + +#else + +#ifdef INVERSE_W + //inversew = fix_inverse32(line.w[0]); +#endif + getTexel_fix(a0, r0, g0, b0, + &IT[0], + tofix(line.t[0][0].x, inversew), + tofix(line.t[0][0].y, inversew) + ); + + if (a0 > AlphaRef) + { +#ifdef WRITE_Z + z[i] = line.z[0]; +#endif +#ifdef WRITE_W + //z[i] = line.w[0]; +#endif + +#ifdef IPOL_C0 + + vec4_to_fix(a2,r2, g2, b2, line.c[0][0], inversew); + + a0 = imulFix(a0, a2); //2D uses vertexalpha*texelalpha + r0 = imulFix(r0, r2); + g0 = imulFix(g0, g2); + b0 = imulFix(b0, b2); + + color_to_fix(r1, g1, b1, dst[i]); + + fix_color_norm(a0); + + r2 = r1 + imulFix(a0, r0 - r1); + g2 = g1 + imulFix(a0, g0 - g1); + b2 = b1 + imulFix(a0, b0 - b1); + dst[i] = fix4_to_sample(a0, r2, g2, b2); + +#else + dst[i] = PixelBlend32(dst[i], + fix_to_sample(r0, g0, b0), + fixPointu_to_u32(a0) + ); +#endif + + } +#endif + + } + +#ifdef IPOL_Z + line.z[0] += slopeZ; +#endif +#ifdef IPOL_W + //line.w[0] += slopeW; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC[0]; +#endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1]; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0]; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1]; +#endif + } + +} + +void CTRTextureGouraudAlphaNoZ::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -352,9 +827,9 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -389,6 +864,11 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte scan.c[0][0] = a->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][0] = (c->Color[1] - a->Color[1]) * scan.invDeltaY[0]; + scan.c[1][0] = a->Color[1]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][0] = (c->Tex[0] - a->Tex[0]) * scan.invDeltaY[0]; scan.t[0][0] = a->Tex[0]; @@ -429,6 +909,11 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte scan.c[0][1] = a->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][1] = (b->Color[1] - a->Color[1]) * scan.invDeltaY[1]; + scan.c[1][1] = a->Color[1]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][1] = (b->Tex[0] - a->Tex[0]) * scan.invDeltaY[1]; scan.t[0][1] = a->Tex[0]; @@ -440,8 +925,8 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -465,6 +950,11 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte scan.c[0][1] += scan.slopeC[0][1] * subPixel; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0] * subPixel; + scan.c[1][1] += scan.slopeC[1][1] * subPixel; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0] * subPixel; scan.t[0][1] += scan.slopeT[0][1] * subPixel; @@ -498,6 +988,11 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte line.c[0][scan.right] = scan.c[0][1]; #endif +#ifdef IPOL_C1 + line.c[1][scan.left] = scan.c[1][0]; + line.c[1][scan.right] = scan.c[1][1]; +#endif + #ifdef IPOL_T0 line.t[0][scan.left] = scan.t[0][0]; line.t[0][scan.right] = scan.t[0][1]; @@ -509,7 +1004,7 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte #endif // render a scanline - scanline_bilinear ( ); + (this->*fragmentShader) (); scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -529,6 +1024,11 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte scan.c[0][1] += scan.slopeC[0][1]; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0]; + scan.c[1][1] += scan.slopeC[1][1]; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0]; scan.t[0][1] += scan.slopeT[0][1]; @@ -560,6 +1060,10 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte #ifdef IPOL_C0 scan.c[0][0] = a->Color[0] + scan.slopeC[0][0] * temp[0]; #endif +#ifdef IPOL_C1 + scan.c[1][0] = a->Color[1] + scan.slopeC[1][0] * temp[0]; +#endif + #ifdef IPOL_T0 scan.t[0][0] = a->Tex[0] + scan.slopeT[0][0] * temp[0]; #endif @@ -588,6 +1092,11 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte scan.c[0][1] = b->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][1] = (c->Color[1] - b->Color[1]) * scan.invDeltaY[2]; + scan.c[1][1] = b->Color[1]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][1] = (c->Tex[0] - b->Tex[0]) * scan.invDeltaY[2]; scan.t[0][1] = b->Tex[0]; @@ -599,8 +1108,8 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -625,6 +1134,11 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte scan.c[0][1] += scan.slopeC[0][1] * subPixel; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0] * subPixel; + scan.c[1][1] += scan.slopeC[1][1] * subPixel; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0] * subPixel; scan.t[0][1] += scan.slopeT[0][1] * subPixel; @@ -658,6 +1172,11 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte line.c[0][scan.right] = scan.c[0][1]; #endif +#ifdef IPOL_C1 + line.c[1][scan.left] = scan.c[1][0]; + line.c[1][scan.right] = scan.c[1][1]; +#endif + #ifdef IPOL_T0 line.t[0][scan.left] = scan.t[0][0]; line.t[0][scan.right] = scan.t[0][1]; @@ -669,7 +1188,7 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte #endif // render a scanline - scanline_bilinear ( ); + (this->*fragmentShader) (); scan.x[0] += scan.slopeX[0]; scan.x[1] += scan.slopeX[1]; @@ -689,6 +1208,11 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte scan.c[0][1] += scan.slopeC[0][1]; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0]; + scan.c[1][1] += scan.slopeC[1][1]; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0]; scan.t[0][1] += scan.slopeT[0][1]; @@ -720,6 +1244,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTRTextureGouraudAlphaNoZ(CBurningVideoDriver* driver) { + // ETR_TEXTURE_GOURAUD_ALPHA_NOZ #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRTextureGouraudAlphaNoZ(driver); #else @@ -728,6 +1253,7 @@ IBurningShader* createTRTextureGouraudAlphaNoZ(CBurningVideoDriver* driver) } + } // end namespace video } // end namespace irr diff --git a/source/Irrlicht/CTRTextureGouraudNoZ2.cpp b/source/Irrlicht/CTRTextureGouraudNoZ2.cpp index 6abc6e11..c2b4625d 100644 --- a/source/Irrlicht/CTRTextureGouraudNoZ2.cpp +++ b/source/Irrlicht/CTRTextureGouraudNoZ2.cpp @@ -42,7 +42,7 @@ #define IPOL_T0 //#define IPOL_T1 -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -88,13 +88,11 @@ public: CTRTextureGouraudNoZ2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; }; @@ -142,8 +140,8 @@ void CTRTextureGouraudNoZ2::scanline_bilinear ( ) #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -151,7 +149,7 @@ void CTRTextureGouraudNoZ2::scanline_bilinear ( ) return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -188,6 +186,7 @@ void CTRTextureGouraudNoZ2::scanline_bilinear ( ) #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -199,7 +198,7 @@ void CTRTextureGouraudNoZ2::scanline_bilinear ( ) tFixPoint tx0; tFixPoint ty0; - + tFixPoint r0, g0, b0; for ( s32 i = 0; i <= dx; ++i ) { @@ -216,12 +215,12 @@ void CTRTextureGouraudNoZ2::scanline_bilinear ( ) #endif tx0 = tofix ( line.t[0][0].x,inversew); ty0 = tofix ( line.t[0][0].y,inversew); - dst[i] = getTexel_plain ( &IT[0], tx0, ty0 ); + //skybox + //dst[i] = getTexel_plain ( &IT[0], tx0, ty0 ); + + getSample_texture ( r0, g0, b0, IT+0, tx0, ty0 ); + dst[i] = fix_to_sample( r0, g0, b0 ); -/* - getSample_texture ( r0, g0, b0, &IT[0], tx0, ty0 ); - dst[i] = fix_to_color ( r0, g0, b0 ); -*/ #ifdef WRITE_Z z[i] = line.z[0]; #endif @@ -249,7 +248,7 @@ void CTRTextureGouraudNoZ2::scanline_bilinear ( ) } -void CTRTextureGouraudNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureGouraudNoZ2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -260,9 +259,9 @@ void CTRTextureGouraudNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -348,8 +347,8 @@ void CTRTextureGouraudNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -507,8 +506,8 @@ void CTRTextureGouraudNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -626,6 +625,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTRTextureGouraudNoZ2(CBurningVideoDriver* driver) { + // ETR_TEXTURE_GOURAUD_NOZ #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRTextureGouraudNoZ2( driver ); #else diff --git a/source/Irrlicht/CTRTextureGouraudVertexAlpha2.cpp b/source/Irrlicht/CTRTextureGouraudVertexAlpha2.cpp index 8da8e872..4b9c4c20 100644 --- a/source/Irrlicht/CTRTextureGouraudVertexAlpha2.cpp +++ b/source/Irrlicht/CTRTextureGouraudVertexAlpha2.cpp @@ -21,6 +21,7 @@ #undef INVERSE_W #undef IPOL_C0 +#undef IPOL_C1 #undef IPOL_T0 #undef IPOL_T1 @@ -34,6 +35,7 @@ //#define WRITE_W #define IPOL_C0 +#define IPOL_C1 #define IPOL_T0 //#define IPOL_T1 @@ -46,10 +48,15 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif +#if BURNING_MATERIAL_MAX_COLORS < 2 + #undef IPOL_C1 +#endif + + #if !defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) && defined ( USE_ZBUFFER ) #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT #undef IPOL_W @@ -82,13 +89,11 @@ public: CTRTextureVertexAlpha2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; }; @@ -129,15 +134,15 @@ void CTRTextureVertexAlpha2::scanline_bilinear ( ) fp24 slopeW; #endif #ifdef IPOL_C0 - sVec4 slopeC; + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS]; #endif #ifdef IPOL_T0 sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -145,7 +150,7 @@ void CTRTextureVertexAlpha2::scanline_bilinear ( ) return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -154,7 +159,10 @@ void CTRTextureVertexAlpha2::scanline_bilinear ( ) slopeW = (line.w[1] - line.w[0]) * invDeltaX; #endif #ifdef IPOL_C0 - slopeC = (line.c[0][1] - line.c[0][0]) * invDeltaX; + slopeC[0] = (line.c[0][1] - line.c[0][0]) * invDeltaX; +#endif +#ifdef IPOL_C1 + slopeC[1] = (line.c[1][1] - line.c[1][0]) * invDeltaX; #endif #ifdef IPOL_T0 slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; @@ -172,8 +180,12 @@ void CTRTextureVertexAlpha2::scanline_bilinear ( ) line.w[0] += slopeW * subPixel; #endif #ifdef IPOL_C0 - line.c[0][0] += slopeC * subPixel; + line.c[0][0] += slopeC[0] * subPixel; #endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1] * subPixel; +#endif + #ifdef IPOL_T0 line.t[0][0] += slopeT[0] * subPixel; #endif @@ -182,6 +194,7 @@ void CTRTextureVertexAlpha2::scanline_bilinear ( ) #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -191,22 +204,18 @@ void CTRTextureVertexAlpha2::scanline_bilinear ( ) f32 inversew = FIX_POINT_F32_MUL; -//#define __TEST_THIS - -#ifdef __TEST_THIS - -#else tFixPoint tx0; tFixPoint ty0; tFixPoint r0, g0, b0; tFixPoint r1, g1, b1; - tFixPoint r2, g2, b2; -#endif - #ifdef IPOL_C0 - tFixPoint a3; + tFixPoint a2,r2, g2, b2; +#endif + +#ifdef IPOL_C1 + tFixPoint aFog = FIX_POINT_ONE; #endif @@ -220,50 +229,74 @@ void CTRTextureVertexAlpha2::scanline_bilinear ( ) #endif { -#ifdef __TEST_THIS - - inversew = fix_inverse32 ( line.w[0] ); - - dst[i] = PixelAdd32 ( - dst[i], - getTexel_plain ( &IT[0], tofix ( line.t[0][0].x,inversew), - tofix ( line.t[0][0].y,inversew) ) - ); - -#else - -#ifdef INVERSE_W - inversew = fix_inverse32 ( line.w[0] ); -#endif - tx0 = tofix ( line.t[0][0].x,inversew); - ty0 = tofix ( line.t[0][0].y,inversew); - -#ifdef IPOL_C0 - a3 = tofix ( line.c[0][0].y,inversew ); -#endif - - getSample_texture ( r0, g0, b0, &IT[0], tx0, ty0 ); - color_to_fix ( r1, g1, b1, dst[i] ); - -#ifdef IPOL_C0 - r2 = clampfix_maxcolor ( r1 + imulFix ( r0, a3 ) ); - g2 = clampfix_maxcolor ( g1 + imulFix ( g0, a3 ) ); - b2 = clampfix_maxcolor ( b1 + imulFix ( b0, a3 ) ); -#else - r2 = clampfix_maxcolor ( r1 + r0 ); - g2 = clampfix_maxcolor ( g1 + g0 ); - b2 = clampfix_maxcolor ( b1 + b0 ); -#endif - - dst[i] = fix_to_color ( r2, g2, b2 ); - #ifdef WRITE_Z z[i] = line.z[0]; #endif #ifdef WRITE_W z[i] = line.w[0]; #endif + +#ifdef INVERSE_W + inversew = fix_inverse32 ( line.w[0] ); #endif +#ifdef IPOL_C1 + //complete inside fog + if (TL_Flag & TL_FOG) + { + aFog = tofix(line.c[1][0].a, inversew); + if (aFog <= 0) + { + dst[i] = fog_color_sample; + continue; + } + } +#endif + tx0 = tofix ( line.t[0][0].x,inversew); + ty0 = tofix ( line.t[0][0].y,inversew); + + getSample_texture ( r0, g0, b0, &IT[0], tx0, ty0 ); + color_to_fix ( r1, g1, b1, dst[i] ); + +#ifdef IPOL_C0 + vec4_to_fix(a2,r2, g2, b2, line.c[0][0], inversew); + + r0 = imulFix_simple(r0, r2); + g0 = imulFix_simple(g0, g2); + b0 = imulFix_simple(b0, b2); + +#ifdef IPOL_C1 + //specular highlight + if (TL_Flag & TL_SPECULAR) + { + vec4_to_fix(r2, g2, b2, line.c[1][0], inversew*COLOR_MAX); + r0 = clampfix_maxcolor(r2 + r0); + g0 = clampfix_maxcolor(g2 + g0); + b0 = clampfix_maxcolor(b2 + b0); + } +#endif + //blend background + r0 = r1 + imulFix(a2, r0 - r1); + g0 = g1 + imulFix(a2, g0 - g1); + b0 = b1 + imulFix(a2, b0 - b1); + +#ifdef IPOL_C1 + //mix with distance + if (aFog < FIX_POINT_ONE) //TL_Flag & TL_FOG) + { + r0 = fog_color[1] + imulFix(aFog, r0 - fog_color[1]); + g0 = fog_color[2] + imulFix(aFog, g0 - fog_color[2]); + b0 = fog_color[3] + imulFix(aFog, b0 - fog_color[3]); + } +#endif + +#else + r0 = clampfix_maxcolor ( r1 + r0 ); + g0 = clampfix_maxcolor ( g1 + g0 ); + b0 = clampfix_maxcolor ( b1 + b0 ); +#endif + + dst[i] = fix_to_sample( r0, g0, b0 ); + } #ifdef IPOL_Z @@ -273,7 +306,10 @@ void CTRTextureVertexAlpha2::scanline_bilinear ( ) line.w[0] += slopeW; #endif #ifdef IPOL_C0 - line.c[0][0] += slopeC; + line.c[0][0] += slopeC[0]; +#endif +#ifdef IPOL_C1 + line.c[1][0] += slopeC[1]; #endif #ifdef IPOL_T0 line.t[0][0] += slopeT[0]; @@ -285,7 +321,7 @@ void CTRTextureVertexAlpha2::scanline_bilinear ( ) } -void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureVertexAlpha2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -296,9 +332,9 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -333,6 +369,11 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * scan.c[0][0] = a->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][0] = (c->Color[1] - a->Color[1]) * scan.invDeltaY[0]; + scan.c[1][0] = a->Color[1]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][0] = (c->Tex[0] - a->Tex[0]) * scan.invDeltaY[0]; scan.t[0][0] = a->Tex[0]; @@ -373,6 +414,11 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * scan.c[0][1] = a->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][1] = (b->Color[1] - a->Color[1]) * scan.invDeltaY[1]; + scan.c[1][1] = a->Color[1]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][1] = (b->Tex[0] - a->Tex[0]) * scan.invDeltaY[1]; scan.t[0][1] = a->Tex[0]; @@ -384,8 +430,8 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -409,6 +455,11 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * scan.c[0][1] += scan.slopeC[0][1] * subPixel; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0] * subPixel; + scan.c[1][1] += scan.slopeC[1][1] * subPixel; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0] * subPixel; scan.t[0][1] += scan.slopeT[0][1] * subPixel; @@ -442,6 +493,11 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * line.c[0][scan.right] = scan.c[0][1]; #endif +#ifdef IPOL_C1 + line.c[1][scan.left] = scan.c[1][0]; + line.c[1][scan.right] = scan.c[1][1]; +#endif + #ifdef IPOL_T0 line.t[0][scan.left] = scan.t[0][0]; line.t[0][scan.right] = scan.t[0][1]; @@ -473,6 +529,11 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * scan.c[0][1] += scan.slopeC[0][1]; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0]; + scan.c[1][1] += scan.slopeC[1][1]; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0]; scan.t[0][1] += scan.slopeT[0][1]; @@ -504,6 +565,9 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * #ifdef IPOL_C0 scan.c[0][0] = a->Color[0] + scan.slopeC[0][0] * temp[0]; #endif +#ifdef IPOL_C1 + scan.c[1][0] = a->Color[1] + scan.slopeC[1][0] * temp[0]; +#endif #ifdef IPOL_T0 scan.t[0][0] = a->Tex[0] + scan.slopeT[0][0] * temp[0]; #endif @@ -532,6 +596,11 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * scan.c[0][1] = b->Color[0]; #endif +#ifdef IPOL_C1 + scan.slopeC[1][1] = (c->Color[1] - b->Color[1]) * scan.invDeltaY[2]; + scan.c[1][1] = b->Color[1]; +#endif + #ifdef IPOL_T0 scan.slopeT[0][1] = (c->Tex[0] - b->Tex[0]) * scan.invDeltaY[2]; scan.t[0][1] = b->Tex[0]; @@ -543,8 +612,8 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -569,6 +638,11 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * scan.c[0][1] += scan.slopeC[0][1] * subPixel; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0] * subPixel; + scan.c[1][1] += scan.slopeC[1][1] * subPixel; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0] * subPixel; scan.t[0][1] += scan.slopeT[0][1] * subPixel; @@ -602,6 +676,11 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * line.c[0][scan.right] = scan.c[0][1]; #endif +#ifdef IPOL_C1 + line.c[1][scan.left] = scan.c[1][0]; + line.c[1][scan.right] = scan.c[1][1]; +#endif + #ifdef IPOL_T0 line.t[0][scan.left] = scan.t[0][0]; line.t[0][scan.right] = scan.t[0][1]; @@ -633,6 +712,11 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex * scan.c[0][1] += scan.slopeC[0][1]; #endif +#ifdef IPOL_C1 + scan.c[1][0] += scan.slopeC[1][0]; + scan.c[1][1] += scan.slopeC[1][1]; +#endif + #ifdef IPOL_T0 scan.t[0][0] += scan.slopeT[0][0]; scan.t[0][1] += scan.slopeT[0][1]; @@ -662,6 +746,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTriangleRendererTextureVertexAlpha2(CBurningVideoDriver* driver) { + /* ETR_TEXTURE_GOURAUD_VERTEX_ALPHA */ #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRTextureVertexAlpha2(driver); #else diff --git a/source/Irrlicht/CTRTextureLightMap2_Add.cpp b/source/Irrlicht/CTRTextureLightMap2_Add.cpp index db49d530..d5cc7e32 100644 --- a/source/Irrlicht/CTRTextureLightMap2_Add.cpp +++ b/source/Irrlicht/CTRTextureLightMap2_Add.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -82,15 +82,12 @@ public: CTRTextureLightMap2_Add(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; - }; //! constructor @@ -137,8 +134,8 @@ REALINLINE void CTRTextureLightMap2_Add::scanline_bilinear () #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -146,7 +143,7 @@ REALINLINE void CTRTextureLightMap2_Add::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -183,6 +180,7 @@ REALINLINE void CTRTextureLightMap2_Add::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -190,11 +188,10 @@ REALINLINE void CTRTextureLightMap2_Add::scanline_bilinear () #endif -#ifdef BURNINGVIDEO_RENDERER_FAST f32 inversew = FIX_POINT_F32_MUL; + +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff u32 dIndex = ( line.y & 3 ) << 2; - - #else // tFixPoint r0, g0, b0; @@ -219,11 +216,12 @@ REALINLINE void CTRTextureLightMap2_Add::scanline_bilinear () z[i] = line.w[0]; #endif -#ifdef BURNINGVIDEO_RENDERER_FAST - #ifdef INVERSE_W - inversew = fix_inverse32 ( line.w[0] ); + inversew = fix_inverse32(line.w[0]); #endif + +#if defined(BURNINGVIDEO_RENDERER_FAST) && COLOR_MAX==0xff + const tFixPointu d = dithermask [ dIndex | ( i ) & 3 ]; dst[i] = PixelAdd32 ( @@ -234,12 +232,11 @@ REALINLINE void CTRTextureLightMap2_Add::scanline_bilinear () ); #else - const f32 inversew = fix_inverse32 ( line.w[0] ); getSample_texture ( r0, g0, b0, &IT[0], tofix ( line.t[0][0].x,inversew), tofix ( line.t[0][0].y,inversew) ); getSample_texture ( r1, g1, b1, &IT[1], tofix ( line.t[0][1].x,inversew), tofix ( line.t[0][1].y,inversew) ); - dst[i] = fix_to_color ( clampfix_maxcolor ( r0 + r1 ), + dst[i] = fix_to_sample( clampfix_maxcolor ( r0 + r1 ), clampfix_maxcolor ( g0 + g1 ), clampfix_maxcolor ( b0 + b1 ) ); @@ -266,7 +263,7 @@ REALINLINE void CTRTextureLightMap2_Add::scanline_bilinear () } -void CTRTextureLightMap2_Add::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureLightMap2_Add::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -277,9 +274,9 @@ void CTRTextureLightMap2_Add::drawTriangle ( const s4DVertex *a,const s4DVertex const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -365,8 +362,8 @@ void CTRTextureLightMap2_Add::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -524,8 +521,8 @@ void CTRTextureLightMap2_Add::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL diff --git a/source/Irrlicht/CTRTextureLightMap2_M1.cpp b/source/Irrlicht/CTRTextureLightMap2_M1.cpp index 71952749..1295d3c7 100644 --- a/source/Irrlicht/CTRTextureLightMap2_M1.cpp +++ b/source/Irrlicht/CTRTextureLightMap2_M1.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -82,14 +82,12 @@ public: CTRTextureLightMap2_M1(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: void scanline_bilinear2 (); - sScanLineData line; - }; //! constructor @@ -115,15 +113,15 @@ REALINLINE void CTRTextureLightMap2_M1::scanline_bilinear2 () // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; if ( dx < 0 ) return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); // search z-buffer for first not occulled pixel z = (fp24*) DepthBuffer->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart; @@ -170,6 +168,7 @@ REALINLINE void CTRTextureLightMap2_M1::scanline_bilinear2 () line.z[0] = a; line.z[1] = b; #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; a = (f32) i + subPixel; @@ -226,7 +225,7 @@ REALINLINE void CTRTextureLightMap2_M1::scanline_bilinear2 () #endif - dst[i] = fix_to_color ( imulFix_tex1 ( r0, r1 ), + dst[i] = fix_to_sample( imulFix_tex1 ( r0, r1 ), imulFix_tex1 ( g0, g1 ), imulFix_tex1 ( b0, b1 ) ); @@ -244,9 +243,8 @@ REALINLINE void CTRTextureLightMap2_M1::scanline_bilinear2 () } -void CTRTextureLightMap2_M1::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureLightMap2_M1::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { - sScanConvertData scan; // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -257,9 +255,9 @@ void CTRTextureLightMap2_M1::drawTriangle ( const s4DVertex *a,const s4DVertex * const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -345,8 +343,8 @@ void CTRTextureLightMap2_M1::drawTriangle ( const s4DVertex *a,const s4DVertex * #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -505,8 +503,8 @@ void CTRTextureLightMap2_M1::drawTriangle ( const s4DVertex *a,const s4DVertex * #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -626,6 +624,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTriangleRendererTextureLightMap2_M1(CBurningVideoDriver* driver) { + //ETR_TEXTURE_GOURAUD_LIGHTMAP_M1 #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRTextureLightMap2_M1(driver); #else diff --git a/source/Irrlicht/CTRTextureLightMap2_M2.cpp b/source/Irrlicht/CTRTextureLightMap2_M2.cpp index f748990b..5976cfb8 100644 --- a/source/Irrlicht/CTRTextureLightMap2_M2.cpp +++ b/source/Irrlicht/CTRTextureLightMap2_M2.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -82,14 +82,12 @@ public: CTRTextureLightMap2_M2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: void scanline_bilinear2 (); - sScanLineData line; - }; //! constructor @@ -115,15 +113,15 @@ REALINLINE void CTRTextureLightMap2_M2::scanline_bilinear2 () // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; if ( dx < 0 ) return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); // search z-buffer for first not occulled pixel z = (fp24*) DepthBuffer->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart; @@ -170,6 +168,7 @@ REALINLINE void CTRTextureLightMap2_M2::scanline_bilinear2 () line.z[0] = a; line.z[1] = b; #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; a = (f32) i + subPixel; @@ -226,7 +225,7 @@ REALINLINE void CTRTextureLightMap2_M2::scanline_bilinear2 () #endif - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex2 ( r0, r1 ) ), + dst[i] = fix_to_sample( clampfix_maxcolor ( imulFix_tex2 ( r0, r1 ) ), clampfix_maxcolor ( imulFix_tex2 ( g0, g1 ) ), clampfix_maxcolor ( imulFix_tex2 ( b0, b1 ) ) ); @@ -244,10 +243,8 @@ REALINLINE void CTRTextureLightMap2_M2::scanline_bilinear2 () } -void CTRTextureLightMap2_M2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureLightMap2_M2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { - sScanConvertData scan; - // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c); @@ -257,9 +254,9 @@ void CTRTextureLightMap2_M2::drawTriangle ( const s4DVertex *a,const s4DVertex * const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -345,8 +342,8 @@ void CTRTextureLightMap2_M2::drawTriangle ( const s4DVertex *a,const s4DVertex * #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -505,8 +502,8 @@ void CTRTextureLightMap2_M2::drawTriangle ( const s4DVertex *a,const s4DVertex * #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL diff --git a/source/Irrlicht/CTRTextureLightMap2_M4.cpp b/source/Irrlicht/CTRTextureLightMap2_M4.cpp index 3fd726cf..b33a0e0c 100644 --- a/source/Irrlicht/CTRTextureLightMap2_M4.cpp +++ b/source/Irrlicht/CTRTextureLightMap2_M4.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -82,19 +82,21 @@ public: CTRTextureLightMap2_M4(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: - void drawTriangle_Min ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ); - void drawTriangle_Mag ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ); - - void scanline_bilinear (); +#if defined(SOFTWARE_DRIVER_2_SCANLINE_MAG_MIN) + void drawTriangle_Min ( const s4DVertex* burning_restrict a,const s4DVertex* burning_restrict b,const s4DVertex* burning_restrict c ); + void drawTriangle_Mag ( const s4DVertex* burning_restrict a,const s4DVertex* burning_restrict b,const s4DVertex* burning_restrict c ); void scanline_bilinear2_mag (); void scanline_bilinear2_min (); +#else + #define scanline_bilinear2_mag scanline_bilinear +#endif - sScanLineData line; + void scanline_bilinear (); }; @@ -109,14 +111,14 @@ CTRTextureLightMap2_M4::CTRTextureLightMap2_M4(CBurningVideoDriver* driver) /*! */ -REALINLINE void CTRTextureLightMap2_M4::scanline_bilinear2_mag () +void CTRTextureLightMap2_M4::scanline_bilinear2_mag () { tVideoSample *dst; fp24 *z; // apply top-left fill-convention, left - const s32 xStart = irr::core::ceil32_fast( line.x[0] ); - const s32 xEnd = irr::core::ceil32_fast( line.x[1] ) - 1; + const s32 xStart = fill_convention_left(line.x[0]); + const s32 xEnd = fill_convention_right(line.x[1]); s32 dx; s32 i; @@ -125,8 +127,10 @@ REALINLINE void CTRTextureLightMap2_M4::scanline_bilinear2_mag () if ( dx < 0 ) return; + SOFTWARE_DRIVER_2_CLIPCHECK; + // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); // search z-buffer for first not occulled pixel i = ( line.y * RenderTarget->getDimension().Width ) + xStart; @@ -229,11 +233,7 @@ REALINLINE void CTRTextureLightMap2_M4::scanline_bilinear2_mag () getSample_texture ( r1, g1, b1, &IT[1], tofix ( line.t[1][0].x,inversew), tofix ( line.t[1][0].y,inversew) ); #endif - - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex4 ( r0, r1 ) ), - clampfix_maxcolor ( imulFix_tex4 ( g0, g1 ) ), - clampfix_maxcolor ( imulFix_tex4 ( b0, b1 ) ) - ); + dst[i] = fix_to_sample(imulFix_tex4(r0, r1), imulFix_tex4(g0, g1), imulFix_tex4(b0, b1)); } #ifdef IPOL_W @@ -248,7 +248,8 @@ REALINLINE void CTRTextureLightMap2_M4::scanline_bilinear2_mag () } -REALINLINE void CTRTextureLightMap2_M4::scanline_bilinear2_min () +#if defined (SOFTWARE_DRIVER_2_SCANLINE_MAG_MIN) +void CTRTextureLightMap2_M4::scanline_bilinear2_min () { tVideoSample *dst; fp24 *z; @@ -260,15 +261,17 @@ REALINLINE void CTRTextureLightMap2_M4::scanline_bilinear2_min () // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left(line.x[0]); + xEnd = fill_convention_right(line.x[1]); dx = xEnd - xStart; if ( dx < 0 ) return; + SOFTWARE_DRIVER_2_CLIPCHECK; + // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); // search z-buffer for first not occulled pixel z = (fp24*) DepthBuffer->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart; @@ -315,6 +318,7 @@ REALINLINE void CTRTextureLightMap2_M4::scanline_bilinear2_min () line.z[0] = a; line.z[1] = b; #endif + dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; a = (f32) i + subPixel; @@ -352,10 +356,7 @@ REALINLINE void CTRTextureLightMap2_M4::scanline_bilinear2_min () getTexel_fix ( r0, g0, b0, &IT[0], tofix ( line.t[0][0].x,inversew), tofix ( line.t[0][0].y,inversew) ); getTexel_fix ( r1, g1, b1, &IT[1], tofix ( line.t[1][0].x,inversew), tofix ( line.t[1][0].y,inversew) ); - dst[i] = fix_to_color ( clampfix_maxcolor ( imulFix_tex4 ( r0, r1 ) ), - clampfix_maxcolor ( imulFix_tex4 ( g0, g1 ) ), - clampfix_maxcolor ( imulFix_tex4 ( b0, b1 ) ) - ); + dst[i] = fix_to_sample(imulFix_tex4(r0, r1), imulFix_tex4(g0, g1), imulFix_tex4(b0, b1)); } #ifdef IPOL_W @@ -369,21 +370,20 @@ REALINLINE void CTRTextureLightMap2_M4::scanline_bilinear2_min () } -//#ifdef BURNINGVIDEO_RENDERER_FAST -#if 1 - -void CTRTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureLightMap2_M4::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { - if ( IT[0].lodLevel <= 2 ) - drawTriangle_Mag ( a, b, c ); + if (IT[0].lodFactor < 4) + { + drawTriangle_Mag(a, b, c); + } else - drawTriangle_Min ( a, b, c ); + { + drawTriangle_Min(a, b, c); + } } -void CTRTextureLightMap2_M4::drawTriangle_Min ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureLightMap2_M4::drawTriangle_Min ( const s4DVertex* burning_restrict a,const s4DVertex* burning_restrict b,const s4DVertex* burning_restrict c ) { - sScanConvertData scan; - // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c); @@ -393,9 +393,9 @@ void CTRTextureLightMap2_M4::drawTriangle_Min ( const s4DVertex *a,const s4DVert const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) return; @@ -481,8 +481,8 @@ void CTRTextureLightMap2_M4::drawTriangle_Min ( const s4DVertex *a,const s4DVert #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -641,8 +641,8 @@ void CTRTextureLightMap2_M4::drawTriangle_Min ( const s4DVertex *a,const s4DVert #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -746,16 +746,15 @@ void CTRTextureLightMap2_M4::drawTriangle_Min ( const s4DVertex *a,const s4DVert } -void CTRTextureLightMap2_M4::drawTriangle_Mag ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureLightMap2_M4::drawTriangle_Mag ( const s4DVertex* burning_restrict a,const s4DVertex* burning_restrict b,const s4DVertex* burning_restrict c ) -#else +#else //#if defined (SOFTWARE_DRIVER_2_SCANLINE_MAG_MIN) -void CTRTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureLightMap2_M4::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) #endif { - sScanConvertData scan; // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -765,14 +764,18 @@ void CTRTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex * const f32 ca = c->Pos.y - a->Pos.y; const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; - // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); - if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) + if ( F32_LOWER_EQUAL_0 ( ca ) ) return; + // calculate delta y of the edges + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); + + //if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) + // return; + // find if the major edge is left or right aligned f32 temp[4]; @@ -855,8 +858,8 @@ void CTRTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex * #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -1015,8 +1018,8 @@ void CTRTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex * #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL @@ -1120,6 +1123,8 @@ void CTRTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex * } +#undef scanline_bilinear2_mag + } // end namespace video } // end namespace irr diff --git a/source/Irrlicht/CTRTextureLightMapGouraud2_M4.cpp b/source/Irrlicht/CTRTextureLightMapGouraud2_M4.cpp index 64a14ab4..55e7ffc0 100644 --- a/source/Irrlicht/CTRTextureLightMapGouraud2_M4.cpp +++ b/source/Irrlicht/CTRTextureLightMapGouraud2_M4.cpp @@ -46,7 +46,7 @@ #undef SUBTEXEL #endif -#ifndef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#if BURNING_MATERIAL_MAX_COLORS < 1 #undef IPOL_C0 #endif @@ -82,15 +82,12 @@ public: CTRGTextureLightMap2_M4(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; private: void scanline_bilinear (); - sScanConvertData scan; - sScanLineData line; - }; //! constructor @@ -137,8 +134,8 @@ void CTRGTextureLightMap2_M4::scanline_bilinear () #endif // apply top-left fill-convention, left - xStart = core::ceil32_fast( line.x[0] ); - xEnd = core::ceil32_fast( line.x[1] ) - 1; + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); dx = xEnd - xStart; @@ -146,7 +143,7 @@ void CTRGTextureLightMap2_M4::scanline_bilinear () return; // slopes - const f32 invDeltaX = core::reciprocal_approxim ( line.x[1] - line.x[0] ); + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); #ifdef IPOL_Z slopeZ = (line.z[1] - line.z[0]) * invDeltaX; @@ -183,6 +180,7 @@ void CTRGTextureLightMap2_M4::scanline_bilinear () #endif #endif + SOFTWARE_DRIVER_2_CLIPCHECK; dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; #ifdef USE_ZBUFFER @@ -230,26 +228,22 @@ void CTRGTextureLightMap2_M4::scanline_bilinear () getSample_texture ( r1, g1, b1, &IT[1], tx1, ty1 ); #ifdef IPOL_C0 - r2 = imulFix ( r0, r3 ); - g2 = imulFix ( g0, g3 ); - b2 = imulFix ( b0, b3 ); + r2 = imulFix_simple( r0, r3 ); + g2 = imulFix_simple( g0, g3 ); + b2 = imulFix_simple( b0, b3 ); + + r2 = imulFix_tex4 ( r2, r1 ); + g2 = imulFix_tex4 ( g2, g1 ); + b2 = imulFix_tex4 ( b2, b1 ); - r2 = clampfix_maxcolor ( imulFix_tex4 ( r2, r1 ) ); - g2 = clampfix_maxcolor ( imulFix_tex4 ( g2, g1 ) ); - b2 = clampfix_maxcolor ( imulFix_tex4 ( b2, b1 ) ); -/* - r2 = r3 << 8; - g2 = g3 << 8; - b2 = b3 << 8; -*/ #else - r2 = clampfix_maxcolor ( imulFix_tex4 ( r0, r1 ) ); - g2 = clampfix_maxcolor ( imulFix_tex4 ( g0, g1 ) ); - b2 = clampfix_maxcolor ( imulFix_tex4 ( b0, b1 ) ); + r2 = imulFix_tex4 ( r0, r1 ); + g2 = imulFix_tex4 ( g0, g1 ); + b2 = imulFix_tex4 ( b0, b1 ); #endif - dst[i] = fix_to_color ( r2, g2, b2 ); + dst[i] = fix_to_sample( r2, g2, b2 ); #ifdef WRITE_Z z[i] = line.z[0]; @@ -278,7 +272,7 @@ void CTRGTextureLightMap2_M4::scanline_bilinear () } -void CTRGTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRGTextureLightMap2_M4::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) { // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); @@ -289,9 +283,9 @@ void CTRGTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex const f32 ba = b->Pos.y - a->Pos.y; const f32 cb = c->Pos.y - b->Pos.y; // calculate delta y of the edges - scan.invDeltaY[0] = core::reciprocal( ca ); - scan.invDeltaY[1] = core::reciprocal( ba ); - scan.invDeltaY[2] = core::reciprocal( cb ); + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); if ( F32_LOWER_0 ( scan.invDeltaY[0] ) ) return; @@ -379,8 +373,8 @@ void CTRGTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( a->Pos.y ); - yEnd = core::ceil32_fast( b->Pos.y ) - 1; + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); #ifdef SUBTEXEL subPixel = ( (f32) yStart ) - a->Pos.y; @@ -540,8 +534,8 @@ void CTRGTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex #endif // apply top-left fill convention, top part - yStart = core::ceil32_fast( b->Pos.y ); - yEnd = core::ceil32_fast( c->Pos.y ) - 1; + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); #ifdef SUBTEXEL diff --git a/source/Irrlicht/CTRTextureWire2.cpp b/source/Irrlicht/CTRTextureWire2.cpp index e1bb8ba6..b77b788f 100644 --- a/source/Irrlicht/CTRTextureWire2.cpp +++ b/source/Irrlicht/CTRTextureWire2.cpp @@ -28,14 +28,14 @@ #define SUBTEXEL #define INVERSE_W -#define USE_ZBUFFER +//#define USE_ZBUFFER #define IPOL_W -#define CMP_W -#define WRITE_W +//#define CMP_W +//#define WRITE_W -//#define IPOL_C0 -#define IPOL_T0 +#define IPOL_C0 +//#define IPOL_T0 //#define IPOL_T1 // apply global override @@ -47,6 +47,10 @@ #undef SUBTEXEL #endif +#if BURNING_MATERIAL_MAX_COLORS < 1 + #undef IPOL_C0 +#endif + #if !defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) && defined ( USE_ZBUFFER ) #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT #undef IPOL_W @@ -80,14 +84,17 @@ public: CTRTextureWire2(CBurningVideoDriver* driver); //! draws an indexed triangle list - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) _IRR_OVERRIDE_; + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; virtual void drawLine ( const s4DVertex *a,const s4DVertex *b) _IRR_OVERRIDE_; + virtual void drawPoint( const s4DVertex *a) _IRR_OVERRIDE_; + virtual bool canWireFrame () _IRR_OVERRIDE_ { return true; } + virtual bool canPointCloud() _IRR_OVERRIDE_ { return true; } +protected: + virtual void scanline_bilinear (); - -private: void renderAlphaLine ( const s4DVertex *a,const s4DVertex *b ) const; - void renderLine ( const s4DVertex *a,const s4DVertex *b ) const; + void renderLine ( const s4DVertex *a,const s4DVertex *b, int renderZero = 0 ) const; }; @@ -101,26 +108,22 @@ CTRTextureWire2::CTRTextureWire2(CBurningVideoDriver* driver) } -// swap integer with xor -static inline void swap_xor ( s32 &a, s32 &b ) -{ - a ^= b; - b ^= a; - a ^= b; -} - /*! + 2d line */ -void CTRTextureWire2::renderLine ( const s4DVertex *a,const s4DVertex *b ) const +void CTRTextureWire2::renderLine ( const s4DVertex *a,const s4DVertex *b, int renderZero) const { int pitch0 = RenderTarget->getDimension().Width << VIDEO_SAMPLE_GRANULARITY; +#ifdef USE_ZBUFFER int pitch1 = RenderTarget->getDimension().Width << 2; +#endif - int aposx = (int) a->Pos.x; - int aposy = (int) a->Pos.y; - int bposx = (int) b->Pos.x; - int bposy = (int) b->Pos.y; + //todo:! + int aposx = fill_convention_none(a->Pos.x); + int aposy = fill_convention_none(a->Pos.y); + int bposx = fill_convention_none(b->Pos.x); + int bposy = fill_convention_none(b->Pos.y); int dx = bposx - aposx; int dy = bposy - aposy; @@ -138,37 +141,39 @@ void CTRTextureWire2::renderLine ( const s4DVertex *a,const s4DVertex *b ) const int xInc0 = 1 << VIDEO_SAMPLE_GRANULARITY; int yInc0 = pitch0; +#ifdef USE_ZBUFFER int xInc1 = 4; int yInc1 = pitch1; - - tVideoSample color; - -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR - tFixPoint r0, g0, b0; - getSample_color ( r0, g0, b0, a->Color[0] ); - color = fix_to_color ( r0, g0, b0 ); -#else - color = (tVideoSample) 0xFFFFFFFF; #endif if ( dx < 0 ) { xInc0 = - ( 1 << VIDEO_SAMPLE_GRANULARITY); +#ifdef USE_ZBUFFER xInc1 = -4; +#endif dx = -dx; } if ( dy > dx ) { - swap_xor ( dx, dy ); - swap_xor ( xInc0, yInc0 ); - swap_xor ( xInc1, yInc1 ); + //swap + register s32 t; + t = dx;dx=dy;dy=t; + t = xInc0;xInc0=yInc0;yInc0=t; +#ifdef USE_ZBUFFER + t = xInc1;xInc1=yInc1;yInc1=t; +#endif } - if ( 0 == dx ) - return; + if (0 == dx) + { + if (!renderZero) return; + dx = 1; + } - dst = (tVideoSample*) ( (u8*) (tVideoSample*)RenderTarget->getData() + ( aposy * pitch0 ) + (aposx << VIDEO_SAMPLE_GRANULARITY ) ); + SOFTWARE_DRIVER_2_CLIPCHECK_WIRE; + dst = (tVideoSample*) ( (u8*) RenderTarget->getData() + ( aposy * pitch0 ) + (aposx* (1<< VIDEO_SAMPLE_GRANULARITY) ) ); #ifdef USE_ZBUFFER z = (fp24*) ( (u8*) (fp24*) DepthBuffer->lock() + ( aposy * pitch1 ) + (aposx << 2 ) ); #endif @@ -176,16 +181,43 @@ void CTRTextureWire2::renderLine ( const s4DVertex *a,const s4DVertex *b ) const c = dx << 1; m = dy << 1; + // slopes + const f32 invDeltaX = reciprocal_zero2( (f32)dx ); + #ifdef IPOL_Z - f32 slopeZ = (b->Pos.z - a->Pos.z) / f32(dx); + f32 slopeZ = (b->Pos.z - a->Pos.z) * invDeltaX; f32 dataZ = a->Pos.z; #endif #ifdef IPOL_W - fp24 slopeW = (b->Pos.w - a->Pos.w) / f32( dx ); + fp24 slopeW = (b->Pos.w - a->Pos.w) * invDeltaX; fp24 dataW = a->Pos.w; #endif + f32 inversew = FIX_POINT_F32_MUL; + + tVideoSample color; +#if BURNING_MATERIAL_MAX_COLORS > 0 + tFixPoint r0, g0, b0; +#ifdef IPOL_C0 + sVec4 slopeC; + sVec4 C; + slopeC = (b->Color[0] - a->Color[0]) * invDeltaX; + C = a->Color[0]; +#endif + +#ifdef INVERSE_W + inversew = fix_inverse32_color(dataW); +#endif + + vec4_to_fix( r0, g0, b0, a->Color[0], inversew); + color = fix_to_sample( r0, g0, b0 ); + +#else + color = (tVideoSample) 0xFFFFFFFF; +#endif + + run = dx; while ( run ) { @@ -203,15 +235,22 @@ void CTRTextureWire2::renderLine ( const s4DVertex *a,const s4DVertex *b ) const *z = dataW; #endif - *dst = color; +#ifdef IPOL_C0 +#ifdef INVERSE_W + inversew = fix_inverse32_color(dataW); +#endif + vec4_to_fix(r0, g0, b0, C,inversew); + color = fix_to_sample( r0, g0, b0 ); +#endif + *dst = color; } dst = (tVideoSample*) ( (u8*) dst + xInc0 ); // x += xInc -#ifdef IPOL_Z +#ifdef CMP_Z z = (fp24*) ( (u8*) z + xInc1 ); #endif -#ifdef IPOL_W +#ifdef CMP_W z = (fp24*) ( (u8*) z + xInc1 ); #endif @@ -219,10 +258,10 @@ void CTRTextureWire2::renderLine ( const s4DVertex *a,const s4DVertex *b ) const if ( d > dx ) { dst = (tVideoSample*) ( (u8*) dst + yInc0 ); // y += yInc -#ifdef IPOL_Z +#ifdef CMP_Z z = (fp24*) ( (u8*) z + yInc1 ); #endif -#ifdef IPOL_W +#ifdef CMP_W z = (fp24*) ( (u8*) z + yInc1 ); #endif @@ -235,15 +274,21 @@ void CTRTextureWire2::renderLine ( const s4DVertex *a,const s4DVertex *b ) const #ifdef IPOL_W dataW += slopeW; #endif +#ifdef IPOL_C0 + C += slopeC; +#endif + } } -void CTRTextureWire2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +void CTRTextureWire2::scanline_bilinear() { - sScanLineData line; +} +void CTRTextureWire2::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) +{ // sort on height, y if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c); @@ -258,14 +303,17 @@ void CTRTextureWire2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const void CTRTextureWire2::drawLine ( const s4DVertex *a,const s4DVertex *b) { - // query access to TexMaps // sort on height, y - if ( a->Pos.y > b->Pos.y ) swapVertexPointer(&a, &b); + if (F32_A_GREATER_B(a->Pos.y,b->Pos.y )) swapVertexPointer(&a, &b); renderLine ( a, b ); +} +void CTRTextureWire2::drawPoint(const s4DVertex *a) +{ + if ( (a->flag & VERTEX4D_CLIPMASK ) == VERTEX4D_INSIDE ) renderLine(a, a,1); } @@ -283,6 +331,7 @@ namespace video //! creates a flat triangle renderer IBurningShader* createTriangleRendererTextureGouraudWire2(CBurningVideoDriver* driver) { + //ETR_TEXTURE_GOURAUD_WIRE #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ return new CTRTextureWire2(driver); #else diff --git a/source/Irrlicht/CTR_transparent_reflection_2_layer.cpp b/source/Irrlicht/CTR_transparent_reflection_2_layer.cpp new file mode 100644 index 00000000..8fb92140 --- /dev/null +++ b/source/Irrlicht/CTR_transparent_reflection_2_layer.cpp @@ -0,0 +1,729 @@ +// Copyright (C) 2002-2012 Nikolaus Gebhardt / Thomas Alten +// This file is part of the "Irrlicht Engine". +// For conditions of distribution and use, see copyright notice in irrlicht.h + +#include "IrrCompileConfig.h" +#include "IBurningShader.h" + +#ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ + +// compile flag for this file +#undef USE_ZBUFFER +#undef IPOL_Z +#undef CMP_Z +#undef WRITE_Z + +#undef IPOL_W +#undef CMP_W +#undef WRITE_W + +#undef SUBTEXEL +#undef INVERSE_W + +#undef IPOL_C0 +#undef IPOL_T0 +#undef IPOL_T1 + +// define render case +#define SUBTEXEL +#define INVERSE_W + +#define USE_ZBUFFER +#define IPOL_W +#define CMP_W +#define WRITE_W + +#define IPOL_C0 +#define IPOL_T0 +#define IPOL_T1 + +// apply global override +#ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT + #undef INVERSE_W +#endif + +#ifndef SOFTWARE_DRIVER_2_SUBTEXEL + #undef SUBTEXEL +#endif + +#if BURNING_MATERIAL_MAX_COLORS < 1 + #undef IPOL_C0 +#endif + +#if !defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) && defined ( USE_ZBUFFER ) + #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT + #undef IPOL_W + #endif + #define IPOL_Z + + #ifdef CMP_W + #undef CMP_W + #define CMP_Z + #endif + + #ifdef WRITE_W + #undef WRITE_W + #define WRITE_Z + #endif + +#endif + +namespace irr +{ + +namespace video +{ + +class CTR_transparent_reflection_2_layer : public IBurningShader +{ +public: + + //! constructor + CTR_transparent_reflection_2_layer(CBurningVideoDriver* driver); + + //! draws an indexed triangle list + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; + virtual void OnSetMaterial(const SBurningShaderMaterial& material) _IRR_OVERRIDE_; + +private: + void fragmentShader(); + + E_MATERIAL_TYPE MaterialType; + +}; + +//! constructor +CTR_transparent_reflection_2_layer::CTR_transparent_reflection_2_layer(CBurningVideoDriver* driver) +: IBurningShader(driver) +{ + #ifdef _DEBUG + setDebugName("CTR_transparent_reflection_2_layer"); + #endif +} + +void CTR_transparent_reflection_2_layer::OnSetMaterial(const SBurningShaderMaterial& material) +{ + MaterialType = material.org.MaterialType; + +} + +/*! +*/ +void CTR_transparent_reflection_2_layer::fragmentShader() +{ + tVideoSample *dst; + +#ifdef USE_ZBUFFER + fp24 *z; +#endif + + s32 xStart; + s32 xEnd; + s32 dx; + + +#ifdef SUBTEXEL + f32 subPixel; +#endif + +#ifdef IPOL_Z + f32 slopeZ; +#endif +#ifdef IPOL_W + fp24 slopeW; +#endif +#ifdef IPOL_C0 + sVec4 slopeC; +#endif +#ifdef IPOL_T0 + sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; +#endif + + // apply top-left fill-convention, left + xStart = fill_convention_left( line.x[0] ); + xEnd = fill_convention_right( line.x[1] ); + + dx = xEnd - xStart; + + if ( dx < 0 ) + return; + + // slopes + const f32 invDeltaX = reciprocal_zero2( line.x[1] - line.x[0] ); + +#ifdef IPOL_Z + slopeZ = (line.z[1] - line.z[0]) * invDeltaX; +#endif +#ifdef IPOL_W + slopeW = (line.w[1] - line.w[0]) * invDeltaX; +#endif +#ifdef IPOL_C0 + slopeC = (line.c[0][1] - line.c[0][0]) * invDeltaX; +#endif +#ifdef IPOL_T0 + slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; +#endif +#ifdef IPOL_T1 + slopeT[1] = (line.t[1][1] - line.t[1][0]) * invDeltaX; +#endif + +#ifdef SUBTEXEL + subPixel = ( (f32) xStart ) - line.x[0]; +#ifdef IPOL_Z + line.z[0] += slopeZ * subPixel; +#endif +#ifdef IPOL_W + line.w[0] += slopeW * subPixel; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC * subPixel; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0] * subPixel; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1] * subPixel; +#endif +#endif + + SOFTWARE_DRIVER_2_CLIPCHECK; + dst = (tVideoSample*)RenderTarget->getData() + ( line.y * RenderTarget->getDimension().Width ) + xStart; + +#ifdef USE_ZBUFFER + z = (fp24*) DepthBuffer->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart; +#endif + + + f32 inversew = FIX_POINT_F32_MUL; + + tFixPoint r0, g0, b0; + tFixPoint r1, g1, b1; + +#ifdef IPOL_C0 + tFixPoint a1; +#endif + + switch(MaterialType) { + default: + case EMT_REFLECTION_2_LAYER: + for (s32 i = 0; i <= dx; ++i) + { +#ifdef CMP_Z + if (line.z[0] < z[i]) +#endif +#ifdef CMP_W + if (line.w[0] >= z[i]) +#endif + { + +#ifdef INVERSE_W + inversew = fix_inverse32(line.w[0]); +#endif + + getSample_texture(r0, g0, b0, &IT[0], tofix(line.t[0][0].x, inversew), tofix(line.t[0][0].y, inversew)); + getSample_texture(r1, g1, b1, &IT[1], tofix(line.t[1][0].x, inversew), tofix(line.t[1][0].y, inversew)); + + r0 = imulFix_tex1(r0, r1); + g0 = imulFix_tex1(g0, g1); + b0 = imulFix_tex1(b0, b1); + +#ifdef IPOL_C0 + vec4_to_fix(r1, g1, b1, line.c[0][0], inversew); + r0 = imulFix_simple(r1, r0); + g0 = imulFix_simple(g1, g0); + b0 = imulFix_simple(b1, b0); +#endif + + dst[i] = fix_to_sample(r0, g0, b0); + +#ifdef WRITE_Z + z[i] = line.z[0]; +#endif +#ifdef WRITE_W + z[i] = line.w[0]; +#endif + } + +#ifdef IPOL_Z + line.z[0] += slopeZ; +#endif +#ifdef IPOL_W + line.w[0] += slopeW; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0]; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1]; +#endif + } + break; + + case EMT_TRANSPARENT_REFLECTION_2_LAYER: + for (s32 i = 0; i <= dx; ++i) + { +#ifdef CMP_Z + if (line.z[0] < z[i]) +#endif +#ifdef CMP_W + if (line.w[0] >= z[i]) +#endif + { + +#ifdef INVERSE_W + inversew = fix_inverse32(line.w[0]); +#endif + + getSample_texture(r0, g0, b0, &IT[0], tofix(line.t[0][0].x, inversew), tofix(line.t[0][0].y, inversew)); + getSample_texture(r1, g1, b1, &IT[1], tofix(line.t[1][0].x, inversew), tofix(line.t[1][0].y, inversew)); + + r0 = imulFix_tex1(r0, r1); + g0 = imulFix_tex1(g0, g1); + b0 = imulFix_tex1(b0, b1); + +#ifdef IPOL_C0 + vec4_to_fix(a1, r1, g1, b1, line.c[0][0], inversew); + r0 = imulFix_simple(r1, r0); + g0 = imulFix_simple(g1, g0); + b0 = imulFix_simple(b1, b0); + + //vertex alpha blend EMT_TRANSPARENT_REFLECTION_2_LAYER + if (a1 + 2 < FIX_POINT_ONE) + { + color_to_fix(r1, g1, b1, dst[i]); + r0 = r1 + imulFix(a1, r0 - r1); + g0 = g1 + imulFix(a1, g0 - g1); + b0 = b1 + imulFix(a1, b0 - b1); + } +#endif + + dst[i] = fix_to_sample(r0, g0, b0); + +#ifdef WRITE_Z + //z[i] = line.z[0]; +#endif +#ifdef WRITE_W + //z[i] = line.w[0]; +#endif + } + +#ifdef IPOL_Z + line.z[0] += slopeZ; +#endif +#ifdef IPOL_W + line.w[0] += slopeW; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0]; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1]; +#endif + } + break; + + } + + +} + +void CTR_transparent_reflection_2_layer::drawTriangle ( const s4DVertex* burning_restrict a,const s4DVertex* burning_restrict b,const s4DVertex* burning_restrict c ) +{ + // sort on height, y + if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); + if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c); + if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); + + const f32 ca = c->Pos.y - a->Pos.y; + const f32 ba = b->Pos.y - a->Pos.y; + const f32 cb = c->Pos.y - b->Pos.y; + // calculate delta y of the edges + scan.invDeltaY[0] = reciprocal_zero( ca ); + scan.invDeltaY[1] = reciprocal_zero( ba ); + scan.invDeltaY[2] = reciprocal_zero( cb ); + + if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) ) + return; + + // find if the major edge is left or right aligned + f32 temp[4]; + + temp[0] = a->Pos.x - c->Pos.x; + temp[1] = -ca; + temp[2] = b->Pos.x - a->Pos.x; + temp[3] = ba; + + scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1; + scan.right = 1 - scan.left; + + // calculate slopes for the major edge + scan.slopeX[0] = (c->Pos.x - a->Pos.x) * scan.invDeltaY[0]; + scan.x[0] = a->Pos.x; + +#ifdef IPOL_Z + scan.slopeZ[0] = (c->Pos.z - a->Pos.z) * scan.invDeltaY[0]; + scan.z[0] = a->Pos.z; +#endif + +#ifdef IPOL_W + scan.slopeW[0] = (c->Pos.w - a->Pos.w) * scan.invDeltaY[0]; + scan.w[0] = a->Pos.w; +#endif + +#ifdef IPOL_C0 + scan.slopeC[0][0] = (c->Color[0] - a->Color[0]) * scan.invDeltaY[0]; + scan.c[0][0] = a->Color[0]; +#endif + +#ifdef IPOL_T0 + scan.slopeT[0][0] = (c->Tex[0] - a->Tex[0]) * scan.invDeltaY[0]; + scan.t[0][0] = a->Tex[0]; +#endif + +#ifdef IPOL_T1 + scan.slopeT[1][0] = (c->Tex[1] - a->Tex[1]) * scan.invDeltaY[0]; + scan.t[1][0] = a->Tex[1]; +#endif + + // top left fill convention y run + s32 yStart; + s32 yEnd; + +#ifdef SUBTEXEL + f32 subPixel; +#endif + + // rasterize upper sub-triangle + if ( F32_GREATER_0(scan.invDeltaY[1]) ) + { + // calculate slopes for top edge + scan.slopeX[1] = (b->Pos.x - a->Pos.x) * scan.invDeltaY[1]; + scan.x[1] = a->Pos.x; + +#ifdef IPOL_Z + scan.slopeZ[1] = (b->Pos.z - a->Pos.z) * scan.invDeltaY[1]; + scan.z[1] = a->Pos.z; +#endif + +#ifdef IPOL_W + scan.slopeW[1] = (b->Pos.w - a->Pos.w) * scan.invDeltaY[1]; + scan.w[1] = a->Pos.w; +#endif + +#ifdef IPOL_C0 + scan.slopeC[0][1] = (b->Color[0] - a->Color[0]) * scan.invDeltaY[1]; + scan.c[0][1] = a->Color[0]; +#endif + +#ifdef IPOL_T0 + scan.slopeT[0][1] = (b->Tex[0] - a->Tex[0]) * scan.invDeltaY[1]; + scan.t[0][1] = a->Tex[0]; +#endif + +#ifdef IPOL_T1 + scan.slopeT[1][1] = (b->Tex[1] - a->Tex[1]) * scan.invDeltaY[1]; + scan.t[1][1] = a->Tex[1]; +#endif + + // apply top-left fill convention, top part + yStart = fill_convention_left( a->Pos.y ); + yEnd = fill_convention_right( b->Pos.y ); + +#ifdef SUBTEXEL + subPixel = ( (f32) yStart ) - a->Pos.y; + + // correct to pixel center + scan.x[0] += scan.slopeX[0] * subPixel; + scan.x[1] += scan.slopeX[1] * subPixel; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0] * subPixel; + scan.z[1] += scan.slopeZ[1] * subPixel; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0] * subPixel; + scan.w[1] += scan.slopeW[1] * subPixel; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0] * subPixel; + scan.c[0][1] += scan.slopeC[0][1] * subPixel; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0] * subPixel; + scan.t[0][1] += scan.slopeT[0][1] * subPixel; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0] * subPixel; + scan.t[1][1] += scan.slopeT[1][1] * subPixel; +#endif + +#endif + + // rasterize the edge scanlines + for( line.y = yStart; line.y <= yEnd; ++line.y) + { + line.x[scan.left] = scan.x[0]; + line.x[scan.right] = scan.x[1]; + +#ifdef IPOL_Z + line.z[scan.left] = scan.z[0]; + line.z[scan.right] = scan.z[1]; +#endif + +#ifdef IPOL_W + line.w[scan.left] = scan.w[0]; + line.w[scan.right] = scan.w[1]; +#endif + +#ifdef IPOL_C0 + line.c[0][scan.left] = scan.c[0][0]; + line.c[0][scan.right] = scan.c[0][1]; +#endif + +#ifdef IPOL_T0 + line.t[0][scan.left] = scan.t[0][0]; + line.t[0][scan.right] = scan.t[0][1]; +#endif + +#ifdef IPOL_T1 + line.t[1][scan.left] = scan.t[1][0]; + line.t[1][scan.right] = scan.t[1][1]; +#endif + + // render a scanline + fragmentShader(); + + scan.x[0] += scan.slopeX[0]; + scan.x[1] += scan.slopeX[1]; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0]; + scan.z[1] += scan.slopeZ[1]; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0]; + scan.w[1] += scan.slopeW[1]; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0]; + scan.c[0][1] += scan.slopeC[0][1]; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0]; + scan.t[0][1] += scan.slopeT[0][1]; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0]; + scan.t[1][1] += scan.slopeT[1][1]; +#endif + + } + } + + // rasterize lower sub-triangle + if ( F32_GREATER_0(scan.invDeltaY[2]) ) + { + // advance to middle point + if( F32_GREATER_0(scan.invDeltaY[1]) ) + { + temp[0] = b->Pos.y - a->Pos.y; // dy + + scan.x[0] = a->Pos.x + scan.slopeX[0] * temp[0]; +#ifdef IPOL_Z + scan.z[0] = a->Pos.z + scan.slopeZ[0] * temp[0]; +#endif +#ifdef IPOL_W + scan.w[0] = a->Pos.w + scan.slopeW[0] * temp[0]; +#endif +#ifdef IPOL_C0 + scan.c[0][0] = a->Color[0] + scan.slopeC[0][0] * temp[0]; +#endif +#ifdef IPOL_T0 + scan.t[0][0] = a->Tex[0] + scan.slopeT[0][0] * temp[0]; +#endif +#ifdef IPOL_T1 + scan.t[1][0] = a->Tex[1] + scan.slopeT[1][0] * temp[0]; +#endif + + } + + // calculate slopes for bottom edge + scan.slopeX[1] = (c->Pos.x - b->Pos.x) * scan.invDeltaY[2]; + scan.x[1] = b->Pos.x; + +#ifdef IPOL_Z + scan.slopeZ[1] = (c->Pos.z - b->Pos.z) * scan.invDeltaY[2]; + scan.z[1] = b->Pos.z; +#endif + +#ifdef IPOL_W + scan.slopeW[1] = (c->Pos.w - b->Pos.w) * scan.invDeltaY[2]; + scan.w[1] = b->Pos.w; +#endif + +#ifdef IPOL_C0 + scan.slopeC[0][1] = (c->Color[0] - b->Color[0]) * scan.invDeltaY[2]; + scan.c[0][1] = b->Color[0]; +#endif + +#ifdef IPOL_T0 + scan.slopeT[0][1] = (c->Tex[0] - b->Tex[0]) * scan.invDeltaY[2]; + scan.t[0][1] = b->Tex[0]; +#endif + +#ifdef IPOL_T1 + scan.slopeT[1][1] = (c->Tex[1] - b->Tex[1]) * scan.invDeltaY[2]; + scan.t[1][1] = b->Tex[1]; +#endif + + // apply top-left fill convention, top part + yStart = fill_convention_left( b->Pos.y ); + yEnd = fill_convention_right( c->Pos.y ); + +#ifdef SUBTEXEL + + subPixel = ( (f32) yStart ) - b->Pos.y; + + // correct to pixel center + scan.x[0] += scan.slopeX[0] * subPixel; + scan.x[1] += scan.slopeX[1] * subPixel; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0] * subPixel; + scan.z[1] += scan.slopeZ[1] * subPixel; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0] * subPixel; + scan.w[1] += scan.slopeW[1] * subPixel; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0] * subPixel; + scan.c[0][1] += scan.slopeC[0][1] * subPixel; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0] * subPixel; + scan.t[0][1] += scan.slopeT[0][1] * subPixel; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0] * subPixel; + scan.t[1][1] += scan.slopeT[1][1] * subPixel; +#endif + +#endif + + // rasterize the edge scanlines + for( line.y = yStart; line.y <= yEnd; ++line.y) + { + line.x[scan.left] = scan.x[0]; + line.x[scan.right] = scan.x[1]; + +#ifdef IPOL_Z + line.z[scan.left] = scan.z[0]; + line.z[scan.right] = scan.z[1]; +#endif + +#ifdef IPOL_W + line.w[scan.left] = scan.w[0]; + line.w[scan.right] = scan.w[1]; +#endif + +#ifdef IPOL_C0 + line.c[0][scan.left] = scan.c[0][0]; + line.c[0][scan.right] = scan.c[0][1]; +#endif + +#ifdef IPOL_T0 + line.t[0][scan.left] = scan.t[0][0]; + line.t[0][scan.right] = scan.t[0][1]; +#endif + +#ifdef IPOL_T1 + line.t[1][scan.left] = scan.t[1][0]; + line.t[1][scan.right] = scan.t[1][1]; +#endif + + // render a scanline + fragmentShader(); + + scan.x[0] += scan.slopeX[0]; + scan.x[1] += scan.slopeX[1]; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0]; + scan.z[1] += scan.slopeZ[1]; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0]; + scan.w[1] += scan.slopeW[1]; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0]; + scan.c[0][1] += scan.slopeC[0][1]; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0]; + scan.t[0][1] += scan.slopeT[0][1]; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0]; + scan.t[1][1] += scan.slopeT[1][1]; +#endif + + } + } + +} + + +} // end namespace video +} // end namespace irr + +#endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ + +namespace irr +{ +namespace video +{ + +//! creates a flat triangle renderer +IBurningShader* createTriangleRendererTexture_transparent_reflection_2_layer(CBurningVideoDriver* driver) +{ + /* + ETR_TRANSPARENT_REFLECTION_2_LAYER + Irrlicht EMT_REFLECTION_2_LAYER,EMT_TRANSPARENT_REFLECTION_2_LAYER + */ + #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ + return new CTR_transparent_reflection_2_layer(driver); + #else + return 0; + #endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ +} + + +} // end namespace video +} // end namespace irr + + + diff --git a/source/Irrlicht/CXMeshFileLoader.cpp b/source/Irrlicht/CXMeshFileLoader.cpp index 89c2c77a..feddb408 100644 --- a/source/Irrlicht/CXMeshFileLoader.cpp +++ b/source/Irrlicht/CXMeshFileLoader.cpp @@ -912,6 +912,12 @@ bool CXMeshFileLoader::parseDataObjectMesh(SXMesh &mesh) s16 uv2type = -1; s16 tangenttype = -1; s16 binormaltype = -1; + + (void)tangentpos; // disable unused variable warnings + (void)binormalpos; // disable unused variable warnings + (void)tangenttype; // disable unused variable warnings + (void)binormaltype; // disable unused variable warnings + for (j=0; jgetDepthBuffer (); - if ( DepthBuffer ) - DepthBuffer->grab(); - - Stencil = (CStencilBuffer*) driver->getStencilBuffer (); - if ( Stencil ) - Stencil->grab(); - + IT[i].Texture = 0; } + Driver = driver; + CallBack = 0; - //! destructor - IBurningShader::~IBurningShader() + RenderTarget = 0; + ColorMask = COLOR_BRIGHT_WHITE; + DepthBuffer = (CDepthBuffer*) driver->getDepthBuffer (); + if ( DepthBuffer ) + DepthBuffer->grab(); + + Stencil = (CStencilBuffer*) driver->getStencilBuffer (); + if ( Stencil ) + Stencil->grab(); + + stencilOp[0] = StencilOp_KEEP; + stencilOp[1] = StencilOp_KEEP; + stencilOp[2] = StencilOp_KEEP; + AlphaRef = 0; + RenderPass_ShaderIsTransparent = 0; + PrimitiveColor = COLOR_BRIGHT_WHITE; + TL_Flag = 0; +} + +IBurningShader::IBurningShader(CBurningVideoDriver* driver) +{ + constructor_IBurningShader(driver); +} + +//! Constructor +IBurningShader::IBurningShader( + CBurningVideoDriver* driver, + s32& outMaterialTypeNr, + const c8* vertexShaderProgram, + const c8* vertexShaderEntryPointName, + E_VERTEX_SHADER_TYPE vsCompileTarget, + const c8* pixelShaderProgram, + const c8* pixelShaderEntryPointName, + E_PIXEL_SHADER_TYPE psCompileTarget, + const c8* geometryShaderProgram , + const c8* geometryShaderEntryPointName, + E_GEOMETRY_SHADER_TYPE gsCompileTarget, + scene::E_PRIMITIVE_TYPE inType, + scene::E_PRIMITIVE_TYPE outType, + u32 verticesOut, + IShaderConstantSetCallBack* callback, + E_MATERIAL_TYPE baseMaterial, + s32 userData) +{ + constructor_IBurningShader(driver); + BaseMaterial = baseMaterial; + CallBack = callback; + if (CallBack) + CallBack->grab(); + + // register myself as new material + outMaterialTypeNr = Driver->addMaterialRenderer(this); +} + + +//! destructor +IBurningShader::~IBurningShader() +{ + if (RenderTarget) + RenderTarget->drop(); + + if (DepthBuffer) + DepthBuffer->drop(); + + if (Stencil) + Stencil->drop(); + + for ( u32 i = 0; i != BURNING_MATERIAL_MAX_TEXTURES; ++i ) { - if (RenderTarget) - RenderTarget->drop(); - - if (DepthBuffer) - DepthBuffer->drop(); - - if (Stencil) - Stencil->drop(); - - for ( u32 i = 0; i != BURNING_MATERIAL_MAX_TEXTURES; ++i ) - { - if ( IT[i].Texture ) - IT[i].Texture->drop(); - } + if ( IT[i].Texture ) + IT[i].Texture->drop(); } - //! sets a render target - void IBurningShader::setRenderTarget(video::IImage* surface, const core::rect& viewPort) + if (CallBack) + CallBack->drop(); + +} + +//! sets a render target +void IBurningShader::setRenderTarget(video::IImage* surface, const core::rect& viewPort) +{ + if (RenderTarget) + RenderTarget->drop(); + + RenderTarget = (video::CImage* ) surface; + + if (RenderTarget) { - if (RenderTarget) - RenderTarget->drop(); + RenderTarget->grab(); - RenderTarget = (video::CImage* ) surface; + //(fp24*) DepthBuffer->lock() = DepthBuffer->lock(); + } +} - if (RenderTarget) - { - RenderTarget->grab(); - //(fp24*) DepthBuffer->lock() = DepthBuffer->lock(); - } +//! sets the Texture +void IBurningShader::setTextureParam( const size_t stage, video::CSoftwareTexture2* texture, s32 lodFactor) +{ + sInternalTexture *it = &IT[stage]; + + if ( it->Texture) + it->Texture->drop(); + + it->Texture = texture; + + if ( it->Texture) + { + it->Texture->grab(); + + // select mignify and magnify + it->lodFactor = lodFactor; + + //only mipmap chain (means positive lodFactor) + u32 existing_level = it->Texture->getMipmapLevel(lodFactor); + it->data = (tVideoSample*) it->Texture->lock(ETLM_READ_ONLY, existing_level, 0); + + // prepare for optimal fixpoint + it->pitchlog2 = s32_log2_s32 ( it->Texture->getPitch() ); + + const core::dimension2d &dim = it->Texture->getSize(); + it->textureXMask = s32_to_fixPoint ( dim.Width - 1 ) & FIX_POINT_UNSIGNED_MASK; + it->textureYMask = s32_to_fixPoint ( dim.Height - 1 ) & FIX_POINT_UNSIGNED_MASK; + } +} + +//emulate a line with degenerate triangle and special shader mode (not perfect...) +void IBurningShader::drawLine ( const s4DVertex *a,const s4DVertex *b) +{ + sVec2 d; + d.x = b->Pos.x - a->Pos.x; d.x *= d.x; + d.y = b->Pos.y - a->Pos.y; d.y *= d.y; + //if ( d.x * d.y < 0.001f ) return; + + if ( a->Pos.x > b->Pos.x ) swapVertexPointer(&a, &b); + + s4DVertex c = *a; + + const f32 w = (f32)RenderTarget->getDimension().Width-1; + const f32 h = (f32)RenderTarget->getDimension().Height-1; + + if ( d.x < 2.f ) { c.Pos.x = b->Pos.x + 1.f + d.y; if ( c.Pos.x > w ) c.Pos.x = w; } + else c.Pos.x = b->Pos.x; + if ( d.y < 2.f ) { c.Pos.y = b->Pos.y + 1.f; if ( c.Pos.y > h ) c.Pos.y = h; EdgeTestPass |= edge_test_first_line; } + + drawTriangle ( a,b,&c ); + EdgeTestPass &= ~edge_test_first_line; + +} + +void IBurningShader::drawPoint(const s4DVertex *a) +{ +} + +void IBurningShader::drawWireFrameTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) +{ + if ( EdgeTestPass & edge_test_pass ) drawTriangle(a, b, c); + else if (EdgeTestPass & edge_test_point) + { + drawPoint(a); + drawPoint(b); + drawPoint(c); + } + else + { + drawLine(a, b); + drawLine(b, c); + drawLine(a, c); + } +} + + +void IBurningShader::OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, + bool resetAllRenderstates, IMaterialRendererServices* services) +{ + if (Driver) + Driver->setFallback_Material(BaseMaterial); + services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); + if (CallBack) + CallBack->OnSetMaterial(material); + +} + +void IBurningShader::OnUnsetMaterial() +{ +} + +bool IBurningShader::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) +{ + // call callback to set shader constants + if (CallBack) + CallBack->OnSetConstants(this, UserData); + return true; +} + + +//! Returns if the material is transparent. +bool IBurningShader::isTransparent() const +{ + return RenderPass_ShaderIsTransparent != 0; +} + +//! Access the callback provided by the users when creating shader materials +IShaderConstantSetCallBack* IBurningShader::getShaderConstantSetCallBack() const +{ + return CallBack; +} + +// implementations for the render services +void IBurningShader::setBasicRenderStates(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates) +{ + // forward + Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); +} + +s32 IBurningShader::getShaderConstantID(EBurningUniformFlags flags,const c8* name) +{ + if (!name || !name[0]) + return -1; + + BurningUniform add; + tiny_strcpy(add.name, name); + add.type = flags; + + s32 index = UniformInfo.linear_search(add); + if (index < 0) + { + UniformInfo.push_back(add); + index = UniformInfo.size() - 1; } + return index; +} - //! sets the Texture - void IBurningShader::setTextureParam( u32 stage, video::CSoftwareTexture2* texture, s32 lodLevel) +const char* tiny_itoa(s32 value, int base) +{ + static char b[32]; + int p = 31; + + //int sign = 0; + //if (value < 0) { sign = 1; value = -value; } + + b[p] = '\0'; + do { + b[--p] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[value%base]; + value /= base; + } while (value && p > 0); + + //if (sign && p > 0) { b[--p] = '-'; } + + return b + p; +} + +bool IBurningShader::setShaderConstantID(EBurningUniformFlags flags, s32 index, const void* data, size_t u32_count) +{ + if ((u32)index >= UniformInfo.size()) + return false; +#if 0 + BurningUniform add; + while ((u32)index >= UniformInfo.size()) { - sInternalTexture *it = &IT[stage]; - - if ( it->Texture) - it->Texture->drop(); - - it->Texture = texture; - - if ( it->Texture) - { - it->Texture->grab(); - - // select mignify and magnify ( lodLevel ) - //SOFTWARE_DRIVER_2_MIPMAPPING_LOD_BIAS - it->lodLevel = lodLevel; - it->data = (tVideoSample*) it->Texture->lock(ETLM_READ_ONLY, - core::s32_clamp ( lodLevel + SOFTWARE_DRIVER_2_MIPMAPPING_LOD_BIAS, 0, SOFTWARE_DRIVER_2_MIPMAPPING_MAX - 1 ), 0); - - // prepare for optimal fixpoint - it->pitchlog2 = s32_log2_s32 ( it->Texture->getPitch() ); - - const core::dimension2d &dim = it->Texture->getSize(); - it->textureXMask = s32_to_fixPoint ( dim.Width - 1 ) & FIX_POINT_UNSIGNED_MASK; - it->textureYMask = s32_to_fixPoint ( dim.Height - 1 ) & FIX_POINT_UNSIGNED_MASK; - } + tiny_strcpy(add.name, tiny_itoa(UniformInfo.size(),10)); + add.type = flags; + UniformInfo.push_back(add); } +#endif + + BurningUniform& use = UniformInfo[index]; + use.type = flags; + + const u32* s = (u32*)data; + u32* d = (u32*)use.data; + + if (!s) u32_count = 0; + if (u32_count > array_size(use.data)) u32_count = array_size(use.data); + for (size_t i = 0; i < u32_count; ++i) + { + d[i] = s[i]; + } + + return true; +} + + +s32 IBurningShader::getVertexShaderConstantID(const c8* name) +{ + return getShaderConstantID(BL_VERTEX_PROGRAM, name); +} + +s32 IBurningShader::getPixelShaderConstantID(const c8* name) +{ + return getShaderConstantID(BL_FRAGMENT_PROGRAM, name); +} + +void IBurningShader::setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) +{ + c8 name[BL_ACTIVE_UNIFORM_MAX_LENGTH]; + tiny_strcpy(name, tiny_itoa(startRegister, 10)); + + setShaderConstantID(BL_VERTEX_FLOAT, getShaderConstantID(BL_VERTEX_PROGRAM,name), data, constantAmount); +} + +void IBurningShader::setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) +{ + c8 name[BL_ACTIVE_UNIFORM_MAX_LENGTH]; + tiny_strcpy(name, tiny_itoa(startRegister, 10)); + + setShaderConstantID(BL_FRAGMENT_FLOAT, getShaderConstantID(BL_FRAGMENT_PROGRAM, name), data, constantAmount); +} + +bool IBurningShader::setVertexShaderConstant(s32 index, const f32* floats, int count) +{ + return setShaderConstantID(BL_VERTEX_FLOAT, index, floats, count); +} + +bool IBurningShader::setVertexShaderConstant(s32 index, const s32* ints, int count) +{ + return setShaderConstantID(BL_VERTEX_INT, index, ints, count); +} + +bool IBurningShader::setVertexShaderConstant(s32 index, const u32* ints, int count) +{ + return setShaderConstantID(BL_VERTEX_UINT, index, ints, count); +} + +bool IBurningShader::setPixelShaderConstant(s32 index, const f32* floats, int count) +{ + return setShaderConstantID(BL_FRAGMENT_FLOAT, index, floats, count); +} + +bool IBurningShader::setPixelShaderConstant(s32 index, const s32* ints, int count) +{ + return setShaderConstantID(BL_FRAGMENT_INT, index, ints, count); +} + +bool IBurningShader::setPixelShaderConstant(s32 index, const u32* ints, int count) +{ + return setShaderConstantID(BL_FRAGMENT_UINT, index, ints, count); +} + +void IBurningShader::setStencilOp(eBurningStencilOp sfail, eBurningStencilOp dpfail, eBurningStencilOp dppass) +{ + stencilOp[0] = sfail; + stencilOp[1] = dpfail; + stencilOp[2] = dppass; +} + + +IVideoDriver* IBurningShader::getVideoDriver() +{ + return Driver; +} } // end namespace video diff --git a/source/Irrlicht/IBurningShader.h b/source/Irrlicht/IBurningShader.h index 0fffff7c..8a9a8180 100644 --- a/source/Irrlicht/IBurningShader.h +++ b/source/Irrlicht/IBurningShader.h @@ -18,7 +18,9 @@ #include "SLight.h" #include "SMaterial.h" #include "os.h" - +#include "IMaterialRenderer.h" +#include "IMaterialRendererServices.h" +#include "IGPUProgrammingServices.h" namespace irr { @@ -29,56 +31,109 @@ namespace video struct SBurningShaderLight { //SLight org; - bool LightIsOn; + + sVec4 pos; //light position input + sVec4 pos4; //light position Model*View (Identity*View) E_LIGHT_TYPE Type; - f32 radius; f32 linearAttenuation; f32 constantAttenuation; f32 quadraticAttenuation; - sVec4 pos; - sVec3 AmbientColor; - sVec3 DiffuseColor; - sVec3 SpecularColor; - sVec4 pos_objectspace; + sVec4 spotDirection; + sVec4 spotDirection4; + f32 spotCosCutoff; + f32 spotCosInnerCutoff; + f32 spotExponent; + bool LightIsOn; + + sVec3Color AmbientColor; + sVec3Color DiffuseColor; + sVec3Color SpecularColor; }; - enum eLightFlags + enum eTransformLightFlags { - ENABLED = 0x01, - POINTLIGHT = 0x02, - SPECULAR = 0x04, - FOG = 0x08, - NORMALIZE = 0x10, - VERTEXTRANSFORM = 0x20, + //ENABLED = 0x01, + TL_SCISSOR = 0x02, + TL_LIGHT = 0x04, + TL_SPECULAR = 0x08, + TL_FOG = 0x10, + TL_NORMALIZE_NORMALS = 0x20, + TL_TEXTURE_TRANSFORM = 0x40, + TL_LIGHT_LOCAL_VIEWER = 0x80, + TL_LIGHT0_IS_NORMAL_MAP = 0x100 //sVec4 Light Vector is used as normal or specular }; - struct SBurningShaderLightSpace + struct SBurningShaderEyeSpace { + SBurningShaderEyeSpace() {} + virtual ~SBurningShaderEyeSpace() {} void reset () { Light.set_used ( 0 ); - Global_AmbientLight.set ( 0.f, 0.f, 0.f ); - Flags = 0; + Global_AmbientLight.set ( 0.f ); + + TL_Flag = TL_LIGHT_LOCAL_VIEWER; } + void resetFog() + { + fog_scale = 0.f; + //cam_distance = 0.f; + } + core::array Light; - sVec3 Global_AmbientLight; - sVec4 FogColor; - sVec4 campos; - sVec4 vertex; - sVec4 normal; - u32 Flags; + sVec3Color Global_AmbientLight; + + //sVec4 cam_eye_pos; //Camera Position in eye Space (0,0,-1) + //sVec4 cam_world_pos; //Camera Position in world Space + //sVec4 vertex4; //eye coordinate position of vertex + sVec4 normal; //transformed normal + sVec4 vertex; //eye coordinate position of vertex projected + + //derivative of vertex + //f32 cam_distance; // vertex.length(); + sVec4 cam_dir; //vertex.normalize(); + + f32 fog_scale; // 1 / (fog.end-fog.start) + + size_t TL_Flag; // eTransformLightFlags + }; + + enum eBurningCullFlag + { + CULL_FRONT = 1, + CULL_BACK = 2, + CULL_INVISIBLE = 4, //primitive smaller than a pixel (AreaMinDrawSize) + CULL_FRONT_AND_BACK = 8, + }; + + enum eBurningStencilOp + { + StencilOp_KEEP = 0x1E00, + StencilOp_INCR = 0x1E02, + StencilOp_DECR = 0x1E03 }; struct SBurningShaderMaterial { SMaterial org; + SMaterial lastMaterial; + bool resetRenderStates; - sVec3 AmbientColor; - sVec3 DiffuseColor; - sVec3 SpecularColor; - sVec3 EmissiveColor; + E_MATERIAL_TYPE Fallback_MaterialType; + + SMaterial mat2D; + //SMaterial save3D; + + size_t CullFlag; //eCullFlag + u32 depth_write; + u32 depth_test; + + sVec3Color AmbientColor; + sVec3Color DiffuseColor; + sVec3Color SpecularColor; + sVec3Color EmissiveColor; }; @@ -106,29 +161,88 @@ namespace video ETR_TEXTURE_GOURAUD_DETAIL_MAP, ETR_TEXTURE_GOURAUD_LIGHTMAP_ADD, - ETR_GOURAUD_ALPHA, + ETR_GOURAUD_NOZ, + //ETR_GOURAUD_ALPHA, ETR_GOURAUD_ALPHA_NOZ, ETR_TEXTURE_GOURAUD_ALPHA, ETR_TEXTURE_GOURAUD_ALPHA_NOZ, + ETR_TEXTURE_GOURAUD_ALPHA_NOZ_NOPERSPECTIVE_CORRECT, ETR_NORMAL_MAP_SOLID, ETR_STENCIL_SHADOW, ETR_TEXTURE_BLEND, - ETR_REFERENCE, + ETR_TRANSPARENT_REFLECTION_2_LAYER, + + ETR_COLOR, + + //ETR_REFERENCE, ETR_INVALID, ETR2_COUNT }; + typedef enum + { + BL_VERTEX_PROGRAM = 1, + BL_FRAGMENT_PROGRAM = 2, + BL_TYPE_FLOAT = 4, + BL_TYPE_INT = 8, + BL_TYPE_UINT = 16, + + BL_VERTEX_FLOAT = (BL_VERTEX_PROGRAM | BL_TYPE_FLOAT), + BL_VERTEX_INT = (BL_VERTEX_PROGRAM | BL_TYPE_INT), + BL_VERTEX_UINT = (BL_VERTEX_PROGRAM | BL_TYPE_UINT), + BL_FRAGMENT_FLOAT = (BL_FRAGMENT_PROGRAM | BL_TYPE_FLOAT), + BL_FRAGMENT_INT = (BL_FRAGMENT_PROGRAM | BL_TYPE_INT), + BL_FRAGMENT_UINT = (BL_FRAGMENT_PROGRAM | BL_TYPE_UINT), + + BL_ACTIVE_UNIFORM_MAX_LENGTH = 28 + } EBurningUniformFlags; + + struct BurningUniform + { + c8 name[BL_ACTIVE_UNIFORM_MAX_LENGTH]; + u32 type; //EBurningUniformFlags + //int location; // UniformLocation is index + f32 data[16]; // simple LocalParameter + + bool operator==(const BurningUniform& other) const + { + return tiny_istoken(name, other.name); + } + + }; + class CBurningVideoDriver; - class IBurningShader : public virtual IReferenceCounted + class IBurningShader : public IMaterialRenderer, public IMaterialRendererServices { public: + //! Constructor IBurningShader(CBurningVideoDriver* driver); + //! Constructor + IBurningShader( + CBurningVideoDriver* driver, + s32& outMaterialTypeNr, + const c8* vertexShaderProgram = 0, + const c8* vertexShaderEntryPointName = 0, + E_VERTEX_SHADER_TYPE vsCompileTarget = video::EVST_VS_1_1, + const c8* pixelShaderProgram = 0, + const c8* pixelShaderEntryPointName = 0, + E_PIXEL_SHADER_TYPE psCompileTarget = video::EPST_PS_1_1, + const c8* geometryShaderProgram = 0, + const c8* geometryShaderEntryPointName = "main", + E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, + scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, + scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, + u32 verticesOut = 0, + IShaderConstantSetCallBack* callback = 0, + E_MATERIAL_TYPE baseMaterial = EMT_SOLID, + s32 userData = 0); + //! destructor virtual ~IBurningShader(); @@ -136,27 +250,121 @@ namespace video virtual void setRenderTarget(video::IImage* surface, const core::rect& viewPort); //! sets the Texture - virtual void setTextureParam( u32 stage, video::CSoftwareTexture2* texture, s32 lodLevel); - virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) = 0; - virtual void drawLine ( const s4DVertex *a,const s4DVertex *b) {}; + virtual void setTextureParam( const size_t stage, video::CSoftwareTexture2* texture, s32 lodFactor); + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) {}; + virtual void drawLine ( const s4DVertex *a,const s4DVertex *b); + virtual void drawPoint(const s4DVertex *a); - virtual void setParam ( u32 index, f32 value) {}; - virtual void setZCompareFunc ( u32 func) {}; + void drawWireFrameTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ); - virtual void setMaterial ( const SBurningShaderMaterial &material ) {}; + virtual void OnSetMaterial( const SBurningShaderMaterial& material ) {}; + + void pushEdgeTest(const int wireFrame,const int point,int save) + { + if ( save ) EdgeTestPass_stack = EdgeTestPass; + EdgeTestPass = point ? edge_test_point : wireFrame ? edge_test_left : edge_test_pass; + } + void popEdgeTest() { EdgeTestPass = EdgeTestPass_stack; } + virtual bool canWireFrame () { return false; } + virtual bool canPointCloud() { return false; } + + void setStencilOp(eBurningStencilOp sfail, eBurningStencilOp dpfail, eBurningStencilOp dppass); + + //IMaterialRenderer + + virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, + bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_; + + virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) _IRR_OVERRIDE_; + + virtual void OnUnsetMaterial() _IRR_OVERRIDE_; + + //! Returns if the material is transparent. + virtual bool isTransparent() const _IRR_OVERRIDE_; + + //! Access the callback provided by the users when creating shader materials + virtual IShaderConstantSetCallBack* getShaderConstantSetCallBack() const _IRR_OVERRIDE_; + + // implementations for the render services + virtual void setBasicRenderStates(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates) _IRR_OVERRIDE_; + virtual s32 getVertexShaderConstantID(const c8* name) _IRR_OVERRIDE_; + virtual s32 getPixelShaderConstantID(const c8* name) _IRR_OVERRIDE_; + virtual void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount = 1) _IRR_OVERRIDE_; + virtual void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount = 1) _IRR_OVERRIDE_; + virtual bool setVertexShaderConstant(s32 index, const f32* floats, int count) _IRR_OVERRIDE_; + virtual bool setVertexShaderConstant(s32 index, const s32* ints, int count) _IRR_OVERRIDE_; + virtual bool setVertexShaderConstant(s32 index, const u32* ints, int count) _IRR_OVERRIDE_; + virtual bool setPixelShaderConstant(s32 index, const f32* floats, int count) _IRR_OVERRIDE_; + virtual bool setPixelShaderConstant(s32 index, const s32* ints, int count) _IRR_OVERRIDE_; + virtual bool setPixelShaderConstant(s32 index, const u32* ints, int count) _IRR_OVERRIDE_; + virtual IVideoDriver* getVideoDriver() _IRR_OVERRIDE_; + + //used if no color interpolation is defined + void setPrimitiveColor(const video::SColor& color) + { + #if BURNINGSHADER_COLOR_FORMAT == ECF_A8R8G8B8 + PrimitiveColor = color.color; + #else + PrimitiveColor = color.toA1R5G5B5(); + #endif + } + void setTLFlag(size_t in /*eTransformLightFlags*/) + { + TL_Flag = in; + } + void setFog(SColor color_fog) + { +#if BURNINGSHADER_COLOR_FORMAT == ECF_A8R8G8B8 + fog_color_sample = color_fog.color; +#else + fog_color_sample = color_fog.toA1R5G5B5(); +#endif + color_to_fix(fog_color, fog_color_sample); + } + void setScissor(const AbsRectangle& scissor) + { + Scissor = scissor; + } protected: + void constructor_IBurningShader(CBurningVideoDriver* driver); + CBurningVideoDriver *Driver; + IShaderConstantSetCallBack* CallBack; + E_MATERIAL_TYPE BaseMaterial; + s32 UserData; + + core::array UniformInfo; + s32 getShaderConstantID(EBurningUniformFlags program, const c8* name); + bool setShaderConstantID(EBurningUniformFlags flags, s32 index, const void* data, size_t u32_count); video::CImage* RenderTarget; CDepthBuffer* DepthBuffer; - CStencilBuffer * Stencil; + CStencilBuffer* Stencil; tVideoSample ColorMask; sInternalTexture IT[ BURNING_MATERIAL_MAX_TEXTURES ]; static const tFixPointu dithermask[ 4 * 4]; + + //draw degenerate triangle as line (left edge) drawTriangle -> holes,drawLine dda/bresenham + int EdgeTestPass; //edge_test_flag + int EdgeTestPass_stack; + + eBurningStencilOp stencilOp[4]; + tFixPoint AlphaRef; + int RenderPass_ShaderIsTransparent; + + sScanConvertData scan; + sScanLineData line; + tVideoSample PrimitiveColor; //used if no color interpolation is defined + + size_t /*eTransformLightFlags*/ TL_Flag; + tFixPoint fog_color[4]; + tVideoSample fog_color_sample; + + AbsRectangle Scissor; }; @@ -172,6 +380,7 @@ namespace video IBurningShader* createTriangleRendererTextureGouraudWire2(CBurningVideoDriver* driver); IBurningShader* createTriangleRendererGouraud2(CBurningVideoDriver* driver); + IBurningShader* createTriangleRendererGouraudNoZ2(CBurningVideoDriver* driver); IBurningShader* createTriangleRendererGouraudAlpha2(CBurningVideoDriver* driver); IBurningShader* createTRGouraudAlphaNoZ2(CBurningVideoDriver* driver); IBurningShader* createTriangleRendererGouraudWire2(CBurningVideoDriver* driver); @@ -192,8 +401,9 @@ namespace video IBurningShader* createTRStencilShadow(CBurningVideoDriver* driver); IBurningShader* createTriangleRendererReference(CBurningVideoDriver* driver); + IBurningShader* createTriangleRendererTexture_transparent_reflection_2_layer(CBurningVideoDriver* driver); - + IBurningShader* create_burning_shader_color(CBurningVideoDriver* driver); } // end namespace video } // end namespace irr diff --git a/source/Irrlicht/IDepthBuffer.h b/source/Irrlicht/IDepthBuffer.h index 719d9f17..89f604f3 100644 --- a/source/Irrlicht/IDepthBuffer.h +++ b/source/Irrlicht/IDepthBuffer.h @@ -21,7 +21,7 @@ namespace video virtual ~IDepthBuffer() {}; //! clears the zbuffer - virtual void clear() = 0; + virtual void clear(f32 value) = 0; //! sets the new size of the zbuffer virtual void setSize(const core::dimension2d& size) = 0; @@ -51,29 +51,29 @@ namespace video //! destructor virtual ~IStencilBuffer() {}; - //! clears the zbuffer - virtual void clear() = 0; + //! clears the stencil buffer + virtual void clear(u8 value) = 0; //! sets the new size of the zbuffer virtual void setSize(const core::dimension2d& size) = 0; - //! returns the size of the zbuffer + //! returns the size of the stencil buffer virtual const core::dimension2d& getSize() const = 0; - //! locks the zbuffer + //! locks the stencil buffer virtual void* lock() = 0; - //! unlocks the zbuffer + //! unlocks the stencil buffer virtual void unlock() = 0; - //! returns pitch of depthbuffer (in bytes) + //! returns pitch of stencil buffer (in bytes) virtual u32 getPitch() const = 0; }; //! creates a Stencil Buffer - IStencilBuffer* createStencilBuffer(const core::dimension2d& size); + IStencilBuffer* createStencilBuffer(const core::dimension2d& size, u32 bit); } // end namespace video } // end namespace irr diff --git a/source/Irrlicht/Irrlicht-gcc.cbp b/source/Irrlicht/Irrlicht-gcc.cbp index 3e8d0ad0..a1dbf210 100644 --- a/source/Irrlicht/Irrlicht-gcc.cbp +++ b/source/Irrlicht/Irrlicht-gcc.cbp @@ -972,6 +972,7 @@ + @@ -997,6 +998,7 @@ + @@ -1068,6 +1070,14 @@ + + + + + + + + diff --git a/source/Irrlicht/Irrlicht10.0.vcxproj b/source/Irrlicht/Irrlicht10.0.vcxproj index 78c279ca..b61cdc0c 100644 --- a/source/Irrlicht/Irrlicht10.0.vcxproj +++ b/source/Irrlicht/Irrlicht10.0.vcxproj @@ -1005,6 +1005,13 @@ + + + + + + + @@ -1271,6 +1278,7 @@ + @@ -1322,6 +1330,8 @@ + + diff --git a/source/Irrlicht/Irrlicht10.0.vcxproj.filters b/source/Irrlicht/Irrlicht10.0.vcxproj.filters index 6269a9c5..618fb881 100644 --- a/source/Irrlicht/Irrlicht10.0.vcxproj.filters +++ b/source/Irrlicht/Irrlicht10.0.vcxproj.filters @@ -1389,6 +1389,27 @@ include\scene + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video @@ -2356,6 +2377,15 @@ Irrlicht\video\OpenGL Context + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video diff --git a/source/Irrlicht/Irrlicht11.0.vcxproj b/source/Irrlicht/Irrlicht11.0.vcxproj index 791a36a0..e6b828e4 100644 --- a/source/Irrlicht/Irrlicht11.0.vcxproj +++ b/source/Irrlicht/Irrlicht11.0.vcxproj @@ -1004,6 +1004,13 @@ + + + + + + + @@ -1270,6 +1277,7 @@ + @@ -1321,6 +1329,8 @@ + + diff --git a/source/Irrlicht/Irrlicht11.0.vcxproj.filters b/source/Irrlicht/Irrlicht11.0.vcxproj.filters index f61a3f95..1cffa753 100644 --- a/source/Irrlicht/Irrlicht11.0.vcxproj.filters +++ b/source/Irrlicht/Irrlicht11.0.vcxproj.filters @@ -1390,6 +1390,27 @@ include\scene + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + @@ -2357,6 +2378,15 @@ Irrlicht\video\OpenGL Context + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + diff --git a/source/Irrlicht/Irrlicht12.0.vcxproj b/source/Irrlicht/Irrlicht12.0.vcxproj index 7b01c746..9581357a 100644 --- a/source/Irrlicht/Irrlicht12.0.vcxproj +++ b/source/Irrlicht/Irrlicht12.0.vcxproj @@ -1321,6 +1321,8 @@ + + diff --git a/source/Irrlicht/Irrlicht12.0.vcxproj.filters b/source/Irrlicht/Irrlicht12.0.vcxproj.filters index 7e94d188..0623a911 100644 --- a/source/Irrlicht/Irrlicht12.0.vcxproj.filters +++ b/source/Irrlicht/Irrlicht12.0.vcxproj.filters @@ -2357,6 +2357,12 @@ Irrlicht\video\OpenGL Context + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + diff --git a/source/Irrlicht/Irrlicht14.0.vcxproj b/source/Irrlicht/Irrlicht14.0.vcxproj index 22385f15..47f07a3a 100644 --- a/source/Irrlicht/Irrlicht14.0.vcxproj +++ b/source/Irrlicht/Irrlicht14.0.vcxproj @@ -1015,7 +1015,15 @@ + + + + + + + + @@ -1281,6 +1289,7 @@ + @@ -1332,6 +1341,8 @@ + + diff --git a/source/Irrlicht/Irrlicht14.0.vcxproj.filters b/source/Irrlicht/Irrlicht14.0.vcxproj.filters index ed8c285b..077634de 100644 --- a/source/Irrlicht/Irrlicht14.0.vcxproj.filters +++ b/source/Irrlicht/Irrlicht14.0.vcxproj.filters @@ -1390,6 +1390,30 @@ include\scene + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Null + @@ -2357,6 +2381,15 @@ Irrlicht\video\OpenGL Context + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + diff --git a/source/Irrlicht/Irrlicht15.0.vcxproj b/source/Irrlicht/Irrlicht15.0.vcxproj index 3e766078..4ae8670c 100644 --- a/source/Irrlicht/Irrlicht15.0.vcxproj +++ b/source/Irrlicht/Irrlicht15.0.vcxproj @@ -1014,6 +1014,13 @@ + + + + + + + @@ -1268,6 +1275,7 @@ + @@ -1309,6 +1317,8 @@ + + diff --git a/source/Irrlicht/Irrlicht15.0.vcxproj.filters b/source/Irrlicht/Irrlicht15.0.vcxproj.filters index 7230ff84..16c0835f 100644 --- a/source/Irrlicht/Irrlicht15.0.vcxproj.filters +++ b/source/Irrlicht/Irrlicht15.0.vcxproj.filters @@ -1342,6 +1342,27 @@ include\video + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + @@ -2280,6 +2301,15 @@ Irrlicht\video\OpenGL Context + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + + + Irrlicht\video\Burning Video + diff --git a/source/Irrlicht/Makefile b/source/Irrlicht/Makefile index 37b14fb3..c967d247 100644 --- a/source/Irrlicht/Makefile +++ b/source/Irrlicht/Makefile @@ -47,7 +47,13 @@ IRRDRVROBJ = CNullDriver.o COpenGLCacheHandler.o COpenGLDriver.o COpenGLNormalMa IRRIMAGEOBJ = CColorConverter.o CImage.o CImageLoaderBMP.o CImageLoaderDDS.o CImageLoaderJPG.o CImageLoaderPCX.o CImageLoaderPNG.o CImageLoaderPSD.o CImageLoaderPVR.o CImageLoaderTGA.o CImageLoaderPPM.o CImageLoaderWAL.o CImageLoaderRGB.o \ CImageWriterBMP.o CImageWriterJPG.o CImageWriterPCX.o CImageWriterPNG.o CImageWriterPPM.o CImageWriterPSD.o CImageWriterTGA.o IRRVIDEOOBJ = CVideoModeList.o CFPSCounter.o $(IRRDRVROBJ) $(IRRIMAGEOBJ) -IRRSWRENDEROBJ = CSoftwareDriver.o CSoftwareTexture.o CTRFlat.o CTRFlatWire.o CTRGouraud.o CTRGouraudWire.o CTRNormalMap.o CTRStencilShadow.o CTRTextureFlat.o CTRTextureFlatWire.o CTRTextureGouraud.o CTRTextureGouraudAdd.o CTRTextureGouraudNoZ.o CTRTextureGouraudWire.o CZBuffer.o CTRTextureGouraudVertexAlpha2.o CTRTextureGouraudNoZ2.o CTRTextureLightMap2_M2.o CTRTextureLightMap2_M4.o CTRTextureLightMap2_M1.o CSoftwareDriver2.o CSoftwareTexture2.o CTRTextureGouraud2.o CTRGouraud2.o CTRGouraudAlpha2.o CTRGouraudAlphaNoZ2.o CTRTextureDetailMap2.o CTRTextureGouraudAdd2.o CTRTextureGouraudAddNoZ2.o CTRTextureWire2.o CTRTextureLightMap2_Add.o CTRTextureLightMapGouraud2_M4.o IBurningShader.o CTRTextureBlend.o CTRTextureGouraudAlpha.o CTRTextureGouraudAlphaNoZ.o CDepthBuffer.o CBurningShader_Raster_Reference.o +IRRSWRENDEROBJ = CSoftwareDriver.o CSoftwareTexture.o CTRFlat.o CTRFlatWire.o CTRGouraud.o CTRGouraudWire.o CTRNormalMap.o \ + CTRStencilShadow.o CTRTextureFlat.o CTRTextureFlatWire.o CTRTextureGouraud.o CTRTextureGouraudAdd.o CTRTextureGouraudNoZ.o \ + CTRTextureGouraudWire.o CZBuffer.o CTRTextureGouraudVertexAlpha2.o CTRTextureGouraudNoZ2.o CTRTextureLightMap2_M2.o \ + CTRTextureLightMap2_M4.o CTRTextureLightMap2_M1.o CSoftwareDriver2.o CSoftwareTexture2.o CTRTextureGouraud2.o CTRGouraud2.o \ + CTRGouraudAlpha2.o CTRGouraudAlphaNoZ2.o CTRTextureDetailMap2.o CTRTextureGouraudAdd2.o CTRTextureGouraudAddNoZ2.o CTRTextureWire2.o \ + CTRTextureLightMap2_Add.o CTRTextureLightMapGouraud2_M4.o IBurningShader.o CTRTextureBlend.o CTRTextureGouraudAlpha.o \ + CTRTextureGouraudAlphaNoZ.o CDepthBuffer.o CBurningShader_Raster_Reference.o CTR_transparent_reflection_2_layer.o CTRGouraudNoZ2.o burning_shader_color.o IRRIOOBJ = CFileList.o CFileSystem.o CLimitReadFile.o CMemoryFile.o CReadFile.o CWriteFile.o CXMLReader.o CXMLWriter.o CWADReader.o CZipReader.o CPakReader.o CNPKReader.o CTarReader.o CMountPointReader.o irrXML.o CAttributes.o lzma/LzmaDec.o IRROTHEROBJ = CIrrDeviceSDL.o CIrrDeviceLinux.o CIrrDeviceConsole.o CIrrDeviceStub.o CIrrDeviceWin32.o CIrrDeviceFB.o CLogger.o COSOperator.o Irrlicht.o os.o leakHunter.o CProfiler.o utf8.o IRRGUIOBJ = CGUIButton.o CGUICheckBox.o CGUIComboBox.o CGUIContextMenu.o CGUIEditBox.o CGUIEnvironment.o CGUIFileOpenDialog.o CGUIFont.o CGUIImage.o CGUIInOutFader.o CGUIListBox.o CGUIMenu.o CGUIMeshViewer.o CGUIMessageBox.o CGUIModalScreen.o CGUIScrollBar.o CGUISpinBox.o CGUISkin.o CGUIStaticText.o CGUITabControl.o CGUITable.o CGUIToolBar.o CGUIWindow.o CGUIColorSelectDialog.o CDefaultGUIElementFactory.o CGUISpriteBank.o CGUIImageList.o CGUITreeView.o CGUIProfiler.o diff --git a/source/Irrlicht/S4DVertex.h b/source/Irrlicht/S4DVertex.h index 7ad6b83d..92abbb26 100644 --- a/source/Irrlicht/S4DVertex.h +++ b/source/Irrlicht/S4DVertex.h @@ -9,6 +9,7 @@ #include "SoftwareDriver2_compile_config.h" #include "SoftwareDriver2_helper.h" #include "irrAllocator.h" +#include "EPrimitiveTypes.h" namespace irr { @@ -16,6 +17,7 @@ namespace irr namespace video { +//! sVec2 used in BurningShader texture coordinates struct sVec2 { f32 x; @@ -34,10 +36,10 @@ struct sVec2 } // f = a * t + b * ( 1 - t ) - void interpolate(const sVec2& a, const sVec2& b, const f32 t) + void interpolate(const sVec2& burning_restrict a, const sVec2& burning_restrict b, const ipoltype t) { - x = b.x + ( ( a.x - b.x ) * t ); - y = b.y + ( ( a.y - b.y ) * t ); + x = (f32)(b.x + ( ( a.x - b.x ) * t )); + y = (f32)(b.y + ( ( a.y - b.y ) * t )); } sVec2 operator-(const sVec2& other) const @@ -75,126 +77,79 @@ struct sVec2 }; -// A8R8G8B8 -struct sVec4; -struct sCompressedVec4 +#include "irrpack.h" + +//! sVec3Pack used in BurningShader, packed direction +struct sVec3Pack { - u32 argb; + f32 x, y, z; + //f32 _can_pack; - void setA8R8G8B8 ( u32 value ) - { - argb = value; - } - - void setColorf ( const video::SColorf & color ) - { - argb = core::floor32_fast( color.a * 255.f ) << 24 | - core::floor32_fast( color.r * 255.f ) << 16 | - core::floor32_fast( color.g * 255.f ) << 8 | - core::floor32_fast( color.b * 255.f ); - } - - void setVec4 ( const sVec4 & v ); + sVec3Pack() {} + sVec3Pack(f32 _x, f32 _y, f32 _z) + : x(_x), y(_y), z(_z) {} // f = a * t + b * ( 1 - t ) - void interpolate(const sCompressedVec4& a, const sCompressedVec4& b, const f32 t) + void interpolate(const sVec3Pack& burning_restrict v0, const sVec3Pack& burning_restrict v1, const ipoltype t) { - argb = PixelBlend32 ( b.argb, a.argb, core::floor32_fast( t * 256.f ) ); + x = (f32)(v1.x + ((v0.x - v1.x) * t)); + y = (f32)(v1.y + ((v0.y - v1.y) * t)); + z = (f32)(v1.z + ((v0.z - v1.z) * t)); } + sVec3Pack operator-(const sVec3Pack& other) const + { + return sVec3Pack(x - other.x, y - other.y, z - other.z); + } -}; + sVec3Pack operator+(const sVec3Pack& other) const + { + return sVec3Pack(x + other.x, y + other.y, z + other.z); + } + sVec3Pack operator*(const f32 s) const + { + return sVec3Pack(x * s, y * s, z * s); + } + void operator+=(const sVec3Pack& other) + { + x += other.x; + y += other.y; + z += other.z; + } + + void operator=(const sVec3Pack& other) + { + x = other.x; + y = other.y; + z = other.z; + } + +} PACK_STRUCT; + +#include "irrunpack.h" + +//! sVec4 used in Driver,BurningShader, direction/color struct sVec4 { union { struct { f32 x, y, z, w; }; struct { f32 a, r, g, b; }; -// struct { sVec2 xy, zw; }; // sorry, this does not compile with gcc }; - - sVec4 () {} - - sVec4 ( f32 s) : x ( s ), y ( s ), z ( s ), w ( s ) {} - sVec4 ( f32 _x, f32 _y, f32 _z, f32 _w ) : x ( _x ), y ( _y ), z( _z ), w ( _w ){} - void set ( f32 _x, f32 _y, f32 _z, f32 _w ) - { - x = _x; - y = _y; - z = _z; - w = _w; - } - - void setA8R8G8B8 ( u32 argb ) - { - x = ( ( argb & 0xFF000000 ) >> 24 ) * ( 1.f / 255.f ); - y = ( ( argb & 0x00FF0000 ) >> 16 ) * ( 1.f / 255.f ); - z = ( ( argb & 0x0000FF00 ) >> 8 ) * ( 1.f / 255.f ); - w = ( ( argb & 0x000000FF ) ) * ( 1.f / 255.f ); - } - - - void setColorf ( const video::SColorf & color ) - { - x = color.a; - y = color.r; - z = color.g; - w = color.b; - } - - // f = a * t + b * ( 1 - t ) - void interpolate(const sVec4& a, const sVec4& b, const f32 t) + void interpolate(const sVec4& burning_restrict a, const sVec4& burning_restrict b, const ipoltype t) { - x = b.x + ( ( a.x - b.x ) * t ); - y = b.y + ( ( a.y - b.y ) * t ); - z = b.z + ( ( a.z - b.z ) * t ); - w = b.w + ( ( a.w - b.w ) * t ); - } - - - f32 dotProduct(const sVec4& other) const - { - return x*other.x + y*other.y + z*other.z + w*other.w; - } - - f32 dot_xyz( const sVec4& other) const - { - return x*other.x + y*other.y + z*other.z; - } - - f32 get_length_xyz_square () const - { - return x * x + y * y + z * z; - } - - f32 get_length_xyz () const - { - return core::squareroot ( x * x + y * y + z * z ); - } - - void normalize_xyz () - { - const f32 l = core::reciprocal_squareroot ( x * x + y * y + z * z ); - - x *= l; - y *= l; - z *= l; - } - - void project_xyz () - { - w = core::reciprocal ( w ); - x *= w; - y *= w; - z *= w; + x = (f32)(b.x + ( ( a.x - b.x ) * t )); + y = (f32)(b.y + ( ( a.y - b.y ) * t )); + z = (f32)(b.z + ( ( a.z - b.z ) * t )); + w = (f32)(b.w + ( ( a.w - b.w ) * t )); } sVec4 operator-(const sVec4& other) const @@ -225,32 +180,6 @@ 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 mul ( const f32 s ) - { - x *= s; - y *= s; - z *= s; - w *= s; - } - -/* - void operator*=(f32 s) - { - x *= s; - y *= s; - z *= s; - w *= s; - } -*/ void operator*=(const sVec4 &other) { x *= other.x; @@ -266,142 +195,180 @@ struct sVec4 z = other.z; w = other.w; } + + //outside shader + void set(f32 _x, f32 _y, f32 _z, f32 _w) + { + x = _x; + y = _y; + z = _z; + w = _w; + } + void setA8R8G8B8(const u32 argb) + { + a = ((argb & 0xFF000000) >> 24) * (1.f / 255.f); + r = ((argb & 0x00FF0000) >> 16) * (1.f / 255.f); + g = ((argb & 0x0000FF00) >> 8 ) * (1.f / 255.f); + b = ((argb & 0x000000FF) ) * (1.f / 255.f); + } + + REALINLINE ipoltype dot_xyzw(const sVec4& other) const + { + return (ipoltype)x * other.x + (ipoltype)y * other.y + (ipoltype)z * other.z + (ipoltype)w * other.w; + } + + REALINLINE f32 dot_xyz(const sVec4& other) const + { + return x * other.x + y * other.y + z * other.z; + } + + REALINLINE f32 dot_minus_xyz(const sVec4& other) const + { + return -x * other.x + -y * other.y + -z * other.z; + } + + void mul_xyz(const f32 s) + { + x *= s; + y *= s; + z *= s; + } + + f32 length_xyz() const + { + return sqrtf(x * x + y * y + z * z); + } + + void normalize_dir_xyz() + { + //const f32 l = core::reciprocal_squareroot(x * x + y * y + z * z); + f32 l = x * x + y * y + z * z; + l = l > 0.0000001f ? 1.f / sqrtf(l) : 1.f; + x *= l; + y *= l; + z *= l; + } + + + //unpack sVec3 to aligned during runtime + sVec4(const sVec3Pack& other) + { + x = other.x; + y = other.y; + z = other.z; + w = 0.f; + } + + void normalize_pack_xyz(sVec3Pack& out, const f32 len, const f32 ofs) const + { + //const f32 l = len * core::reciprocal_squareroot ( r * r + g * g + b * b ); + f32 l = x * x + y * y + z * z; + + l = l > 0.0000001f ? len / sqrtf(l) : 0.f; + out.x = (x*l) + ofs; + out.y = (y*l) + ofs; + out.z = (z*l) + ofs; + } + }; -struct sVec3 +//!during runtime sVec3Pack +typedef sVec4 sVec3Pack_unpack; + +//!sVec4 is argb. sVec3Color is rgba +struct sVec3Color { - union + f32 r, g, b,a; + + void set(const f32 s) { - struct { f32 r, g, b; }; - struct { f32 x, y, z; }; - }; - - - sVec3 () {} - sVec3 ( f32 _x, f32 _y, f32 _z ) - : r ( _x ), g ( _y ), b( _z ) {} - - sVec3 ( const sVec4 &v ) - : r ( v.x ), g ( v.y ), b( v.z ) {} - - void set ( f32 _r, f32 _g, f32 _b ) - { - r = _r; - g = _g; - b = _b; + r = s; + g = s; + b = s; + a = s; } - void setR8G8B8 ( u32 argb ) + void setA8R8G8B8(const 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 ); + r = ((argb & 0x00FF0000) >> 16) * (1.f / 255.f); + g = ((argb & 0x0000FF00) >> 8 ) * (1.f / 255.f); + b = ((argb & 0x000000FF) ) * (1.f / 255.f); + a = ((argb & 0xFF000000) >> 24) * (1.f / 255.f); } - void setColorf ( const video::SColorf & color ) + void setColorf(const video::SColorf & color) { r = color.r; g = color.g; b = color.b; + a = color.a; } - void add (const sVec3& other) + void add_rgb(const sVec3Color& other) { r += other.r; g += other.g; b += other.b; } - void mulAdd(const sVec3& other, const f32 v) + void mad_rgb(const sVec3Color& other, const f32 v) { r += other.r * v; g += other.g * v; b += other.b * v; } - void mulAdd(const sVec3& v0, const sVec3& v1) + void mad_rgbv(const sVec3Color& v0, const sVec3Color& v1) { r += v0.r * v1.r; g += v0.g * v1.g; b += v0.b * v1.b; } - void saturate ( sVec4 &dest, u32 argb ) + //sVec4 is a,r,g,b, alpha pass + void sat(sVec4 &dest, const u32 argb) const { - 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 ); + dest.a = ((argb & 0xFF000000) >> 24) * (1.f / 255.f); + dest.r = r <= 1.f ? r : 1.f; + dest.g = g <= 1.f ? g : 1.f; + dest.b = b <= 1.f ? b : 1.f; } - // f = a * t + b * ( 1 - t ) - void interpolate(const sVec3& v0, const sVec3& v1, const f32 t) + void sat_xyz(sVec3Pack &dest, const sVec3Color& v1) const { - r = v1.r + ( ( v0.r - v1.r ) * t ); - g = v1.g + ( ( v0.g - v1.g ) * t ); - b = v1.b + ( ( v0.b - v1.b ) * t ); + f32 v; + v = r * v1.r; dest.x = v < 1.f ? v : 1.f; + v = g * v1.g; dest.y = v < 1.f ? v : 1.f; + v = b * v1.b; dest.z = v < 1.f ? v : 1.f; } - sVec3 operator-(const sVec3& other) const + void sat_xyz(sVec4 &dest, const sVec3Color& v1) const { - return sVec3(r - other.r, b - other.b, g - other.g); + f32 v; + dest.a = 1.f; + v = r * v1.r; dest.r = v < 1.f ? v : 1.f; + v = g * v1.g; dest.g = v < 1.f ? v : 1.f; + v = b * v1.b; dest.b = v < 1.f ? v : 1.f; } - sVec3 operator+(const sVec3& other) const - { - return sVec3(r + other.r, g + other.g, b + other.b); - } - - sVec3 operator*(const f32 s) const - { - return sVec3(r * s , g * s, b * s); - } - - sVec3 operator/(const f32 s) const - { - f32 inv = 1.f / s; - return sVec3(r * inv , g * inv, b * inv); - } - - sVec3 operator*(const sVec3 &other) const - { - return sVec3(r * other.r , b * other.b, g * other.g); - } - - void operator+=(const sVec3& other) - { - r += other.r; - g += other.g; - b += other.b; - } - - void setLength ( f32 len ) - { - const f32 l = len * core::reciprocal_squareroot ( r * r + g * g + b * b ); - - r *= l; - g *= l; - b *= l; - } }; - - -inline void sCompressedVec4::setVec4 ( const sVec4 & v ) -{ - argb = core::floor32_fast( v.x * 255.f ) << 24 | - core::floor32_fast( v.y * 255.f ) << 16 | - core::floor32_fast( v.z * 255.f ) << 8 | - core::floor32_fast( v.w * 255.f ); -} - - +//internal BurningShaderFlag for a Vertex enum e4DVertexFlag { - VERTEX4D_INSIDE = 0x0000003F, - VERTEX4D_CLIPMASK = 0x0000003F, - VERTEX4D_PROJECTED = 0x00000100, + VERTEX4D_CLIPMASK = 0x0000003F, + VERTEX4D_CLIP_NEAR = 0x00000001, + VERTEX4D_CLIP_FAR = 0x00000002, + VERTEX4D_CLIP_LEFT = 0x00000004, + VERTEX4D_CLIP_RIGHT = 0x00000008, + VERTEX4D_CLIP_BOTTOM = 0x00000010, + VERTEX4D_CLIP_TOP = 0x00000020, + VERTEX4D_INSIDE = 0x0000003F, + + VERTEX4D_PROJECTED = 0x00000100, + VERTEX4D_VAL_ZERO = 0x00000200, + VERTEX4D_VAL_ONE = 0x00000400, VERTEX4D_FORMAT_MASK = 0xFFFF0000, @@ -413,62 +380,126 @@ enum e4DVertexFlag VERTEX4D_FORMAT_MASK_COLOR = 0x00F00000, VERTEX4D_FORMAT_COLOR_1 = 0x00100000, - VERTEX4D_FORMAT_COLOR_2 = 0x00200000, + VERTEX4D_FORMAT_COLOR_2_FOG = 0x00200000, + VERTEX4D_FORMAT_COLOR_3 = 0x00300000, + VERTEX4D_FORMAT_COLOR_4 = 0x00400000, - VERTEX4D_FORMAT_MASK_BUMP = 0x0F000000, - VERTEX4D_FORMAT_BUMP_DOT3 = 0x01000000, + VERTEX4D_FORMAT_MASK_LIGHT = 0x0F000000, + VERTEX4D_FORMAT_LIGHT_1 = 0x01000000, + VERTEX4D_FORMAT_LIGHT_2 = 0x02000000, + + VERTEX4D_FORMAT_MASK_TANGENT = 0xF0000000, + VERTEX4D_FORMAT_BUMP_DOT3 = 0x10000000, + VERTEX4D_FORMAT_SPECULAR = 0x20000000, }; -const u32 MATERIAL_MAX_COLORS = 1; -const u32 BURNING_MATERIAL_MAX_TEXTURES = 2; -const u32 BURNING_MATERIAL_MAX_TANGENT = 1; +//! vertex layout +enum e4DVertexType +{ + E4VT_STANDARD = 0, // EVT_STANDARD, video::S3DVertex. + E4VT_2TCOORDS = 1, // EVT_2TCOORDS, video::S3DVertex2TCoords. + E4VT_TANGENTS = 2, // EVT_TANGENTS, video::S3DVertexTangents + E4VT_REFLECTION_MAP = 3, + E4VT_SHADOW = 4, // float * 3 + E4VT_NO_TEXTURE = 5, // runtime if texture missing + E4VT_LINE = 6, + + E4VT_COUNT +}; + +enum e4DIndexType +{ + E4IT_16BIT = 1, // EIT_16BIT, + E4IT_32BIT = 2, // EIT_32BIT, + E4IT_NONE = 4, // +}; + +#ifdef BURNINGVIDEO_RENDERER_BEAUTIFUL + #define BURNING_MATERIAL_MAX_TEXTURES 4 + #define BURNING_MATERIAL_MAX_COLORS 4 + #define BURNING_MATERIAL_MAX_LIGHT_TANGENT 1 + + //ensure handcrafted sizeof(s4DVertex) + #define sizeof_s4DVertex 128 + +#else + #define BURNING_MATERIAL_MAX_TEXTURES 2 + #ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR + #define BURNING_MATERIAL_MAX_COLORS 1 + #else + #define BURNING_MATERIAL_MAX_COLORS 0 + #endif + #define BURNING_MATERIAL_MAX_LIGHT_TANGENT 1 + + //ensure handcrafted sizeof(s4DVertex) + #define sizeof_s4DVertex 64 +#endif // dummy Vertex. used for calculation vertex memory size struct s4DVertex_proxy { - u32 flag; sVec4 Pos; +#if BURNING_MATERIAL_MAX_TEXTURES > 0 sVec2 Tex[BURNING_MATERIAL_MAX_TEXTURES]; - -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR - sVec4 Color[MATERIAL_MAX_COLORS]; #endif - - sVec3 LightTangent[BURNING_MATERIAL_MAX_TANGENT]; +#if BURNING_MATERIAL_MAX_COLORS > 0 + sVec4 Color[BURNING_MATERIAL_MAX_COLORS]; +#endif +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT > 0 + sVec3Pack LightTangent[BURNING_MATERIAL_MAX_LIGHT_TANGENT]; +#endif + u32 flag; // e4DVertexFlag }; -#define SIZEOF_SVERTEX 64 -#define SIZEOF_SVERTEX_LOG2 6 /*! Internal BurningVideo Vertex */ struct s4DVertex { - u32 flag; - sVec4 Pos; +#if BURNING_MATERIAL_MAX_TEXTURES > 0 sVec2 Tex[ BURNING_MATERIAL_MAX_TEXTURES ]; - -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR - sVec4 Color[ MATERIAL_MAX_COLORS ]; +#endif +#if BURNING_MATERIAL_MAX_COLORS > 0 + sVec4 Color[ BURNING_MATERIAL_MAX_COLORS ]; +#endif +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT > 0 + sVec3Pack LightTangent[BURNING_MATERIAL_MAX_LIGHT_TANGENT]; #endif - sVec3 LightTangent[BURNING_MATERIAL_MAX_TANGENT]; + u32 flag; // e4DVertexFlag - //u8 fill [ SIZEOF_SVERTEX - sizeof (s4DVertex_proxy) ]; + +#if BURNING_MATERIAL_MAX_COLORS < 1 || BURNING_MATERIAL_MAX_LIGHT_TANGENT < 1 + u8 __align [sizeof_s4DVertex - sizeof (s4DVertex_proxy) ]; +#endif // f = a * t + b * ( 1 - t ) - void interpolate(const s4DVertex& b, const s4DVertex& a, const f32 t) + void interpolate(const s4DVertex& burning_restrict b, const s4DVertex& burning_restrict a, const ipoltype t) { - u32 i; - u32 size; - Pos.interpolate ( a.Pos, b.Pos, t ); +#if 0 + Tex[0].interpolate(a.Tex[0], b.Tex[0], t); + Tex[1].interpolate(a.Tex[1], b.Tex[1], t); + Color[0].interpolate(a.Color[0], b.Color[0], t); + LightTangent[0].interpolate(a.LightTangent[0], b.LightTangent[0], t); +#endif -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR + size_t i; + size_t size; + +#if BURNING_MATERIAL_MAX_TEXTURES > 0 + size = (flag & VERTEX4D_FORMAT_MASK_TEXTURE) >> 16; + for ( i = 0; i!= size; ++i ) + { + Tex[i].interpolate ( a.Tex[i], b.Tex[i], t ); + } +#endif + +#if BURNING_MATERIAL_MAX_COLORS > 0 size = (flag & VERTEX4D_FORMAT_MASK_COLOR) >> 20; for ( i = 0; i!= size; ++i ) { @@ -476,50 +507,164 @@ struct s4DVertex } #endif - size = (flag & VERTEX4D_FORMAT_MASK_TEXTURE) >> 16; - for ( i = 0; i!= size; ++i ) - { - Tex[i].interpolate ( a.Tex[i], b.Tex[i], t ); - } - - size = (flag & VERTEX4D_FORMAT_MASK_BUMP) >> 24; +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT > 0 + size = (flag & VERTEX4D_FORMAT_MASK_LIGHT) >> 24; for ( i = 0; i!= size; ++i ) { LightTangent[i].interpolate ( a.LightTangent[i], b.LightTangent[i], t ); } +#endif } }; // ----------------- Vertex Cache --------------------------- -struct SAlignedVertex +// Buffer is used as pairs of S4DVertex (0 ... ndc, 1 .. dc and projected) +typedef s4DVertex s4DVertexPair; +#define sizeof_s4DVertexPairRel 2 +#define s4DVertex_ofs(index) ((index)*sizeof_s4DVertexPairRel) +#define s4DVertex_proj(index) ((index)*sizeof_s4DVertexPairRel) + 1 + +struct SAligned4DVertex { - SAlignedVertex ( u32 element, u32 aligned ) - : ElementSize ( element ) + SAligned4DVertex() + :data(0),mem(0), ElementSize(0) {} + + virtual ~SAligned4DVertex () { - u32 byteSize = (ElementSize << SIZEOF_SVERTEX_LOG2 ) + aligned; - mem = new u8 [ byteSize ]; - data = (s4DVertex*) mem; + if (mem) + { + delete[] mem; + mem = 0; + } } - virtual ~SAlignedVertex () + void resize(size_t element) { - delete [] mem; + if (element > ElementSize) + { + if (mem) delete[] mem; + size_t byteSize = align_next(element * sizeof_s4DVertex, 4096); + mem = new u8[byteSize]; + } + ElementSize = element; + data = (s4DVertex*)mem; } - s4DVertex *data; - u8 *mem; - u32 ElementSize; + s4DVertex* data; //align to 16 byte + u8* mem; + size_t ElementSize; }; +//#define memcpy_s4DVertexPair(dst,src) memcpy(dst,src,sizeof_s4DVertex * 2) +static REALINLINE void memcpy_s4DVertexPair(void* burning_restrict dst, const void* burning_restrict src) +{ + //test alignment -> if already in aligned data +#if 0 + if (((size_t)dst & 0xC) | ((size_t)src & 0xC)) + { + int g = 1; + } +#endif -// hold info for different Vertex Types +#if defined(ENV64BIT) && (sizeof_s4DVertex * sizeof_s4DVertexPairRel == 128) + u64* burning_restrict dst64 = (u64*)dst; + const u64* burning_restrict src64 = (const u64*)src; + + dst64[0] = src64[0]; + dst64[1] = src64[1]; + dst64[2] = src64[2]; + dst64[3] = src64[3]; + dst64[4] = src64[4]; + dst64[5] = src64[5]; + dst64[6] = src64[6]; + dst64[7] = src64[7]; + + dst64[8] = src64[8]; + dst64[9] = src64[9]; + dst64[10] = src64[10]; + dst64[11] = src64[11]; + dst64[12] = src64[12]; + dst64[13] = src64[13]; + dst64[14] = src64[14]; + dst64[15] = src64[15]; + +#elif defined(ENV64BIT) && (sizeof_s4DVertex * sizeof_s4DVertexPairRel == 256) + u64* burning_restrict dst64 = (u64*)dst; + const u64* burning_restrict src64 = (const u64*)src; + + dst64[0] = src64[0]; + dst64[1] = src64[1]; + dst64[2] = src64[2]; + dst64[3] = src64[3]; + dst64[4] = src64[4]; + dst64[5] = src64[5]; + dst64[6] = src64[6]; + dst64[7] = src64[7]; + + dst64[8] = src64[8]; + dst64[9] = src64[9]; + dst64[10] = src64[10]; + dst64[11] = src64[11]; + dst64[12] = src64[12]; + dst64[13] = src64[13]; + dst64[14] = src64[14]; + dst64[15] = src64[15]; + + dst64[16] = src64[16]; + dst64[17] = src64[17]; + dst64[18] = src64[18]; + dst64[19] = src64[19]; + dst64[20] = src64[20]; + dst64[21] = src64[21]; + dst64[22] = src64[22]; + dst64[23] = src64[23]; + + dst64[24] = src64[24]; + dst64[25] = src64[25]; + dst64[26] = src64[26]; + dst64[27] = src64[27]; + dst64[28] = src64[28]; + dst64[29] = src64[29]; + dst64[30] = src64[30]; + dst64[31] = src64[31]; + +#else + u32* dst32 = (u32*)dst; + const u32* src32 = (const u32*)src; + + size_t len = sizeof_s4DVertex * sizeof_s4DVertexPairRel; + while (len >= 32) + { + *dst32++ = *src32++; + *dst32++ = *src32++; + *dst32++ = *src32++; + *dst32++ = *src32++; + *dst32++ = *src32++; + *dst32++ = *src32++; + *dst32++ = *src32++; + *dst32++ = *src32++; + len -= 32; + } +/* + while (len >= 4) + { + *dst32++ = *src32++; + len -= 4; + } +*/ +#endif +} + + +//! hold info for different Vertex Types struct SVSize { - u32 Format; - u32 Pitch; - u32 TexSize; + size_t Format; // e4DVertexFlag VERTEX4D_FORMAT_MASK_TEXTURE + size_t Pitch; // sizeof Vertex + size_t TexSize; // amount Textures + size_t TexCooSize; // sizeof TextureCoordinates }; @@ -530,18 +675,24 @@ struct SCacheInfo u32 hit; }; -#define VERTEXCACHE_ELEMENT 16 +//must at least hold all possible (clipped) vertices of primitive. +#define VERTEXCACHE_ELEMENT 16 #define VERTEXCACHE_MISS 0xFFFFFFFF struct SVertexCache { - SVertexCache (): mem ( VERTEXCACHE_ELEMENT * 2, 128 ) {} + SVertexCache () {} + ~SVertexCache() {} + + //VertexType + SVSize vSize[E4VT_COUNT]; SCacheInfo info[VERTEXCACHE_ELEMENT]; + SCacheInfo info_temp[VERTEXCACHE_ELEMENT]; // Transformed and lite, clipping state // + Clipped, Projected - SAlignedVertex mem; + SAligned4DVertex mem; // source const void* vertices; @@ -550,15 +701,15 @@ struct SVertexCache const void* indices; u32 indexCount; u32 indicesIndex; - u32 indicesRun; + u32 indicesPitch; // primitives consist of x vertices - u32 primitivePitch; + size_t primitiveHasVertex; - u32 vType; //E_VERTEX_TYPE - u32 pType; //scene::E_PRIMITIVE_TYPE - u32 iType; //E_INDEX_TYPE iType + e4DVertexType vType; //E_VERTEX_TYPE + scene::E_PRIMITIVE_TYPE pType; //scene::E_PRIMITIVE_TYPE + e4DIndexType iType; //E_INDEX_TYPE iType }; @@ -579,10 +730,11 @@ REALINLINE void swapVertexPointer(const s4DVertex** v1, const s4DVertex** v2) // internal scan convert struct sScanConvertData { - u8 left; // major edge left/right - u8 right; // !left + u32 left; // major edge left/right + u32 right; // !left + u32 _unused_pack[2]; - f32 invDeltaY[3]; // inverse edge delta y + f32 invDeltaY[4]; // inverse edge delta for screen space sorted triangle f32 x[2]; // x coordinate f32 slopeX[2]; // x slope along edges @@ -595,20 +747,27 @@ struct sScanConvertData f32 slopeZ[2]; // z slope along edges #endif - sVec4 c[MATERIAL_MAX_COLORS][2]; // color - sVec4 slopeC[MATERIAL_MAX_COLORS][2]; // color slope along edges +#if BURNING_MATERIAL_MAX_COLORS > 0 + sVec4 c[BURNING_MATERIAL_MAX_COLORS][2]; // color + sVec4 slopeC[BURNING_MATERIAL_MAX_COLORS][2]; // color slope along edges +#endif +#if BURNING_MATERIAL_MAX_TEXTURES > 0 sVec2 t[BURNING_MATERIAL_MAX_TEXTURES][2]; // texture sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES][2]; // texture slope along edges +#endif - sVec3 l[BURNING_MATERIAL_MAX_TANGENT][2]; // Light Tangent - sVec3 slopeL[BURNING_MATERIAL_MAX_TEXTURES][2]; // tanget slope along edges +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT > 0 + sVec3Pack_unpack l[BURNING_MATERIAL_MAX_LIGHT_TANGENT][2]; // Light Tangent + sVec3Pack_unpack slopeL[BURNING_MATERIAL_MAX_LIGHT_TANGENT][2]; // tanget slope along edges +#endif }; // passed to scan Line struct sScanLineData { s32 y; // y position of scanline + u32 _unused_pack[1]; f32 x[2]; // x start, x end of scanline #if defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) || defined ( SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT ) @@ -617,12 +776,19 @@ struct sScanLineData f32 z[2]; // z start, z end of scanline #endif -#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR - sVec4 c[MATERIAL_MAX_COLORS][2]; // color start, color end of scanline + u32 _unused_pack_1[2]; + +#if BURNING_MATERIAL_MAX_COLORS > 0 + sVec4 c[BURNING_MATERIAL_MAX_COLORS][2]; // color start, color end of scanline #endif +#if BURNING_MATERIAL_MAX_TEXTURES > 0 sVec2 t[BURNING_MATERIAL_MAX_TEXTURES][2]; // texture start, texture end of scanline - sVec3 l[BURNING_MATERIAL_MAX_TANGENT][2]; // Light Tangent start, end +#endif + +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT > 0 + sVec3Pack_unpack l[BURNING_MATERIAL_MAX_LIGHT_TANGENT][2]; // Light Tangent start, end +#endif }; // passed to pixel Shader @@ -640,51 +806,56 @@ struct sPixelShaderData /* load a color value */ -inline void getTexel_plain2 ( tFixPoint &r, tFixPoint &g, tFixPoint &b, - const sVec4 &v - ) +REALINLINE void getTexel_plain2 ( tFixPoint &r, tFixPoint &g, tFixPoint &b,const sVec4 &v ) { - r = tofix(v.y, FIX_POINT_F32_MUL); - g = tofix(v.z, FIX_POINT_F32_MUL); - b = tofix(v.w, FIX_POINT_F32_MUL); + r = tofix(v.r, FIX_POINT_F32_MUL); + g = tofix(v.g, FIX_POINT_F32_MUL); + b = tofix(v.b, FIX_POINT_F32_MUL); +} + +#if 0 +/* + load a color value +*/ +REALINLINE void getSample_color ( tFixPoint &a, tFixPoint &r, tFixPoint &g, tFixPoint &b, const sVec4 &v ) +{ + a = tofix ( v.a, FIX_POINT_F32_MUL); + r = tofix ( v.r, COLOR_MAX * FIX_POINT_F32_MUL); + g = tofix ( v.g, COLOR_MAX * FIX_POINT_F32_MUL); + b = tofix ( v.b, COLOR_MAX * FIX_POINT_F32_MUL); } /* load a color value */ -inline void getSample_color ( tFixPoint &a, tFixPoint &r, tFixPoint &g, tFixPoint &b, - const sVec4 &v - ) +REALINLINE void getSample_color ( tFixPoint &r, tFixPoint &g, tFixPoint &b,const sVec4 &v ) { - a = tofix(v.x, FIX_POINT_F32_MUL); - r = tofix ( v.y, COLOR_MAX * FIX_POINT_F32_MUL); - g = tofix ( v.z, COLOR_MAX * FIX_POINT_F32_MUL); - b = tofix ( v.w, COLOR_MAX * FIX_POINT_F32_MUL); + r = tofix ( v.r, COLOR_MAX * FIX_POINT_F32_MUL); + g = tofix ( v.g, COLOR_MAX * FIX_POINT_F32_MUL); + b = tofix ( v.b, COLOR_MAX * FIX_POINT_F32_MUL); } +#endif /* - load a color value + load a color value. mulby controls [0;1] or [0;ColorMax] + aka getSample_color */ -inline void getSample_color ( tFixPoint &r, tFixPoint &g, tFixPoint &b,const sVec4 &v ) +REALINLINE void vec4_to_fix(tFixPoint &r, tFixPoint &g, tFixPoint &b,const sVec4 &v, const f32 mulby ) { - r = tofix ( v.y, COLOR_MAX * FIX_POINT_F32_MUL); - g = tofix ( v.z, COLOR_MAX * FIX_POINT_F32_MUL); - b = tofix ( v.w, COLOR_MAX * FIX_POINT_F32_MUL); + r = tofix(v.r, mulby); + g = tofix(v.g, mulby); + b = tofix(v.b, mulby); } -/* - load a color value -*/ -inline void getSample_color ( tFixPoint &r, tFixPoint &g, tFixPoint &b, - const sVec4 &v, const f32 mulby ) +REALINLINE void vec4_to_fix(tFixPoint &a,tFixPoint &r, tFixPoint &g, tFixPoint &b,const sVec4 &v, const f32 mulby) { - r = tofix ( v.y, mulby); - g = tofix ( v.z, mulby); - b = tofix ( v.w, mulby); + a = tofix(v.a, mulby); + r = tofix(v.r, mulby); + g = tofix(v.g, mulby); + b = tofix(v.b, mulby); } - } } diff --git a/source/Irrlicht/SoftwareDriver2_compile_config.h b/source/Irrlicht/SoftwareDriver2_compile_config.h index a4713181..725ba1a9 100644 --- a/source/Irrlicht/SoftwareDriver2_compile_config.h +++ b/source/Irrlicht/SoftwareDriver2_compile_config.h @@ -7,10 +7,28 @@ #include "IrrCompileConfig.h" - // Generic Render Flags for burning's video rasterizer // defined now in irrlicht compile config +#if defined(PATCH_SUPERTUX_8_0_1) + #undef BURNINGVIDEO_RENDERER_BEAUTIFUL + + //#define SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT + #define SOFTWARE_DRIVER_2_SUBTEXEL + //#define SOFTWARE_DRIVER_2_BILINEAR + #define SOFTWARE_DRIVER_2_LIGHTING + #define SOFTWARE_DRIVER_2_USE_VERTEX_COLOR + #define SOFTWARE_DRIVER_2_USE_SEPARATE_SPECULAR_COLOR + #define SOFTWARE_DRIVER_2_32BIT + #define SOFTWARE_DRIVER_2_MIPMAPPING + #define SOFTWARE_DRIVER_2_USE_WBUFFER + #define SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM + #define SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE 256 + #define SOFTWARE_DRIVER_2_SCANLINE_MAG_MIN + #define SOFTWARE_DRIVER_2_CLIPPING + #define SOFTWARE_DRIVER_2_2D_AS_2D +#endif + #ifdef BURNINGVIDEO_RENDERER_BEAUTIFUL #define SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT @@ -18,11 +36,15 @@ #define SOFTWARE_DRIVER_2_BILINEAR #define SOFTWARE_DRIVER_2_LIGHTING #define SOFTWARE_DRIVER_2_USE_VERTEX_COLOR + #define SOFTWARE_DRIVER_2_USE_SEPARATE_SPECULAR_COLOR #define SOFTWARE_DRIVER_2_32BIT #define SOFTWARE_DRIVER_2_MIPMAPPING #define SOFTWARE_DRIVER_2_USE_WBUFFER #define SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM #define SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE 0 + #define SOFTWARE_DRIVER_2_SCANLINE_MAG_MIN + #define SOFTWARE_DRIVER_2_CLIPPING + #define SOFTWARE_DRIVER_2_2D_AS_3D #endif //! Set Flags for Windows Mobile @@ -36,7 +58,10 @@ #define SOFTWARE_DRIVER_2_MIPMAPPING #define SOFTWARE_DRIVER_2_USE_WBUFFER //#define SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM - #define SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE 128 + #define SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE 64 + #define SOFTWARE_DRIVER_2_SCANLINE_MAG_MIN + //#define SOFTWARE_DRIVER_2_CLIPPING + #define SOFTWARE_DRIVER_2_2D_AS_2D #endif #ifdef BURNINGVIDEO_RENDERER_FAST @@ -44,25 +69,34 @@ #define SOFTWARE_DRIVER_2_SUBTEXEL //#define SOFTWARE_DRIVER_2_BILINEAR //#define SOFTWARE_DRIVER_2_LIGHTING - //#define SOFTWARE_DRIVER_2_USE_VERTEX_COLOR - #define SOFTWARE_DRIVER_2_32BIT + #define SOFTWARE_DRIVER_2_USE_VERTEX_COLOR + //#define SOFTWARE_DRIVER_2_32BIT + #define SOFTWARE_DRIVER_2_16BIT #define SOFTWARE_DRIVER_2_MIPMAPPING #define SOFTWARE_DRIVER_2_USE_WBUFFER - #define SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE 0 + #define SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE 256 + #define SOFTWARE_DRIVER_2_SCANLINE_MAG_MIN + #define SOFTWARE_DRIVER_2_CLIPPING + #define SOFTWARE_DRIVER_2_2D_AS_2D #endif #ifdef BURNINGVIDEO_RENDERER_ULTRA_FAST #define BURNINGVIDEO_RENDERER_FAST //#define SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT - #define SOFTWARE_DRIVER_2_SUBTEXEL + //#define SOFTWARE_DRIVER_2_SUBTEXEL //#define SOFTWARE_DRIVER_2_BILINEAR //#define SOFTWARE_DRIVER_2_LIGHTING - //#define SOFTWARE_DRIVER_2_USE_VERTEX_COLOR + #define SOFTWARE_DRIVER_2_USE_VERTEX_COLOR //#define SOFTWARE_DRIVER_2_32BIT - #define SOFTWARE_DRIVER_2_MIPMAPPING - #define SOFTWARE_DRIVER_2_USE_WBUFFER - #define SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE 0 + #define SOFTWARE_DRIVER_2_16BIT + //#define SOFTWARE_DRIVER_2_MIPMAPPING + //#define SOFTWARE_DRIVER_2_USE_WBUFFER + //#define SOFTWARE_DRIVER_2_TEXTURE_TRANSFORM + #define SOFTWARE_DRIVER_2_TEXTURE_MAXSIZE 128 + #define SOFTWARE_DRIVER_2_SCANLINE_MAG_MIN + //#define SOFTWARE_DRIVER_2_CLIPPING + #define SOFTWARE_DRIVER_2_2D_AS_2D #endif // Derivate flags @@ -74,24 +108,24 @@ #define BURNINGSHADER_COLOR_FORMAT ECF_A1R5G5B5 #endif -// mip mapping +// mip mapping - precalculated texture filter #if defined ( SOFTWARE_DRIVER_2_MIPMAPPING ) #if defined( BURNINGVIDEO_RENDERER_BEAUTIFUL ) #define SOFTWARE_DRIVER_2_MIPMAPPING_MAX 16 - #define SOFTWARE_DRIVER_2_MIPMAPPING_LOD_BIAS 0 + #define SOFTWARE_DRIVER_2_MIPMAPPING_MIN_SIZE 1 #elif defined ( BURNINGVIDEO_RENDERER_CE ) #define SOFTWARE_DRIVER_2_MIPMAPPING_MAX 4 - #define SOFTWARE_DRIVER_2_MIPMAPPING_LOD_BIAS 0 + #define SOFTWARE_DRIVER_2_MIPMAPPING_MIN_SIZE 8 #else - #define SOFTWARE_DRIVER_2_MIPMAPPING_MAX 8 - #define SOFTWARE_DRIVER_2_MIPMAPPING_LOD_BIAS 0 + #define SOFTWARE_DRIVER_2_MIPMAPPING_MAX 4 + #define SOFTWARE_DRIVER_2_MIPMAPPING_MIN_SIZE 8 #endif #else #define SOFTWARE_DRIVER_2_MIPMAPPING_MAX 1 - #define SOFTWARE_DRIVER_2_MIPMAPPING_LOD_BIAS 0 + #define SOFTWARE_DRIVER_2_MIPMAPPING_MIN_SIZE 1 #endif -#define SOFTWARE_DRIVER_2_MIPMAPPING_SCALE (16/SOFTWARE_DRIVER_2_MIPMAPPING_MAX) + #ifndef REALINLINE #ifdef _MSC_VER @@ -101,4 +135,155 @@ #endif #endif + +// null check necessary (burningvideo only) +#define reciprocal_zero(x) ((x) != 0.f ? 1.f / (x):0.f) +static inline float reciprocal_zero2(float x) { return x != 0.f ? 1.f / x : 0.f; } +#define reciprocal_one(x) ((x) != 0.f ? 1.f / (x):1.f) + +#define fill_convention_left(x) (s32) ceilf(x) +#define fill_convention_right(x) ((s32) ceilf(x))-1 +#define fill_convention_none(x) (s32) (x) +//#define fill_convention_left(x) 65536 - int(65536.0f - x) +//#define fill_convention_right(x) 65535 - int(65536.0f - x) + + +//Check coordinates are in render target/window space +//#define SOFTWARE_DRIVER_2_DO_CLIPCHECK +#if defined (SOFTWARE_DRIVER_2_DO_CLIPCHECK) && defined(_WIN32) +#define SOFTWARE_DRIVER_2_CLIPCHECK if( xStart < 0 || xStart + dx >= (s32)RenderTarget->getDimension().Width || line.y < 0 || line.y >= (s32) RenderTarget->getDimension().Height ) __debugbreak() +#define SOFTWARE_DRIVER_2_CLIPCHECK_REF if( pShader.xStart < 0 || pShader.xStart + pShader.dx >= (s32)RenderTarget->getDimension().Width || line.y < 0 || line.y >= (s32) RenderTarget->getDimension().Height ) __debugbreak() +#define SOFTWARE_DRIVER_2_CLIPCHECK_WIRE if( aposx < 0 || aposx >= (s32)RenderTarget->getDimension().Width || aposy < 0 || aposy >= (s32) RenderTarget->getDimension().Height ) __debugbreak() + +inline float reciprocal_zero_no(const float x) +{ + if (x*x <= 0.00001f) __debugbreak(); + return 1.f / x; +} +#else +#define SOFTWARE_DRIVER_2_CLIPCHECK +#define SOFTWARE_DRIVER_2_CLIPCHECK_REF +#define SOFTWARE_DRIVER_2_CLIPCHECK_WIRE + +#define reciprocal_zero_no(x) 1.f/x #endif + +//!scanline renderer emulate line +enum edge_test_flag +{ + edge_test_pass = 1, //! not wireframe + edge_test_left = 0, + edge_test_first_line = 2, + edge_test_point = 4 +}; +//if any edge test flag is set result=1 else 0. ( pass height test for degenerate triangle ) +#define reciprocal_edge(x) ((x) != 0.f ? 1.f / (x):(~EdgeTestPass)&1) + +//! normalize from fixed point Color Max to fixed point [0;1] +#define fix_color_norm(x) x = (x+1) >> COLOR_MAX_LOG2 + +//! from 1 bit to 5 bit +#ifdef SOFTWARE_DRIVER_2_32BIT + #define fix_alpha_color_max(x) +#else + #define fix_alpha_color_max(x) if (x) x = (x << COLOR_MAX_LOG2) - 1 +#endif + +// Check windows +#if _WIN32 || _WIN64 +#if _WIN64 + #define ENV64BIT +#else + #define ENV32BIT +#endif +#endif + +// Check GCC +#if __GNUC__ +#if __x86_64__ || __ppc64__ + #define ENV64BIT +#else + #define ENV32BIT +#endif +#endif + +#if defined(ENV64BIT) && defined(BURNINGVIDEO_RENDERER_BEAUTIFUL) + typedef float ipoltype; +#else + typedef float ipoltype; +#endif + +#define ipol_lower_equal_0(n) ((n) <= (ipoltype)0.0) +#define ipol_greater_0(n) ((n) > (ipoltype)0.0) + +#if (_MSC_VER > 1700 ) + #define burning_restrict __restrict +#else + #define burning_restrict +#endif + +/* + if (condition) state |= mask; else state &= ~mask; +*/ +static inline void burning_setbit(size_t &state, int condition, size_t mask) +{ + if (condition) state |= mask; + else state &= ~mask; +} + +/* + if (condition) state |= m; else state &= ~m; +*/ +REALINLINE void burning_setbit32(unsigned int &state, int condition, const unsigned int mask) +{ + // 0, or any positive to mask + //s32 conmask = -condition >> 31; + state ^= ((-condition >> 31) ^ state) & mask; +} + +#define burning_stringify(s) #s +#define burning_create_indirect(s) create_##s +#define burning_create(s) burning_create_indirect(s) + + +#if defined(PATCH_SUPERTUX_8_0_1) +#define getData lock +#define snprintf_irr sprintf_s + +#ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR +#ifdef SOFTWARE_DRIVER_2_USE_SEPARATE_SPECULAR_COLOR +#define BURNING_MATERIAL_MAX_COLORS 2 +#else +#define BURNING_MATERIAL_MAX_COLORS 1 +#endif +#else +#define BURNING_MATERIAL_MAX_COLORS 0 +#endif + +#ifndef _IRR_OVERRIDE_ +#define _IRR_OVERRIDE_ /**/ +#endif + +#define fix_to_color fix_to_sample +#define fix4_to_color fix4_to_sample +#define vec4_to_fix getSample_color +#define SOFTWARE_DRIVER_2_MIPMAPPING_LOD_BIAS 0 + +namespace irr { + + REALINLINE void memcpy32_small(void * dest, const void *source, size_t bytesize) + { + size_t c = bytesize >> 2; + + do + { + ((unsigned int *)dest)[c - 1] = ((unsigned int *)source)[c - 1]; + } while (--c); + + } + +} // namespace irr +#endif // #if defined(PATCH_SUPERTUX_8_0_1) + + +#endif // __S_VIDEO_2_SOFTWARE_COMPILE_CONFIG_H_INCLUDED__ diff --git a/source/Irrlicht/SoftwareDriver2_helper.h b/source/Irrlicht/SoftwareDriver2_helper.h index 01e2f4f7..59a91b85 100644 --- a/source/Irrlicht/SoftwareDriver2_helper.h +++ b/source/Irrlicht/SoftwareDriver2_helper.h @@ -24,40 +24,42 @@ namespace irr #ifdef SOFTWARE_DRIVER_2_32BIT typedef u32 tVideoSample; + typedef u32 tStencilSample; #define MASK_A 0xFF000000 #define MASK_R 0x00FF0000 #define MASK_G 0x0000FF00 #define MASK_B 0x000000FF - #define SHIFT_A 24 - #define SHIFT_R 16 - #define SHIFT_G 8 - #define SHIFT_B 0 + #define SHIFT_A (unsigned)24 + #define SHIFT_R (unsigned)16 + #define SHIFT_G (unsigned)8 + #define SHIFT_B (unsigned)0 #define COLOR_MAX 0xFF #define COLOR_MAX_LOG2 8 #define COLOR_BRIGHT_WHITE 0xFFFFFFFF - #define VIDEO_SAMPLE_GRANULARITY 2 + #define VIDEO_SAMPLE_GRANULARITY (unsigned)2 #else typedef u16 tVideoSample; + typedef u8 tStencilSample; #define MASK_A 0x8000 #define MASK_R 0x7C00 #define MASK_G 0x03E0 #define MASK_B 0x001F - #define SHIFT_A 15 - #define SHIFT_R 10 - #define SHIFT_G 5 - #define SHIFT_B 0 + #define SHIFT_A (unsigned)15 + #define SHIFT_R (unsigned)10 + #define SHIFT_G (unsigned)5 + #define SHIFT_B (unsigned)0 #define COLOR_MAX 0x1F #define COLOR_MAX_LOG2 5 #define COLOR_BRIGHT_WHITE 0xFFFF - #define VIDEO_SAMPLE_GRANULARITY 1 + #define VIDEO_SAMPLE_GRANULARITY (unsigned)1 #endif @@ -65,14 +67,16 @@ namespace irr // ----------------------- Generic ---------------------------------- +//! align_next - align to next upper 2^n +#define align_next(num,to) (((num) + (to-1)) & (~(to-1))) -//! a more useful memset for pixel +//! a more useful memset for pixel. dest must be aligned at least to 4 byte // (standard memset only works with 8-bit values) -inline void memset32(void * dest, const u32 value, u32 bytesize) +inline void memset32(void * dest, const u32 value, size_t bytesize) { u32 * d = (u32*) dest; - u32 i; + size_t i; // loops unrolled to reduce the number of increments by factor ~8. i = bytesize >> (2 + 3); @@ -101,13 +105,13 @@ inline void memset32(void * dest, const u32 value, u32 bytesize) } } -//! a more useful memset for pixel +//! a more useful memset for pixel. dest must be aligned at least to 2 byte // (standard memset only works with 8-bit values) -inline void memset16(void * dest, const u16 value, u32 bytesize) +inline void memset16(void * dest, const u16 value, size_t bytesize) { u16 * d = (u16*) dest; - u32 i; + size_t i; // loops unrolled to reduce the number of increments by factor ~8. i = bytesize >> (1 + 3); @@ -136,35 +140,52 @@ inline void memset16(void * dest, const u16 value, u32 bytesize) } } -/* - use biased loop counter - --> 0 byte copy is forbidden -*/ -REALINLINE void memcpy32_small ( void * dest, const void *source, u32 bytesize ) -{ - u32 c = bytesize >> 2; - do - { - ((u32*) dest ) [ c-1 ] = ((u32*) source) [ c-1 ]; - } while ( --c ); +// byte-align structures +#include "irrpack.h" -} +//IEEE Standard for Floating - Point Arithmetic(IEEE 754) +typedef union { + float f; + unsigned int u; + struct { unsigned int frac:23; unsigned exp:8; unsigned int sign:1; } fields; + struct { unsigned int frac_exp:31; } abs; +} ieee754 PACK_STRUCT; +// Default alignment +#include "irrunpack.h" +// 0.5f as integer +#define ieee754_zero_dot_5 0x3f000000 +#define ieee754_one 0x3f800000 +#define ieee754_two 0x40000000 -// integer log2 of a float ieee 754. TODO: non ieee floating point +#if 0 +// integer log2 of a float ieee 754. [not used anymore] static inline s32 s32_log2_f32( f32 f) { - u32 x = IR ( f ); - return ((x & 0x7F800000) >> 23) - 127; + //u32 x = IR ( f ); return ((x & 0x7F800000) >> 23) - 127; + ieee754 _log2; + _log2.f = f; + return _log2.fields.exp ? _log2.fields.exp - 127 : 10000000; /*denormal very high number*/ } +#endif -static inline s32 s32_log2_s32(u32 x) +// integer log2 of an integer. returning 0 as denormal +static inline s32 s32_log2_s32(u32 in) { - return s32_log2_f32( (f32) x); + s32 ret = 0; + while (in > 1) + { + in >>= 1; + ret++; + } + return ret; + //return s32_log2_f32( (f32) x); + //ieee754 _log2;_log2.f = (f32) in; return _log2.fields.exp - 127; } +#if 0 static inline s32 s32_abs(s32 x) { s32 b = x >> 31; @@ -177,13 +198,14 @@ REALINLINE u32 if_mask_a_else_b ( const u32 mask, const u32 a, const u32 b ) { return ( mask & ( a ^ b ) ) ^ b; } +#endif // ------------------ Video--------------------------------------- /*! Pixel = dest * ( 1 - alpha ) + source * alpha alpha [0;256] */ -REALINLINE u32 PixelBlend32 ( const u32 c2, const u32 c1, u32 alpha ) +REALINLINE u32 PixelBlend32 ( const u32 c2, const u32 c1, const u32 alpha ) { u32 srcRB = c1 & 0x00FF00FF; u32 srcXG = c1 & 0x0000FF00; @@ -213,7 +235,7 @@ REALINLINE u32 PixelBlend32 ( const u32 c2, const u32 c1, u32 alpha ) Pixel = dest * ( 1 - alpha ) + source * alpha alpha [0;32] */ -inline u16 PixelBlend16 ( const u16 c2, const u32 c1, const u16 alpha ) +inline u16 PixelBlend16 ( const u16 c2, const u16 c1, const u16 alpha ) { const u16 srcRB = c1 & 0x7C1F; const u16 srcXG = c1 & 0x03E0; @@ -386,97 +408,45 @@ inline u32 PixelBlend32 ( const u32 c2, const u32 c1 ) return (c1 & 0xFF000000) | rb | xg; } -/*! - Pixel => - color = sourceAlpha > 0 ? source, else dest - alpha = max(destAlpha, sourceAlpha) -*/ -inline u16 PixelCombine16 ( const u16 c2, const u16 c1 ) -{ - if ( video::getAlpha(c1) > 0 ) - return c1; - else - return c2; -} - -/*! - Pixel => - color = dest * ( 1 - SourceAlpha ) + source * SourceAlpha, - alpha = destAlpha * ( 1 - SourceAlpha ) + sourceAlpha - - where "1" means "full scale" (255) -*/ -inline u32 PixelCombine32 ( const u32 c2, const u32 c1 ) -{ - // alpha test - u32 alpha = c1 & 0xFF000000; - - if ( 0 == alpha ) - return c2; - if ( 0xFF000000 == alpha ) - { - return c1; - } - - alpha >>= 24; - - // add highbit alpha, if ( alpha > 127 ) alpha += 1; - // stretches [0;255] to [0;256] to avoid division by 255. use division 256 == shr 8 - alpha += ( alpha >> 7); - - u32 srcRB = c1 & 0x00FF00FF; - u32 srcXG = c1 & 0x0000FF00; - - u32 dstRB = c2 & 0x00FF00FF; - u32 dstXG = c2 & 0x0000FF00; - - - u32 rb = srcRB - dstRB; - u32 xg = srcXG - dstXG; - - rb *= alpha; - xg *= alpha; - rb >>= 8; - xg >>= 8; - - rb += dstRB; - xg += dstXG; - - rb &= 0x00FF00FF; - xg &= 0x0000FF00; - - u32 sa = c1 >> 24; - u32 da = c2 >> 24; - u32 blendAlpha_fix8 = (sa*256 + da*(256-alpha))>>8; - return blendAlpha_fix8 << 24 | rb | xg; -} - // ------------------ Fix Point ---------------------------------- +#if defined(ENV64BIT) typedef s32 tFixPoint; typedef u32 tFixPointu; +#else +typedef s32 tFixPoint; +typedef u32 tFixPointu; +#endif -// Fix Point 12 +// Fix Point 12 (overflow on s32) #if 0 #define FIX_POINT_PRE 12 #define FIX_POINT_FRACT_MASK 0xFFF - #define FIX_POINT_SIGNED_MASK 0xFFFFF000 #define FIX_POINT_UNSIGNED_MASK 0x7FFFF000 #define FIX_POINT_ONE 0x1000 #define FIX_POINT_ZERO_DOT_FIVE 0x0800 #define FIX_POINT_F32_MUL 4096.f #endif +// Fix Point 11 (overflow on s32) +#if 0 + #define FIX_POINT_PRE 11 + #define FIX_POINT_FRACT_MASK 0x7FF + #define FIX_POINT_UNSIGNED_MASK 0xFFFFF800 + #define FIX_POINT_ONE 0x800 + #define FIX_POINT_ZERO_DOT_FIVE 0x400 + #define FIX_POINT_F32_MUL 2048.f +#endif + // Fix Point 10 #if 1 #define FIX_POINT_PRE 10 - #define FIX_POINT_FRACT_MASK 0x3FF - #define FIX_POINT_SIGNED_MASK 0xFFFFFC00 + #define FIX_POINT_FRACT_MASK 0x000003FF #define FIX_POINT_UNSIGNED_MASK 0x7FFFFE00 - #define FIX_POINT_ONE 0x400 - #define FIX_POINT_ZERO_DOT_FIVE 0x200 + #define FIX_POINT_ONE 0x00000400 + #define FIX_POINT_ZERO_DOT_FIVE 0x00000200 #define FIX_POINT_F32_MUL 1024.f #endif @@ -484,7 +454,6 @@ typedef u32 tFixPointu; #if 0 #define FIX_POINT_PRE 9 #define FIX_POINT_FRACT_MASK 0x1FF - #define FIX_POINT_SIGNED_MASK 0xFFFFFE00 #define FIX_POINT_UNSIGNED_MASK 0x7FFFFE00 #define FIX_POINT_ONE 0x200 #define FIX_POINT_ZERO_DOT_FIVE 0x100 @@ -495,7 +464,6 @@ typedef u32 tFixPointu; #if 0 #define FIX_POINT_PRE 7 #define FIX_POINT_FRACT_MASK 0x7F - #define FIX_POINT_SIGNED_MASK 0xFFFFFF80 #define FIX_POINT_UNSIGNED_MASK 0x7FFFFF80 #define FIX_POINT_ONE 0x80 #define FIX_POINT_ZERO_DOT_FIVE 0x40 @@ -503,7 +471,20 @@ typedef u32 tFixPointu; #endif #define FIXPOINT_COLOR_MAX ( COLOR_MAX << FIX_POINT_PRE ) -#define FIX_POINT_HALF_COLOR ( (tFixPoint) ( ((f32) COLOR_MAX / 2.f * FIX_POINT_F32_MUL ) ) ) + +#if FIX_POINT_PRE == 10 && COLOR_MAX == 255 + #define FIX_POINT_HALF_COLOR 0x1FE00 + #define FIX_POINT_COLOR_ERROR 4 +#elif FIX_POINT_PRE == 12 && COLOR_MAX == 255 + #define FIX_POINT_HALF_COLOR 0x7F800 + #define FIX_POINT_COLOR_ERROR 16 +#elif FIX_POINT_PRE == 10 && COLOR_MAX == 31 + #define FIX_POINT_HALF_COLOR 0x3E00 + #define FIX_POINT_COLOR_ERROR 32 +#else + #define FIX_POINT_HALF_COLOR ( (tFixPoint) ( ((f32) COLOR_MAX / 2.f * FIX_POINT_F32_MUL ) ) ) + #define FIX_POINT_COLOR_ERROR (1<<(FIX_POINT_PRE-COLOR_MAX_LOG2)) +#endif /* @@ -521,12 +502,13 @@ inline tFixPointu u32_to_fixPoint (const u32 x) inline u32 fixPointu_to_u32 (const tFixPointu x) { - return x >> FIX_POINT_PRE; + return (u32)(x >> FIX_POINT_PRE); } // 1/x * FIX_POINT #define fix_inverse32(x) (FIX_POINT_F32_MUL / (x)) +#define fix_inverse32_color(x) ((FIX_POINT_F32_MUL*COLOR_MAX) / (x)) /* @@ -535,38 +517,50 @@ inline u32 fixPointu_to_u32 (const tFixPointu x) hints: compileflag /QIfist for msvc7. msvc 8.0 has smth different others should use their favourite assembler.. */ +#if 0 static inline int f_round2(f32 f) { f += (3<<22); return IR(f) - 0x4b400000; } +#endif /* convert f32 to Fix Point. multiply is needed anyway, so scale mulby */ +/* REALINLINE tFixPoint tofix0 (const f32 x, const f32 mulby = FIX_POINT_F32_MUL ) { return (tFixPoint) (x * mulby); } +*/ #define tofix(x,y) (tFixPoint)(x * y) + /* Fix Point , Fix Point Multiply */ +/* REALINLINE tFixPointu imulFixu(const tFixPointu x, const tFixPointu y) { return (x * y) >> (tFixPointu) FIX_POINT_PRE; } +*/ +#define imulFixu(x,y) (((x) * (y)) >> (tFixPointu) FIX_POINT_PRE) + /* Fix Point , Fix Point Multiply */ REALINLINE tFixPoint imulFix(const tFixPoint x, const tFixPoint y) { - return ( x * y) >> ( FIX_POINT_PRE ); + return (x * y) >> FIX_POINT_PRE; } +#define imulFix_simple(x,y) ((x*y)>>FIX_POINT_PRE) + +#if 0 /* Fix Point , Fix Point Multiply x * y * 2 */ @@ -574,14 +568,18 @@ REALINLINE tFixPoint imulFix2(const tFixPoint x, const tFixPoint y) { return ( x * y) >> ( FIX_POINT_PRE -1 ); } - +#endif /* - Multiply x * y * 1 + Multiply x * y * 1 FIXPOINT_COLOR_MAX */ REALINLINE tFixPoint imulFix_tex1(const tFixPoint x, const tFixPoint y) { - return ( ( (tFixPointu) x >> 2 ) * ( (tFixPointu) y >> 2 ) ) >> (tFixPointu) ( FIX_POINT_PRE + 4 ); +#ifdef SOFTWARE_DRIVER_2_32BIT + return (((tFixPointu)x >> 2)*(((tFixPointu)y + FIX_POINT_ONE) >> 2)) >> (tFixPointu) (FIX_POINT_PRE + 4); +#else + return (x * (y+ FIX_POINT_ONE)) >> (FIX_POINT_PRE + 5); +#endif } /* @@ -593,26 +591,42 @@ REALINLINE tFixPoint imulFix_tex2(const tFixPoint x, const tFixPoint y) } /* - Multiply x * y * 4 + Multiply x * y * 4 clamp */ + REALINLINE tFixPoint imulFix_tex4(const tFixPoint x, const tFixPoint y) { #ifdef SOFTWARE_DRIVER_2_32BIT - return ( ( (tFixPointu) x >> 2 ) * ( (tFixPointu) y >> 2 ) ) >> (tFixPointu) ( FIX_POINT_PRE + 2 ); + register tFixPoint a = (((tFixPointu)x >> 2)*(((tFixPointu)y + FIX_POINT_ONE) >> 2)) >> (tFixPointu)(FIX_POINT_PRE + 2); #else - return ( x * y) >> ( FIX_POINT_PRE + ( VIDEO_SAMPLE_GRANULARITY * 3 ) ); + register tFixPoint a = (x * (y + FIX_POINT_ONE)) >> (FIX_POINT_PRE + 3); #endif + register tFixPoint mask = (a - FIXPOINT_COLOR_MAX) >> 31; + return (a & mask) | (FIXPOINT_COLOR_MAX & ~mask); } + +#if 0 +#define imulFix_tex1(x,y) ((((tFixPointu)x >> 2) * ((tFixPointu)y >> 2)) >> (tFixPointu)(FIX_POINT_PRE + 4)) +#define imulFix_tex2(x,y) ((((tFixPointu)x >> 2) * ((tFixPointu)y >> 2)) >> (tFixPointu)(FIX_POINT_PRE + 3)) + +#ifdef SOFTWARE_DRIVER_2_32BIT +#define imulFix_tex4(x,y) ( ( (tFixPointu) x >> 2 ) * ( (tFixPointu) y >> 2 ) ) >> (tFixPointu) ( FIX_POINT_PRE + 2 ) +#else +#define imulFix_tex4(x,y) ( x * y) >> ( FIX_POINT_PRE + ( VIDEO_SAMPLE_GRANULARITY * 3 ) ) +#endif +#endif + /*! - clamp FixPoint to maxcolor in FixPoint, min(a,31) + clamp FixPoint to maxcolor in FixPoint, min(a,COLOR_MAX) */ REALINLINE tFixPoint clampfix_maxcolor ( const tFixPoint a) { - tFixPoint c = (a - FIXPOINT_COLOR_MAX) >> 31; + register tFixPoint c = (a - FIXPOINT_COLOR_MAX) >> 31; return (a & c) | ( FIXPOINT_COLOR_MAX & ~c); } + /*! clamp FixPoint to 0 in FixPoint, max(a,0) */ @@ -630,22 +644,24 @@ REALINLINE tFixPoint saturateFix ( const tFixPoint a) // rount fixpoint to int inline s32 roundFix ( const tFixPoint x ) { - return ( x + FIX_POINT_ZERO_DOT_FIVE ) >> FIX_POINT_PRE; + return (s32)(( x + FIX_POINT_ZERO_DOT_FIVE ) >> FIX_POINT_PRE); } // x in [0;1[ +#if 0 inline s32 f32_to_23Bits(const f32 x) { f32 y = x + 1.f; return IR(y) & 0x7FFFFF; // last 23 bits } +#endif /*! - return VideoSample from fixpoint + fixpoint in [0..Fixpoint_color] to VideoSample xrgb */ -REALINLINE tVideoSample fix_to_color ( const tFixPoint r, const tFixPoint g, const tFixPoint b ) +REALINLINE tVideoSample fix_to_sample ( const tFixPoint r, const tFixPoint g, const tFixPoint b ) { return ( FIXPOINT_COLOR_MAX & FIXPOINT_COLOR_MAX) << ( SHIFT_A - FIX_POINT_PRE ) | ( r & FIXPOINT_COLOR_MAX) << ( SHIFT_R - FIX_POINT_PRE ) | @@ -655,9 +671,11 @@ REALINLINE tVideoSample fix_to_color ( const tFixPoint r, const tFixPoint g, con /*! - return VideoSample from fixpoint + fixpoint to VideoSample argb + a in [0;1] + rgb in [0;255] colormax */ -REALINLINE tVideoSample fix4_to_color ( const tFixPoint a, const tFixPoint r, const tFixPoint g, const tFixPoint b ) +REALINLINE tVideoSample fix4_to_sample ( const tFixPoint a, const tFixPoint r, const tFixPoint g, const tFixPoint b ) { return ( a & (FIX_POINT_FRACT_MASK - 1 )) << ( SHIFT_A - 1 ) | ( r & FIXPOINT_COLOR_MAX) << ( SHIFT_R - FIX_POINT_PRE ) | @@ -666,7 +684,7 @@ REALINLINE tVideoSample fix4_to_color ( const tFixPoint a, const tFixPoint r, co } /*! - return fixpoint from VideoSample granularity COLOR_MAX + return fixpoint from VideoSample granularity FIXPOINT_COLOR_MAX */ inline void color_to_fix ( tFixPoint &r, tFixPoint &g, tFixPoint &b, const tVideoSample t00 ) { @@ -676,7 +694,7 @@ inline void color_to_fix ( tFixPoint &r, tFixPoint &g, tFixPoint &b, const tVide } /*! - return fixpoint from VideoSample granularity COLOR_MAX + return fixpoint from VideoSample granularity FIXPOINT_COLOR_MAX */ inline void color_to_fix ( tFixPoint &a, tFixPoint &r, tFixPoint &g, tFixPoint &b, const tVideoSample t00 ) { @@ -694,6 +712,11 @@ inline void color_to_fix1 ( tFixPoint &r, tFixPoint &g, tFixPoint &b, const tVid (tFixPointu&) r = (t00 & MASK_R) >> ( SHIFT_R + COLOR_MAX_LOG2 - FIX_POINT_PRE ); (tFixPointu&) g = (t00 & MASK_G) >> ( SHIFT_G + COLOR_MAX_LOG2 - FIX_POINT_PRE ); (tFixPointu&) b = (t00 & MASK_B) << ( FIX_POINT_PRE - COLOR_MAX_LOG2 ); + + //0..255 -> 0..256 | c += c >= 0.5 ? 1 : 0 + r += (r & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; + g += (g & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; + b += (b & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; } /*! @@ -705,11 +728,47 @@ inline void color_to_fix1 ( tFixPoint &a, tFixPoint &r, tFixPoint &g, tFixPoint (tFixPointu&) r = (t00 & MASK_R) >> ( SHIFT_R + COLOR_MAX_LOG2 - FIX_POINT_PRE ); (tFixPointu&) g = (t00 & MASK_G) >> ( SHIFT_G + COLOR_MAX_LOG2 - FIX_POINT_PRE ); (tFixPointu&) b = (t00 & MASK_B) << ( FIX_POINT_PRE - COLOR_MAX_LOG2 ); + + //0..255 -> 0..256 | c += c >= 0.5 ? 1 : 0 + a += (a & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; + r += (r & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; + g += (g & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; + b += (b & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; + +} + +/*! + return fixpoint from VideoSample granularity FIXPOINT_COLOR_MAX +*/ +inline void color_to_fix(tFixPoint c[4], const tVideoSample t00) +{ + c[0] = (t00 & MASK_A) >> (SHIFT_A - FIX_POINT_PRE); + c[1] = (t00 & MASK_R) >> (SHIFT_R - FIX_POINT_PRE); + c[2] = (t00 & MASK_G) << (FIX_POINT_PRE - SHIFT_G); + c[3] = (t00 & MASK_B) << (FIX_POINT_PRE - SHIFT_B); +} + +/*! + return fixpoint from VideoSample granularity 0..FIX_POINT_ONE +*/ +inline void color_to_fix1(tFixPoint c[4], const tVideoSample t00) +{ + c[0] = (t00 & MASK_A) >> (SHIFT_A + COLOR_MAX_LOG2 - FIX_POINT_PRE); + c[1] = (t00 & MASK_R) >> (SHIFT_R + COLOR_MAX_LOG2 - FIX_POINT_PRE); + c[2] = (t00 & MASK_G) >> (SHIFT_G + COLOR_MAX_LOG2 - FIX_POINT_PRE); + c[3] = (t00 & MASK_B) << (FIX_POINT_PRE - COLOR_MAX_LOG2); + + //0..255 -> 0..256 | c += c >= 0.5 ? 1 : 0 + c[0] += (c[0] & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; + c[1] += (c[1] & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; + c[2] += (c[2] & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; + c[3] += (c[3] & FIX_POINT_ZERO_DOT_FIVE) ? FIX_POINT_COLOR_ERROR : 0; + } -// ----- FP24 ---- floating point z-buffer +//! ----- FP24 1.23 fix point z-buffer #if 1 typedef f32 fp24; @@ -751,22 +810,23 @@ struct fp24 struct sInternalTexture { - u32 textureXMask; - u32 textureYMask; + //power-of-two + void* data; //tVideoSample* Texture->lock(miplevel) + size_t textureXMask; + size_t textureYMask; - u32 pitchlog2; - void *data; + size_t pitchlog2; video::CSoftwareTexture2 *Texture; - s32 lodLevel; + s32 lodFactor; // magnify/minify }; // get video sample plain -inline tVideoSample getTexel_plain ( const sInternalTexture * t, const tFixPointu tx, const tFixPointu ty ) +static inline tVideoSample getTexel_plain ( const sInternalTexture* t, const tFixPointu tx, const tFixPointu ty ) { - u32 ofs; + register size_t ofs; ofs = ( ( ty & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; ofs |= ( tx & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); @@ -777,16 +837,16 @@ inline tVideoSample getTexel_plain ( const sInternalTexture * t, const tFixPoint // get video sample to fix inline void getTexel_fix ( tFixPoint &r, tFixPoint &g, tFixPoint &b, - const sInternalTexture * t, const tFixPointu tx, const tFixPointu ty + const sInternalTexture* t, const tFixPointu tx, const tFixPointu ty ) { - u32 ofs; + register size_t ofs; - ofs = ( ( ty & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; - ofs |= ( tx & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); + ofs = ( ((ty + FIX_POINT_ZERO_DOT_FIVE) & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; + ofs |= ((tx + FIX_POINT_ZERO_DOT_FIVE) & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); // texel - tVideoSample t00; + register tVideoSample t00; t00 = *((tVideoSample*)( (u8*) t->data + ofs )); r = (t00 & MASK_R) >> ( SHIFT_R - FIX_POINT_PRE); @@ -795,14 +855,36 @@ inline void getTexel_fix ( tFixPoint &r, tFixPoint &g, tFixPoint &b, } +// get video sample to fixpoint colormax +inline void getTexel_fix(tFixPoint &a, tFixPoint &r, tFixPoint &g, tFixPoint &b, + const sInternalTexture* t, const tFixPointu tx, const tFixPointu ty +) +{ + register size_t ofs; + + ofs = (((ty+ FIX_POINT_ZERO_DOT_FIVE) & t->textureYMask) >> FIX_POINT_PRE) << t->pitchlog2; + ofs |= ((tx+ FIX_POINT_ZERO_DOT_FIVE) & t->textureXMask) >> (FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); + + // texel + register tVideoSample t00; + t00 = *((tVideoSample*)((u8*)t->data + ofs)); + + a = (t00 & MASK_A) >> (SHIFT_A - FIX_POINT_PRE); + r = (t00 & MASK_R) >> (SHIFT_R - FIX_POINT_PRE); + g = (t00 & MASK_G) << (FIX_POINT_PRE - SHIFT_G); + b = (t00 & MASK_B) << (FIX_POINT_PRE - SHIFT_B); + +} + +#if 0 // get video sample to fixpoint -REALINLINE void getTexel_fix ( tFixPoint &a, +static REALINLINE void getTexel_fix ( tFixPoint &a, const sInternalTexture * t, const tFixPointu tx, const tFixPointu ty) { - u32 ofs; + size_t ofs; - ofs = ( ( ty & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; - ofs |= ( tx & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); + ofs = ( ((ty + FIX_POINT_ZERO_DOT_FIVE) & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; + ofs |= ((tx + FIX_POINT_ZERO_DOT_FIVE) & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); // texel tVideoSample t00; @@ -810,253 +892,289 @@ REALINLINE void getTexel_fix ( tFixPoint &a, a = (t00 & MASK_A) >> ( SHIFT_A - FIX_POINT_PRE); } - - -inline void getSample_texture_dither ( tFixPoint &r, tFixPoint &g, tFixPoint &b, - const sInternalTexture * t, const tFixPointu tx, const tFixPointu ty, - const u32 x, const u32 y - ) -{ - static const tFixPointu dithermask[] = - { - 0x00,0x80,0x20,0xa0, - 0xc0,0x40,0xe0,0x60, - 0x30,0xb0,0x10,0x90, - 0xf0,0x70,0xd0,0x50 - }; - - const u32 index = (y & 3 ) << 2 | (x & 3); - - const tFixPointu _ntx = (tx + dithermask [ index ] ) & t->textureXMask; - const tFixPointu _nty = (ty + dithermask [ index ] ) & t->textureYMask; - - u32 ofs; - ofs = ( ( _nty ) >> FIX_POINT_PRE ) << t->pitchlog2; - ofs |= ( _ntx ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); - - // texel - const tVideoSample t00 = *((tVideoSample*)( (u8*) t->data + ofs )); - - (tFixPointu &) r = (t00 & MASK_R) >> ( SHIFT_R - FIX_POINT_PRE); - (tFixPointu &) g = (t00 & MASK_G) << ( FIX_POINT_PRE - SHIFT_G ); - (tFixPointu &) b = (t00 & MASK_B) << ( FIX_POINT_PRE - SHIFT_B ); - -} +#endif /* load a sample from internal texture at position tx,ty to fixpoint */ -#ifndef SOFTWARE_DRIVER_2_BILINEAR +#if defined(SOFTWARE_DRIVER_2_BILINEAR) + +#if 0 +// texture2D in fixpoint color range bilinear +static REALINLINE void getSample_texture(tFixPoint &r, tFixPoint &g, tFixPoint &b, + const sInternalTexture* burning_restrict t, const tFixPointu tx, const tFixPointu ty +) +{ +#if 0 + if (t->lodFactor > 0) + { + register size_t ofs; + + ofs = (((ty + FIX_POINT_ZERO_DOT_FIVE) & t->textureYMask) >> FIX_POINT_PRE) << t->pitchlog2; + ofs += ((tx + FIX_POINT_ZERO_DOT_FIVE) & t->textureXMask) >> (FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); + + // texel + tVideoSample t00; + t00 = *((tVideoSample*)((u8*)t->data + ofs)); + + r = (t00 & MASK_R) >> (SHIFT_R - FIX_POINT_PRE); + g = (t00 & MASK_G) << (FIX_POINT_PRE - SHIFT_G); + b = (t00 & MASK_B) << (FIX_POINT_PRE - SHIFT_B); + return; + } +#endif + + tFixPointu r00, g00, b00; + tFixPointu r01, g01, b01; + tFixPointu r10, g10, b10; + tFixPointu r11, g11, b11; + + size_t o0, o1, o2, o3; + register tVideoSample t00; + + //wraps positive (ignoring negative) + o0 = (((ty)& t->textureYMask) >> FIX_POINT_PRE) << t->pitchlog2; + o1 = (((ty + FIX_POINT_ONE) & t->textureYMask) >> FIX_POINT_PRE) << t->pitchlog2; + o2 = ((tx)& t->textureXMask) >> (FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); + o3 = ((tx + FIX_POINT_ONE) & t->textureXMask) >> (FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); + + t00 = *((tVideoSample*)((u8*)t->data + (o0 + o2))); + r00 = (t00 & MASK_R) >> SHIFT_R; + g00 = (t00 & MASK_G) >> SHIFT_G; + b00 = (t00 & MASK_B); + + t00 = *((tVideoSample*)((u8*)t->data + (o0 + o3))); + r10 = (t00 & MASK_R) >> SHIFT_R; + g10 = (t00 & MASK_G) >> SHIFT_G; + b10 = (t00 & MASK_B); + + t00 = *((tVideoSample*)((u8*)t->data + (o1 + o2))); + r01 = (t00 & MASK_R) >> SHIFT_R; + g01 = (t00 & MASK_G) >> SHIFT_G; + b01 = (t00 & MASK_B); + + t00 = *((tVideoSample*)((u8*)t->data + (o1 + o3))); + r11 = (t00 & MASK_R) >> SHIFT_R; + g11 = (t00 & MASK_G) >> SHIFT_G; + b11 = (t00 & MASK_B); + + + register tFixPointu fracx = tx & FIX_POINT_FRACT_MASK; + register tFixPointu fracy = ty & FIX_POINT_FRACT_MASK; + + //w00 w01 w10 w11 + tFixPointu w[4]; + w[0] = imulFixu(FIX_POINT_ONE - fracx, FIX_POINT_ONE - fracy); + w[1] = imulFixu(FIX_POINT_ONE - fracx, fracy); + w[2] = imulFixu(fracx, FIX_POINT_ONE - fracy); + w[3] = imulFixu(fracx, fracy); + + r = (r00 * w[0]) + + (r01 * w[1]) + + (r10 * w[2]) + + (r11 * w[3]); + + g = (g00 * w[0]) + + (g01 * w[1]) + + (g10 * w[2]) + + (g11 * w[3]); + + b = (b00 * w[0]) + + (b01 * w[1]) + + (b10 * w[2]) + + (b11 * w[3]); + +} + +#else + +// texture2D in fixpoint color range bilinear +static REALINLINE void getSample_texture(tFixPoint &r, tFixPoint &g, tFixPoint &b, + const sInternalTexture* burning_restrict tex, const tFixPointu tx, const tFixPointu ty +) +{ +#if 0 + if (tex->lodFactor > 1) + { + //nearest neighbor + register size_t ofs; + ofs = (((ty + FIX_POINT_ZERO_DOT_FIVE) & tex->textureYMask) >> FIX_POINT_PRE) << tex->pitchlog2; + ofs += ((tx + FIX_POINT_ZERO_DOT_FIVE) & tex->textureXMask) >> (FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); + + register tVideoSample t00; + t00 = *((tVideoSample*)((u8*)tex->data + ofs)); + + r = (t00 & MASK_R) >> (SHIFT_R - FIX_POINT_PRE); + g = (t00 & MASK_G) << (FIX_POINT_PRE - SHIFT_G); + b = (t00 & MASK_B) << (FIX_POINT_PRE - SHIFT_B); + return; + } +#endif + //w00 w01 w10 w11 + tFixPointu w[4]; + { + register tFixPointu fracx = tx & FIX_POINT_FRACT_MASK; + register tFixPointu fracy = ty & FIX_POINT_FRACT_MASK; + w[0] = imulFixu(FIX_POINT_ONE - fracx, FIX_POINT_ONE - fracy); + w[1] = imulFixu(fracx, FIX_POINT_ONE - fracy); + w[2] = imulFixu(FIX_POINT_ONE - fracx, fracy); + w[3] = imulFixu(fracx, fracy); + } + + //wraps positive (ignoring negative) + tVideoSample t[4]; + { + register size_t o0, o1, o2, o3; + o0 = (((ty) & tex->textureYMask) >> FIX_POINT_PRE) << tex->pitchlog2; + o1 = (((ty + FIX_POINT_ONE) & tex->textureYMask) >> FIX_POINT_PRE) << tex->pitchlog2; + o2 = ((tx)& tex->textureXMask) >> (unsigned)(FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); + o3 = ((tx + FIX_POINT_ONE) & tex->textureXMask) >> (unsigned)(FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); + + t[0] = *((tVideoSample*)((u8*)tex->data + (o0 + o2))); + t[1] = *((tVideoSample*)((u8*)tex->data + (o0 + o3))); + t[2] = *((tVideoSample*)((u8*)tex->data + (o1 + o2))); + t[3] = *((tVideoSample*)((u8*)tex->data + (o1 + o3))); + } + + r = (((t[0] & MASK_R) >> SHIFT_R) * w[0]) + + (((t[1] & MASK_R) >> SHIFT_R) * w[1]) + + (((t[2] & MASK_R) >> SHIFT_R) * w[2]) + + (((t[3] & MASK_R) >> SHIFT_R) * w[3]); + + g = (((t[0] & MASK_G) >> SHIFT_G) * w[0]) + + (((t[1] & MASK_G) >> SHIFT_G) * w[1]) + + (((t[2] & MASK_G) >> SHIFT_G) * w[2]) + + (((t[3] & MASK_G) >> SHIFT_G) * w[3]); + + b = ((t[0] & MASK_B) * w[0]) + + ((t[1] & MASK_B) * w[1]) + + ((t[2] & MASK_B) * w[2]) + + ((t[3] & MASK_B) * w[3]); +} + +#endif + +// get Sample bilinear +static REALINLINE void getSample_texture(tFixPoint &a, tFixPoint &r, tFixPoint &g, tFixPoint &b, + const sInternalTexture* burning_restrict tex, const tFixPointu tx, const tFixPointu ty +) +{ + + tFixPointu a00, r00, g00, b00; + tFixPointu a01, r01, g01, b01; + tFixPointu a10, r10, g10, b10; + tFixPointu a11, r11, g11, b11; + + size_t o0, o1, o2, o3; + register tVideoSample t00; + + o0 = (((ty)& tex->textureYMask) >> FIX_POINT_PRE) << tex->pitchlog2; + o1 = (((ty + FIX_POINT_ONE) & tex->textureYMask) >> FIX_POINT_PRE) << tex->pitchlog2; + o2 = ((tx)& tex->textureXMask) >> (FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); + o3 = ((tx + FIX_POINT_ONE) & tex->textureXMask) >> (FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); + + t00 = *((tVideoSample*)((u8*)tex->data + (o0 + o2))); + a00 = (t00 & MASK_A) >> SHIFT_A; + r00 = (t00 & MASK_R) >> SHIFT_R; + g00 = (t00 & MASK_G) >> SHIFT_G; + b00 = (t00 & MASK_B); + + t00 = *((tVideoSample*)((u8*)tex->data + (o0 + o3))); + a10 = (t00 & MASK_A) >> SHIFT_A; + r10 = (t00 & MASK_R) >> SHIFT_R; + g10 = (t00 & MASK_G) >> SHIFT_G; + b10 = (t00 & MASK_B); + + t00 = *((tVideoSample*)((u8*)tex->data + (o1 + o2))); + a01 = (t00 & MASK_A) >> SHIFT_A; + r01 = (t00 & MASK_R) >> SHIFT_R; + g01 = (t00 & MASK_G) >> SHIFT_G; + b01 = (t00 & MASK_B); + + t00 = *((tVideoSample*)((u8*)tex->data + (o1 + o3))); + a11 = (t00 & MASK_A) >> SHIFT_A; + r11 = (t00 & MASK_R) >> SHIFT_R; + g11 = (t00 & MASK_G) >> SHIFT_G; + b11 = (t00 & MASK_B); + + const tFixPointu txFract = tx & FIX_POINT_FRACT_MASK; + const tFixPointu txFractInv = FIX_POINT_ONE - txFract; + + const tFixPointu tyFract = ty & FIX_POINT_FRACT_MASK; + const tFixPointu tyFractInv = FIX_POINT_ONE - tyFract; + + const tFixPointu w00 = imulFixu(txFractInv, tyFractInv); + const tFixPointu w10 = imulFixu(txFract, tyFractInv); + const tFixPointu w01 = imulFixu(txFractInv, tyFract); + const tFixPointu w11 = imulFixu(txFract, tyFract); + + a = (a00 * w00) + + (a01 * w01) + + (a10 * w10) + + (a11 * w11); + + fix_alpha_color_max(a); + + r = (r00 * w00) + + (r01 * w01) + + (r10 * w10) + + (r11 * w11); + + g = (g00 * w00) + + (g01 * w01) + + (g10 * w10) + + (g11 * w11); + + b = (b00 * w00) + + (b01 * w01) + + (b10 * w10) + + (b11 * w11); + +} + +#else // SOFTWARE_DRIVER_2_BILINEAR // get Sample linear == getSample_fixpoint -inline void getSample_texture ( tFixPoint &r, tFixPoint &g, tFixPoint &b, - const sInternalTexture * t, const tFixPointu tx, const tFixPointu ty - ) +static REALINLINE void getSample_texture(tFixPoint &r, tFixPoint &g, tFixPoint &b, + const sInternalTexture* burning_restrict t, const tFixPointu tx, const tFixPointu ty +) { - u32 ofs; - - ofs = ( ( ty & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; - ofs |= ( tx & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); + register size_t ofs; + ofs = (((ty + FIX_POINT_ZERO_DOT_FIVE) & t->textureYMask) >> FIX_POINT_PRE) << t->pitchlog2; + ofs += ((tx + FIX_POINT_ZERO_DOT_FIVE) & t->textureXMask) >> (FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); // texel - const tVideoSample t00 = *((tVideoSample*)( (u8*) t->data + ofs )); + const tVideoSample t00 = *((tVideoSample*)((u8*)t->data + ofs)); - (tFixPointu &) r = (t00 & MASK_R) >> ( SHIFT_R - FIX_POINT_PRE); - (tFixPointu &) g = (t00 & MASK_G) << ( FIX_POINT_PRE - SHIFT_G ); - (tFixPointu &) b = (t00 & MASK_B) << ( FIX_POINT_PRE - SHIFT_B ); + (tFixPointu &)r = (t00 & MASK_R) >> (SHIFT_R - FIX_POINT_PRE); + (tFixPointu &)g = (t00 & MASK_G) << (FIX_POINT_PRE - SHIFT_G); + (tFixPointu &)b = (t00 & MASK_B) << (FIX_POINT_PRE - SHIFT_B); } -inline void getSample_texture ( tFixPoint &a, tFixPoint &r, tFixPoint &g, tFixPoint &b, - const sInternalTexture * t, const tFixPointu tx, const tFixPointu ty - ) +static REALINLINE void getSample_texture(tFixPoint &a, tFixPoint &r, tFixPoint &g, tFixPoint &b, + const sInternalTexture* burning_restrict t, const tFixPointu tx, const tFixPointu ty +) { - u32 ofs; - - ofs = ( ( ty & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; - ofs |= ( tx & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); + register size_t ofs; + ofs = (((ty + FIX_POINT_ZERO_DOT_FIVE) & t->textureYMask) >> FIX_POINT_PRE) << t->pitchlog2; + ofs += ((tx + FIX_POINT_ZERO_DOT_FIVE) & t->textureXMask) >> (FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY); // texel - const tVideoSample t00 = *((tVideoSample*)( (u8*) t->data + ofs )); + const tVideoSample t00 = *((tVideoSample*)((u8*)t->data + ofs)); - (tFixPointu &)a = (t00 & MASK_A) >> ( SHIFT_A - FIX_POINT_PRE); - (tFixPointu &)r = (t00 & MASK_R) >> ( SHIFT_R - FIX_POINT_PRE); - (tFixPointu &)g = (t00 & MASK_G) << ( FIX_POINT_PRE - SHIFT_G ); - (tFixPointu &)b = (t00 & MASK_B) << ( FIX_POINT_PRE - SHIFT_B ); + (tFixPointu &)a = (t00 & MASK_A) >> (SHIFT_A - FIX_POINT_PRE); + fix_alpha_color_max(a); + (tFixPointu &)r = (t00 & MASK_R) >> (SHIFT_R - FIX_POINT_PRE); + (tFixPointu &)g = (t00 & MASK_G) << (FIX_POINT_PRE - SHIFT_G); + (tFixPointu &)b = (t00 & MASK_B) << (FIX_POINT_PRE - SHIFT_B); } -#else +#endif // SOFTWARE_DRIVER_2_BILINEAR -// get sample linear -REALINLINE void getSample_linear ( tFixPointu &r, tFixPointu &g, tFixPointu &b, - const sInternalTexture * t, const tFixPointu tx, const tFixPointu ty - ) -{ - u32 ofs; - - ofs = ( ( ty & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; - ofs |= ( tx & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); - - // texel - tVideoSample t00; - t00 = *((tVideoSample*)( (u8*) t->data + ofs )); - - r = (t00 & MASK_R) >> SHIFT_R; - g = (t00 & MASK_G) >> SHIFT_G; - b = (t00 & MASK_B); -} - -// get Sample bilinear -REALINLINE void getSample_texture ( tFixPoint &r, tFixPoint &g, tFixPoint &b, - const sInternalTexture * t, const tFixPointu tx, const tFixPointu ty - ) -{ - - tFixPointu r00,g00,b00; - tFixPointu r01,g01,b01; - tFixPointu r10,g10,b10; - tFixPointu r11,g11,b11; - -#if 0 - getSample_linear ( r00, g00, b00, t, tx,ty ); - getSample_linear ( r10, g10, b10, t, tx + FIX_POINT_ONE,ty ); - getSample_linear ( r01, g01, b01, t, tx,ty + FIX_POINT_ONE ); - getSample_linear ( r11, g11, b11, t, tx + FIX_POINT_ONE,ty + FIX_POINT_ONE ); -#else - u32 o0, o1,o2,o3; - tVideoSample t00; - - o0 = ( ( (ty) & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; - o1 = ( ( (ty+FIX_POINT_ONE) & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; - o2 = ( (tx) & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); - o3 = ( (tx+FIX_POINT_ONE) & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); - - t00 = *((tVideoSample*)( (u8*) t->data + (o0 | o2 ) )); - r00 = (t00 & MASK_R) >> SHIFT_R; - g00 = (t00 & MASK_G) >> SHIFT_G; - b00 = (t00 & MASK_B); - - t00 = *((tVideoSample*)( (u8*) t->data + (o0 | o3 ) )); - r10 = (t00 & MASK_R) >> SHIFT_R; - g10 = (t00 & MASK_G) >> SHIFT_G; - b10 = (t00 & MASK_B); - - t00 = *((tVideoSample*)( (u8*) t->data + (o1 | o2 ) )); - r01 = (t00 & MASK_R) >> SHIFT_R; - g01 = (t00 & MASK_G) >> SHIFT_G; - b01 = (t00 & MASK_B); - - t00 = *((tVideoSample*)( (u8*) t->data + (o1 | o3 ) )); - r11 = (t00 & MASK_R) >> SHIFT_R; - g11 = (t00 & MASK_G) >> SHIFT_G; - b11 = (t00 & MASK_B); - -#endif - - const tFixPointu txFract = tx & FIX_POINT_FRACT_MASK; - const tFixPointu txFractInv = FIX_POINT_ONE - txFract; - - const tFixPointu tyFract = ty & FIX_POINT_FRACT_MASK; - const tFixPointu tyFractInv = FIX_POINT_ONE - tyFract; - - const tFixPointu w00 = imulFixu ( txFractInv, tyFractInv ); - const tFixPointu w10 = imulFixu ( txFract , tyFractInv ); - const tFixPointu w01 = imulFixu ( txFractInv, tyFract ); - const tFixPointu w11 = imulFixu ( txFract , tyFract ); - - r = (r00 * w00 ) + - (r01 * w01 ) + - (r10 * w10 ) + - (r11 * w11 ); - - g = (g00 * w00 ) + - (g01 * w01 ) + - (g10 * w10 ) + - (g11 * w11 ); - - b = (b00 * w00 ) + - (b01 * w01 ) + - (b10 * w10 ) + - (b11 * w11 ); - -} - - -// get sample linear -REALINLINE void getSample_linear ( tFixPointu &a, tFixPointu &r, tFixPointu &g, tFixPointu &b, - const sInternalTexture * t, const tFixPointu tx, const tFixPointu ty - ) -{ - u32 ofs; - - ofs = ( ( ty & t->textureYMask ) >> FIX_POINT_PRE ) << t->pitchlog2; - ofs |= ( tx & t->textureXMask ) >> ( FIX_POINT_PRE - VIDEO_SAMPLE_GRANULARITY ); - - // texel - tVideoSample t00; - t00 = *((tVideoSample*)( (u8*) t->data + ofs )); - - a = (t00 & MASK_A) >> SHIFT_A; - r = (t00 & MASK_R) >> SHIFT_R; - g = (t00 & MASK_G) >> SHIFT_G; - b = (t00 & MASK_B); -} - -// get Sample bilinear -REALINLINE void getSample_texture ( tFixPoint &a, tFixPoint &r, tFixPoint &g, tFixPoint &b, - const sInternalTexture * t, const tFixPointu tx, const tFixPointu ty - ) -{ - - tFixPointu a00, r00,g00,b00; - tFixPointu a01, r01,g01,b01; - tFixPointu a10, r10,g10,b10; - tFixPointu a11, r11,g11,b11; - - getSample_linear ( a00, r00, g00, b00, t, tx,ty ); - getSample_linear ( a10, r10, g10, b10, t, tx + FIX_POINT_ONE,ty ); - getSample_linear ( a01, r01, g01, b01, t, tx,ty + FIX_POINT_ONE ); - getSample_linear ( a11, r11, g11, b11, t, tx + FIX_POINT_ONE,ty + FIX_POINT_ONE ); - - const tFixPointu txFract = tx & FIX_POINT_FRACT_MASK; - const tFixPointu txFractInv = FIX_POINT_ONE - txFract; - - const tFixPointu tyFract = ty & FIX_POINT_FRACT_MASK; - const tFixPointu tyFractInv = FIX_POINT_ONE - tyFract; - - const tFixPointu w00 = imulFixu ( txFractInv, tyFractInv ); - const tFixPointu w10 = imulFixu ( txFract , tyFractInv ); - const tFixPointu w01 = imulFixu ( txFractInv, tyFract ); - const tFixPointu w11 = imulFixu ( txFract , tyFract ); - - a = (a00 * w00 ) + - (a01 * w01 ) + - (a10 * w10 ) + - (a11 * w11 ); - - r = (r00 * w00 ) + - (r01 * w01 ) + - (r10 * w10 ) + - (r11 * w11 ); - - g = (g00 * w00 ) + - (g01 * w01 ) + - (g10 * w10 ) + - (g11 * w11 ); - - b = (b00 * w00 ) + - (b01 * w01 ) + - (b10 * w10 ) + - (b11 * w11 ); - -} - - -#endif - -// some 2D Defines +// 2D Region closed [x0;x1] struct AbsRectangle { s32 x0; @@ -1075,6 +1193,7 @@ inline bool intersect ( AbsRectangle &dest, const AbsRectangle& a, const AbsRect return dest.x0 < dest.x1 && dest.y0 < dest.y1; } +#if 0 // some 1D defines struct sIntervall { @@ -1088,6 +1207,33 @@ inline s32 intervall_intersect_test( const sIntervall& a, const sIntervall& b) return core::s32_min( a.end, b.end ) - core::s32_max( a.start, b.start ); } +#endif + +// strings +static inline void tiny_strncpy(char* to, const char* from, const size_t count) +{ + for (size_t r = 0; r < count && (*to = *from) != '\0'; ++from, ++to, ++r); + *to = '\0'; +} + +#define tiny_strcpy(a, b) tiny_strncpy(a,b,sizeof(a)-1) + + +// tiny_isequal = !strncmp(a,b,sizeof(a)-1) +static inline int tiny_isequal(const char *s1, const char *s2, size_t n) +{ + do { + if (*s1 != *s2++) return 0; + if (*s1++ == 0) + break; + } while (--n != 0); + return 1; +} + +#define tiny_istoken(a, b) tiny_isequal(a,b,sizeof(a)-1) != 0 +//! Size of a static C-style array. +#define array_size(_arr) ((sizeof(_arr)/sizeof(*_arr))) + } // end namespace irr diff --git a/source/Irrlicht/burning_shader_color.cpp b/source/Irrlicht/burning_shader_color.cpp new file mode 100644 index 00000000..3af52abc --- /dev/null +++ b/source/Irrlicht/burning_shader_color.cpp @@ -0,0 +1,95 @@ +// Copyright (C) 2002-2012 Nikolaus Gebhardt / Thomas Alten +// This file is part of the "Irrlicht Engine". +// For conditions of distribution and use, see copyright notice in irrlicht.h + +#include "IrrCompileConfig.h" +#include "IBurningShader.h" + +#ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ + +namespace irr +{ + +namespace video +{ + +#define burning_shader_class burning_shader_color +#define burning_shader_frag "burning_shader_color_fraq.h" +#include "burning_shader_compile_fragment_default.h" + + +/*! +*/ +void burning_shader_class::OnSetMaterial(const SBurningShaderMaterial& material) +{ + switch (material.org.MaterialType) + { + case EMT_TRANSPARENT_ADD_COLOR: + case EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR: + case EMT_PARALLAX_MAP_TRANSPARENT_ADD_COLOR: + //glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); + + case EMT_TRANSPARENT_ALPHA_CHANNEL: + //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + case EMT_TRANSPARENT_ALPHA_CHANNEL_REF: + //? glBlendFunc(GL_ONE,GL_ZERO) or glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + case EMT_TRANSPARENT_REFLECTION_2_LAYER: + + case EMT_TRANSPARENT_VERTEX_ALPHA: + case EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA: + case EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA: + RenderPass_ShaderIsTransparent = 1; + AlphaRef = tofix(material.org.MaterialTypeParam, FIXPOINT_COLOR_MAX); + break; + default: + RenderPass_ShaderIsTransparent = 0; + AlphaRef = 0; + break; + } + + if (0 == RenderPass_ShaderIsTransparent) + { + if (material.org.ZBuffer == ECFN_LESSEQUAL) + { + if (material.depth_write) fragmentShader = &burning_shader_class::fragment_depth_less_equal_depth_write_blend_one_zero; + else fragmentShader = &burning_shader_class::fragment_depth_less_equal_no_depth_write_blend_one_zero; + } + else /*if (material.org.ZBuffer == ECFN_DISABLED)*/ + { + //check triangle on w = 1.f instead.. +#ifdef SOFTWARE_DRIVER_2_BILINEAR + if (material.org.TextureLayer[0].BilinearFilter) fragmentShader = &burning_shader_class::fragment_nodepth_perspective_blend_one_zero; + else +#endif + fragmentShader = &burning_shader_class::fragment_nodepth_noperspective_blend_one_zero; + } + } + else + { + if (material.org.ZBuffer == ECFN_LESSEQUAL) + { + if (material.depth_write) fragmentShader = &burning_shader_class::fragment_depth_less_equal_depth_write_blend_src_alpha_one_minus_src_alpha; + else fragmentShader = &burning_shader_class::fragment_depth_less_equal_no_depth_write_blend_src_alpha_one_minus_src_alpha; + } + else /*if (material.org.ZBuffer == ECFN_DISABLED)*/ + { + //check triangle on w = 1.f instead.. +#ifdef SOFTWARE_DRIVER_2_BILINEAR + if (material.org.TextureLayer[0].BilinearFilter) fragmentShader = &burning_shader_class::fragment_nodepth_perspective_blend_src_alpha_one_minus_src_alpha; + else +#endif + fragmentShader = &burning_shader_class::fragment_nodepth_noperspective_blend_src_alpha_one_minus_src_alpha; + } + } + +} + + + +} // end namespace video +} // end namespace irr + +#endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ + diff --git a/source/Irrlicht/burning_shader_color_fraq.h b/source/Irrlicht/burning_shader_color_fraq.h new file mode 100644 index 00000000..f9efae2d --- /dev/null +++ b/source/Irrlicht/burning_shader_color_fraq.h @@ -0,0 +1,24 @@ +// pixelshader +#ifdef IPOL_C0 + +#ifdef IPOL_A0 +vec4_to_fix(a0, r0, g0, b0, line.c[0][0], inversew); +if (a0 > AlphaRef) +{ + color_to_fix(r1, g1, b1, dst[i]); + + fix_color_norm(a0); + r0 = r1 + imulFix(a0, r0 - r1); + g0 = g1 + imulFix(a0, g0 - g1); + b0 = b1 + imulFix(a0, b0 - b1); + dst[i] = fix_to_sample(r0, g0, b0); +} +#else +vec4_to_fix(r0, g0, b0, line.c[0][0], inversew); +dst[i] = fix_to_sample(r0, g0, b0); +#endif + +#else +dst[i] = PrimitiveColor; +#endif + diff --git a/source/Irrlicht/burning_shader_compile_fragment_default.h b/source/Irrlicht/burning_shader_compile_fragment_default.h new file mode 100644 index 00000000..f28ab70d --- /dev/null +++ b/source/Irrlicht/burning_shader_compile_fragment_default.h @@ -0,0 +1,164 @@ + + +class burning_shader_class : public IBurningShader +{ +public: + + //! constructor + burning_shader_class(CBurningVideoDriver* driver); + + //! draws an indexed triangle list + virtual void drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) _IRR_OVERRIDE_; + virtual bool canWireFrame() { return true; } + + virtual void OnSetMaterial(const SBurningShaderMaterial& material) _IRR_OVERRIDE_; + +private: + + // fragment shader + typedef void (burning_shader_class::*tFragmentShader) (); + void fragment_depth_less_equal_depth_write_blend_one_zero(); + void fragment_depth_less_equal_no_depth_write_blend_one_zero(); + void fragment_nodepth_perspective_blend_one_zero(); + void fragment_nodepth_noperspective_blend_one_zero(); // 2D Gradient + + void fragment_depth_less_equal_depth_write_blend_src_alpha_one_minus_src_alpha(); + void fragment_depth_less_equal_no_depth_write_blend_src_alpha_one_minus_src_alpha(); + void fragment_nodepth_perspective_blend_src_alpha_one_minus_src_alpha(); + void fragment_nodepth_noperspective_blend_src_alpha_one_minus_src_alpha(); + + + tFragmentShader fragmentShader; + +}; + + +//! constructor +burning_shader_class::burning_shader_color(CBurningVideoDriver* driver) + : IBurningShader(driver) +{ +#ifdef _DEBUG + setDebugName(burning_stringify(burning_shader_class) ); +#endif + + fragmentShader = &burning_shader_class::fragment_depth_less_equal_depth_write_blend_one_zero; + +} + + +IBurningShader* burning_create(burning_shader_class)(CBurningVideoDriver* driver) +{ + return new burning_shader_class(driver); +} + + + +// compile flag for this triangle +#include "burning_shader_compile_start.h" +#define SUBTEXEL +#define IPOL_W +#define IPOL_C0 +#define USE_ZBUFFER +#define CMP_W +#include "burning_shader_compile_triangle.h" + +// compile flag for this scanline fragment +#include "burning_shader_compile_start.h" +#define burning_shader_fragment fragment_nodepth_noperspective_blend_one_zero +#define SUBTEXEL +#define IPOL_C0 +#define INVERSE_W_RANGE FIX_POINT_F32_MUL*COLOR_MAX +#include "burning_shader_compile_fragment_start.h" +#include burning_shader_frag +#include "burning_shader_compile_fragment_end.h" + +#include "burning_shader_compile_start.h" +#define burning_shader_fragment fragment_nodepth_perspective_blend_one_zero +#define SUBTEXEL +#define INVERSE_W +#define IPOL_W +#define IPOL_C0 +#define INVERSE_W_RANGE FIX_POINT_F32_MUL*COLOR_MAX +#include "burning_shader_compile_fragment_start.h" +#include burning_shader_frag +#include "burning_shader_compile_fragment_end.h" + +#include "burning_shader_compile_start.h" +#define burning_shader_fragment fragment_depth_less_equal_no_depth_write_blend_one_zero +#define SUBTEXEL +#define INVERSE_W +#define IPOL_W +#define IPOL_C0 +#define USE_ZBUFFER +#define CMP_W +#define INVERSE_W_RANGE FIX_POINT_F32_MUL*COLOR_MAX +#include "burning_shader_compile_fragment_start.h" +#include burning_shader_frag +#include "burning_shader_compile_fragment_end.h" + +#include "burning_shader_compile_start.h" +#define burning_shader_fragment fragment_depth_less_equal_depth_write_blend_one_zero +#define SUBTEXEL +#define INVERSE_W +#define IPOL_W +#define IPOL_C0 +#define USE_ZBUFFER +#define CMP_W +#define WRITE_W +#define INVERSE_W_RANGE FIX_POINT_F32_MUL*COLOR_MAX +#include "burning_shader_compile_fragment_start.h" +#include burning_shader_frag +#include "burning_shader_compile_fragment_end.h" + + +// compile flag for this scanline fragment +#include "burning_shader_compile_start.h" +#define burning_shader_fragment fragment_nodepth_noperspective_blend_src_alpha_one_minus_src_alpha +#define SUBTEXEL +#define IPOL_C0 +#define IPOL_A0 +#define INVERSE_W_RANGE FIX_POINT_F32_MUL*COLOR_MAX +#include "burning_shader_compile_fragment_start.h" +#include burning_shader_frag +#include "burning_shader_compile_fragment_end.h" + +#include "burning_shader_compile_start.h" +#define burning_shader_fragment fragment_nodepth_perspective_blend_src_alpha_one_minus_src_alpha +#define SUBTEXEL +#define INVERSE_W +#define IPOL_W +#define IPOL_C0 +#define IPOL_A0 +#define INVERSE_W_RANGE FIX_POINT_F32_MUL*COLOR_MAX +#include "burning_shader_compile_fragment_start.h" +#include burning_shader_frag +#include "burning_shader_compile_fragment_end.h" + +#include "burning_shader_compile_start.h" +#define burning_shader_fragment fragment_depth_less_equal_no_depth_write_blend_src_alpha_one_minus_src_alpha +#define SUBTEXEL +#define INVERSE_W +#define IPOL_W +#define IPOL_C0 +#define IPOL_A0 +#define USE_ZBUFFER +#define CMP_W +#define INVERSE_W_RANGE FIX_POINT_F32_MUL*COLOR_MAX +#include "burning_shader_compile_fragment_start.h" +#include burning_shader_frag +#include "burning_shader_compile_fragment_end.h" + +#include "burning_shader_compile_start.h" +#define burning_shader_fragment fragment_depth_less_equal_depth_write_blend_src_alpha_one_minus_src_alpha +#define SUBTEXEL +#define INVERSE_W +#define IPOL_W +#define IPOL_C0 +#define IPOL_A0 +#define USE_ZBUFFER +#define CMP_W +#define WRITE_W +#define INVERSE_W_RANGE FIX_POINT_F32_MUL*COLOR_MAX +#include "burning_shader_compile_fragment_start.h" +#include burning_shader_frag +#include "burning_shader_compile_fragment_end.h" diff --git a/source/Irrlicht/burning_shader_compile_fragment_end.h b/source/Irrlicht/burning_shader_compile_fragment_end.h new file mode 100644 index 00000000..8e4719e7 --- /dev/null +++ b/source/Irrlicht/burning_shader_compile_fragment_end.h @@ -0,0 +1,20 @@ + } + +#ifdef IPOL_Z + line.z[0] += slopeZ; +#endif +#ifdef IPOL_W + line.w[0] += slopeW; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0]; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1]; +#endif + } + +} diff --git a/source/Irrlicht/burning_shader_compile_fragment_start.h b/source/Irrlicht/burning_shader_compile_fragment_start.h new file mode 100644 index 00000000..64a84633 --- /dev/null +++ b/source/Irrlicht/burning_shader_compile_fragment_start.h @@ -0,0 +1,119 @@ +#include "burning_shader_compile_verify.h" + +/*! +*/ +void burning_shader_class::burning_shader_fragment() +{ + tVideoSample *dst; + +#ifdef USE_ZBUFFER + fp24 *z; +#endif + + s32 xStart; + s32 xEnd; + s32 dx; + +#ifdef SUBTEXEL + f32 subPixel; +#endif + +#ifdef IPOL_Z + f32 slopeZ; +#endif +#ifdef IPOL_W + fp24 slopeW; +#endif +#ifdef IPOL_C0 + sVec4 slopeC; +#endif +#ifdef IPOL_T0 + sVec2 slopeT[BURNING_MATERIAL_MAX_TEXTURES]; +#endif + + // apply top-left fill-convention, left + xStart = fill_convention_left(line.x[0]); + xEnd = fill_convention_right(line.x[1]); + + dx = xEnd - xStart; + if (dx < 0) + return; + + // slopes + const f32 invDeltaX = reciprocal_zero2(line.x[1] - line.x[0]); + +#ifdef IPOL_Z + slopeZ = (line.z[1] - line.z[0]) * invDeltaX; +#endif +#ifdef IPOL_W + slopeW = (line.w[1] - line.w[0]) * invDeltaX; +#endif +#ifdef IPOL_C0 + slopeC = (line.c[0][1] - line.c[0][0]) * invDeltaX; +#endif +#ifdef IPOL_T0 + slopeT[0] = (line.t[0][1] - line.t[0][0]) * invDeltaX; +#endif +#ifdef IPOL_T1 + slopeT[1] = (line.t[1][1] - line.t[1][0]) * invDeltaX; +#endif + +#ifdef SUBTEXEL + subPixel = ((f32)xStart) - line.x[0]; +#ifdef IPOL_Z + line.z[0] += slopeZ * subPixel; +#endif +#ifdef IPOL_W + line.w[0] += slopeW * subPixel; +#endif +#ifdef IPOL_C0 + line.c[0][0] += slopeC * subPixel; +#endif +#ifdef IPOL_T0 + line.t[0][0] += slopeT[0] * subPixel; +#endif +#ifdef IPOL_T1 + line.t[1][0] += slopeT[1] * subPixel; +#endif +#endif + + SOFTWARE_DRIVER_2_CLIPCHECK; + dst = (tVideoSample*)RenderTarget->getData() + (line.y * RenderTarget->getDimension().Width) + xStart; + +#ifdef USE_ZBUFFER + z = (fp24*)DepthBuffer->lock() + (line.y * RenderTarget->getDimension().Width) + xStart; +#endif + + + f32 inversew = INVERSE_W_RANGE; + +#ifdef IPOL_C0 + tFixPoint r0, g0, b0; +#endif + +#ifdef IPOL_A0 + tFixPoint a0; + tFixPoint r1, g1, b1; +#endif + + for (s32 i = 0; i <= dx; ++i) + { + if ((0 == EdgeTestPass) & i) break; + +#ifdef CMP_Z + if (line.z[0] < z[i]) +#endif +#ifdef CMP_W + if (line.w[0] >= z[i]) +#endif + { +#ifdef WRITE_Z + z[i] = line.z[0]; +#endif +#ifdef WRITE_W + z[i] = line.w[0]; +#endif + /* Pixel Shader here */ +#ifdef INVERSE_W + inversew = (INVERSE_W_RANGE) / line.w[0]; /* fix_inverse32(line.w[0]);*/ +#endif diff --git a/source/Irrlicht/burning_shader_compile_start.h b/source/Irrlicht/burning_shader_compile_start.h new file mode 100644 index 00000000..0d8a5f77 --- /dev/null +++ b/source/Irrlicht/burning_shader_compile_start.h @@ -0,0 +1,24 @@ +// undef compile flag for this file +#undef USE_ZBUFFER +#undef IPOL_Z +#undef CMP_Z +#undef WRITE_Z + +#undef IPOL_W +#undef CMP_W +#undef WRITE_W + +#undef SUBTEXEL +#undef INVERSE_W + +#undef IPOL_C0 +#undef IPOL_A0 +#undef IPOL_T0 +#undef IPOL_T1 +#undef IPOL_T2 +#undef IPOL_L0 + +#undef burning_shader_fragment +#undef ipol_test + +#undef INVERSE_W_RANGE diff --git a/source/Irrlicht/burning_shader_compile_triangle.h b/source/Irrlicht/burning_shader_compile_triangle.h new file mode 100644 index 00000000..aa588581 --- /dev/null +++ b/source/Irrlicht/burning_shader_compile_triangle.h @@ -0,0 +1,368 @@ +#include "burning_shader_compile_verify.h" + + +void burning_shader_class::drawTriangle(const s4DVertex* burning_restrict a, const s4DVertex* burning_restrict b, const s4DVertex* burning_restrict c) +{ + // sort on height, y + if (a->Pos.y > b->Pos.y) swapVertexPointer(&a, &b); + if (a->Pos.y > c->Pos.y) swapVertexPointer(&a, &c); + if (b->Pos.y > c->Pos.y) swapVertexPointer(&b, &c); + + const f32 ca = c->Pos.y - a->Pos.y; + const f32 ba = b->Pos.y - a->Pos.y; + const f32 cb = c->Pos.y - b->Pos.y; + + // calculate delta y of the edges + scan.invDeltaY[0] = reciprocal_edge(ca); + scan.invDeltaY[1] = reciprocal_edge(ba); + scan.invDeltaY[2] = reciprocal_edge(cb); + + if (F32_LOWER_EQUAL_0(scan.invDeltaY[0])) + return; + + // find if the major edge is left or right aligned + f32 temp[4]; + + temp[0] = a->Pos.x - c->Pos.x; + temp[1] = -ca; + temp[2] = b->Pos.x - a->Pos.x; + temp[3] = ba; + + scan.left = (temp[0] * temp[3] - temp[1] * temp[2]) > 0.f ? 0 : 1; + scan.right = 1 - scan.left; + + // calculate slopes for the major edge + scan.slopeX[0] = (c->Pos.x - a->Pos.x) * scan.invDeltaY[0]; + scan.x[0] = a->Pos.x; + +#ifdef IPOL_Z + scan.slopeZ[0] = (c->Pos.z - a->Pos.z) * scan.invDeltaY[0]; + scan.z[0] = a->Pos.z; +#endif + +#ifdef IPOL_W + scan.slopeW[0] = (c->Pos.w - a->Pos.w) * scan.invDeltaY[0]; + scan.w[0] = a->Pos.w; +#endif + +#ifdef IPOL_C0 + scan.slopeC[0][0] = (c->Color[0] - a->Color[0]) * scan.invDeltaY[0]; + scan.c[0][0] = a->Color[0]; +#endif + +#ifdef IPOL_T0 + scan.slopeT[0][0] = (c->Tex[0] - a->Tex[0]) * scan.invDeltaY[0]; + scan.t[0][0] = a->Tex[0]; +#endif + +#ifdef IPOL_T1 + scan.slopeT[1][0] = (c->Tex[1] - a->Tex[1]) * scan.invDeltaY[0]; + scan.t[1][0] = a->Tex[1]; +#endif + + // top left fill convention y run + s32 yStart; + s32 yEnd; + +#ifdef SUBTEXEL + f32 subPixel; +#endif + + + // rasterize upper sub-triangle + if (F32_GREATER_0(scan.invDeltaY[1])) + { + // calculate slopes for top edge + scan.slopeX[1] = (b->Pos.x - a->Pos.x) * scan.invDeltaY[1]; + scan.x[1] = a->Pos.x; + +#ifdef IPOL_Z + scan.slopeZ[1] = (b->Pos.z - a->Pos.z) * scan.invDeltaY[1]; + scan.z[1] = a->Pos.z; +#endif + +#ifdef IPOL_W + scan.slopeW[1] = (b->Pos.w - a->Pos.w) * scan.invDeltaY[1]; + scan.w[1] = a->Pos.w; +#endif + +#ifdef IPOL_C0 + scan.slopeC[0][1] = (b->Color[0] - a->Color[0]) * scan.invDeltaY[1]; + scan.c[0][1] = a->Color[0]; +#endif + +#ifdef IPOL_T0 + scan.slopeT[0][1] = (b->Tex[0] - a->Tex[0]) * scan.invDeltaY[1]; + scan.t[0][1] = a->Tex[0]; +#endif + +#ifdef IPOL_T1 + scan.slopeT[1][1] = (b->Tex[1] - a->Tex[1]) * scan.invDeltaY[1]; + scan.t[1][1] = a->Tex[1]; +#endif + + // apply top-left fill convention, top part + yStart = fill_convention_left(a->Pos.y); + yEnd = fill_convention_right(b->Pos.y); + +#ifdef SUBTEXEL + subPixel = ((f32)yStart) - a->Pos.y; + + // correct to pixel center + scan.x[0] += scan.slopeX[0] * subPixel; + scan.x[1] += scan.slopeX[1] * subPixel; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0] * subPixel; + scan.z[1] += scan.slopeZ[1] * subPixel; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0] * subPixel; + scan.w[1] += scan.slopeW[1] * subPixel; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0] * subPixel; + scan.c[0][1] += scan.slopeC[0][1] * subPixel; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0] * subPixel; + scan.t[0][1] += scan.slopeT[0][1] * subPixel; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0] * subPixel; + scan.t[1][1] += scan.slopeT[1][1] * subPixel; +#endif + +#endif + + // rasterize the edge scanlines + for (line.y = yStart; line.y <= yEnd; ++line.y) + { + line.x[scan.left] = scan.x[0]; + line.x[scan.right] = scan.x[1]; + +#ifdef IPOL_Z + line.z[scan.left] = scan.z[0]; + line.z[scan.right] = scan.z[1]; +#endif + +#ifdef IPOL_W + line.w[scan.left] = scan.w[0]; + line.w[scan.right] = scan.w[1]; +#endif + +#ifdef IPOL_C0 + line.c[0][scan.left] = scan.c[0][0]; + line.c[0][scan.right] = scan.c[0][1]; +#endif + +#ifdef IPOL_T0 + line.t[0][scan.left] = scan.t[0][0]; + line.t[0][scan.right] = scan.t[0][1]; +#endif + +#ifdef IPOL_T1 + line.t[1][scan.left] = scan.t[1][0]; + line.t[1][scan.right] = scan.t[1][1]; +#endif + + // render a scanline + (this->*fragmentShader) (); + if (EdgeTestPass & edge_test_first_line) break; + + scan.x[0] += scan.slopeX[0]; + scan.x[1] += scan.slopeX[1]; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0]; + scan.z[1] += scan.slopeZ[1]; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0]; + scan.w[1] += scan.slopeW[1]; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0]; + scan.c[0][1] += scan.slopeC[0][1]; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0]; + scan.t[0][1] += scan.slopeT[0][1]; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0]; + scan.t[1][1] += scan.slopeT[1][1]; +#endif + } + } + + // rasterize lower sub-triangle + if (F32_GREATER_0(scan.invDeltaY[2])) + { + // advance to middle point + if (F32_GREATER_0(scan.invDeltaY[1])) + { + temp[0] = b->Pos.y - a->Pos.y; // dy + + scan.x[0] = a->Pos.x + scan.slopeX[0] * temp[0]; +#ifdef IPOL_Z + scan.z[0] = a->Pos.z + scan.slopeZ[0] * temp[0]; +#endif +#ifdef IPOL_W + scan.w[0] = a->Pos.w + scan.slopeW[0] * temp[0]; +#endif +#ifdef IPOL_C0 + scan.c[0][0] = a->Color[0] + scan.slopeC[0][0] * temp[0]; +#endif +#ifdef IPOL_T0 + scan.t[0][0] = a->Tex[0] + scan.slopeT[0][0] * temp[0]; +#endif +#ifdef IPOL_T1 + scan.t[1][0] = a->Tex[1] + scan.slopeT[1][0] * temp[0]; +#endif + + } + + // calculate slopes for bottom edge + scan.slopeX[1] = (c->Pos.x - b->Pos.x) * scan.invDeltaY[2]; + scan.x[1] = b->Pos.x; + +#ifdef IPOL_Z + scan.slopeZ[1] = (c->Pos.z - b->Pos.z) * scan.invDeltaY[2]; + scan.z[1] = b->Pos.z; +#endif + +#ifdef IPOL_W + scan.slopeW[1] = (c->Pos.w - b->Pos.w) * scan.invDeltaY[2]; + scan.w[1] = b->Pos.w; +#endif + +#ifdef IPOL_C0 + scan.slopeC[0][1] = (c->Color[0] - b->Color[0]) * scan.invDeltaY[2]; + scan.c[0][1] = b->Color[0]; +#endif + +#ifdef IPOL_T0 + scan.slopeT[0][1] = (c->Tex[0] - b->Tex[0]) * scan.invDeltaY[2]; + scan.t[0][1] = b->Tex[0]; +#endif + +#ifdef IPOL_T1 + scan.slopeT[1][1] = (c->Tex[1] - b->Tex[1]) * scan.invDeltaY[2]; + scan.t[1][1] = b->Tex[1]; +#endif + + // apply top-left fill convention, top part + yStart = fill_convention_left(b->Pos.y); + yEnd = fill_convention_right(c->Pos.y); + +#ifdef SUBTEXEL + + subPixel = ((f32)yStart) - b->Pos.y; + + // correct to pixel center + scan.x[0] += scan.slopeX[0] * subPixel; + scan.x[1] += scan.slopeX[1] * subPixel; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0] * subPixel; + scan.z[1] += scan.slopeZ[1] * subPixel; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0] * subPixel; + scan.w[1] += scan.slopeW[1] * subPixel; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0] * subPixel; + scan.c[0][1] += scan.slopeC[0][1] * subPixel; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0] * subPixel; + scan.t[0][1] += scan.slopeT[0][1] * subPixel; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0] * subPixel; + scan.t[1][1] += scan.slopeT[1][1] * subPixel; +#endif + +#endif + + // rasterize the edge scanlines + for (line.y = yStart; line.y <= yEnd; ++line.y) + { + line.x[scan.left] = scan.x[0]; + line.x[scan.right] = scan.x[1]; + +#ifdef IPOL_Z + line.z[scan.left] = scan.z[0]; + line.z[scan.right] = scan.z[1]; +#endif + +#ifdef IPOL_W + line.w[scan.left] = scan.w[0]; + line.w[scan.right] = scan.w[1]; +#endif + +#ifdef IPOL_C0 + line.c[0][scan.left] = scan.c[0][0]; + line.c[0][scan.right] = scan.c[0][1]; +#endif + +#ifdef IPOL_T0 + line.t[0][scan.left] = scan.t[0][0]; + line.t[0][scan.right] = scan.t[0][1]; +#endif + +#ifdef IPOL_T1 + line.t[1][scan.left] = scan.t[1][0]; + line.t[1][scan.right] = scan.t[1][1]; +#endif + + // render a scanline + (this->*fragmentShader) (); + if (EdgeTestPass & edge_test_first_line) break; + + scan.x[0] += scan.slopeX[0]; + scan.x[1] += scan.slopeX[1]; + +#ifdef IPOL_Z + scan.z[0] += scan.slopeZ[0]; + scan.z[1] += scan.slopeZ[1]; +#endif + +#ifdef IPOL_W + scan.w[0] += scan.slopeW[0]; + scan.w[1] += scan.slopeW[1]; +#endif + +#ifdef IPOL_C0 + scan.c[0][0] += scan.slopeC[0][0]; + scan.c[0][1] += scan.slopeC[0][1]; +#endif + +#ifdef IPOL_T0 + scan.t[0][0] += scan.slopeT[0][0]; + scan.t[0][1] += scan.slopeT[0][1]; +#endif + +#ifdef IPOL_T1 + scan.t[1][0] += scan.slopeT[1][0]; + scan.t[1][1] += scan.slopeT[1][1]; +#endif + + } + } + +} diff --git a/source/Irrlicht/burning_shader_compile_verify.h b/source/Irrlicht/burning_shader_compile_verify.h new file mode 100644 index 00000000..c31c5754 --- /dev/null +++ b/source/Irrlicht/burning_shader_compile_verify.h @@ -0,0 +1,43 @@ +// apply global override +#ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT +#undef INVERSE_W +#endif + +#ifndef SOFTWARE_DRIVER_2_SUBTEXEL +#undef SUBTEXEL +#endif + +#if BURNING_MATERIAL_MAX_COLORS < 1 +#undef IPOL_C0 +#undef IPOL_A0 +#endif + +#if BURNING_MATERIAL_MAX_LIGHT_TANGENT < 1 +#undef IPOL_L0 +#endif + + +// 1/x * FIX_POINT +#if !defined(INVERSE_W_RANGE) + #define INVERSE_W_RANGE FIX_POINT_F32_MUL +#endif + +#if defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) || defined ( SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT ) +#else + +#ifdef IPOL_W + #undef IPOL_W + #define IPOL_Z +#endif + +#ifdef CMP_W + #undef CMP_W + #define CMP_Z +#endif + +#ifdef WRITE_W + #undef WRITE_W + #define WRITE_Z +#endif + +#endif diff --git a/tests/media/Burning's Video-2dmatFilter.png b/tests/media/Burning's Video-2dmatFilter.png index af1a9e0bbd47188165ebc7603fe9590ac48a92fe..bdd17cd18c57daefd78b3016b231161714c12d59 100644 GIT binary patch literal 25513 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 qa-}tj;HGu|#_sky*4tW-3aUiL(EooXpI^NI literal 8500 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 diff --git a/tests/media/Burning's Video-b3dJointPosition.png b/tests/media/Burning's Video-b3dJointPosition.png index fc33f23c41eeb8c0cdfffbd6f98e9f31092bf082..b669f8f879930cb8bf24e8862558c1c4e7cd698b 100644 GIT binary patch delta 2976 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 literal 10704 zcmbtahd-5X8$WioNXRCUWQS}LQnIr{GRoe2MYgPjkev~k+2e?e?2*0q-g~~6-@oua zpHHPa=Q-!O@9X-m>kd+UDT9x52M2*b;6Ia@~lNvJv} zZs@v*tE!!O8lxExf0iG?h-A8{D&9myDnVk?(t+QGA^*Vc0jaqSlYBdG6NfzSbNNn% zwh1XEDJgMTF?13PKZy|;e+T2^3!7cXN}i(+&tF|Go|tVu-V!;gIqI00JbK(cb8>d} zBt)I;yuKPu>-<*_!S(}!4MhFy|Nq0)b3E$cqp2lsqM$-^ii#1@y1L_e64|>te0Gca zO*h!lOibKQnDX)~%_m)PRkCa;G&J-tThNQQWEm|IwcQwuGw zt(`eJ%~#UtRN5|-S&U^U-!D(f$yph%v?HVuc0N0_aCIqoU5ko_W@u=*wzgKOy*&DB zt@K_08$-kA&z~ok4{>0;DLOtF(&OjiGWdM7IpKDGyfd)4Rex1yxAZdXp}^zE@=1b^ z`1lTI8Ut3I?MhJ&(5y4klVcDf+V%Xm{O)e(JioxR~qWR!=_!pFtsa&>XU!_7^Ow!XPZLqSn#HpKo3A`C z$!2S^HZ3i!qvM6cb3#HwAMuo;Ri?(l!NH-SqxF%Ja2k=cST|Q!f;+se|Nh0Wa&dFB zK71%IC+B*8%%wJ5Zl#Bdi>si}{SlXpM$kUcrY|We2@MS`M;aYfLQPFgSvg8FHAM~; z71iCtLsv&f_L-t0QF6CQqWh}G<>lqY+0oJVwxZbW)zwvD5s}K;fBpS?J3EygXO8f? z^!Knb>IJVI932OHdkw}e&bI1f##m0)Xr^E9!tC5!rO=)&r^RS# zVq)SaY9a2wbF;H`XPZK~w6b>pXQ_2I@?OOcz0$HnLSDsQeS6m%J~%s>7hde<<`(}#+A0FYz}(#2#pR@=ve(ldO2+MI^LZ@0ZmFr# zt5>&c3nnKgJL(^9o-*`SZ`D2LyRO-T)qjVjTdS+Nm&b^RxH#vv!ThWZi)2v` zdk2SbTCvMgAyHC4$(iGwxs8pDl9G~V^WmY+?z0%aAsLhoLra*Duh*GHuQ7gwf!wJGO>S%J!fHle*Q|G*UHL$m$lze{QdoDXlShJP8K&O zs;|zbu8QL`zh7Ud0-om;QVjI<*j0`jf=~zA<(4k6CT?!9*g;Zhk&H6mGc!dFyj)iY za^UO2Tke=u!}oagiZ7ApvUzUj*j*GMn%q6NL$3CLIWQz-tk#YHS6kt{rCtj5hLw*v zLu5u)mW;G?)MRdY5{IV6D-2A`S88f5uC8Sz0jnIEc(DO^6b#XA1C;L1+WfzKxg8^i zA)cxHtF)9e_p?GzU*GTH4DGs|X3A&(T~KhV8xJ1&^r9j-I5_%RTO%1CIjYeSMRLdI7s6KFAtzVFbai#z+1X(fXxzt(eHK8$ZZ%w(s>`8y zMWmsjQBhIhzSqgWYU6v@I6NHpB51POi6i}QTid(AJk7JCttDr6DpB|0p&_S>(*xCK zDk>`W_PmS{oF1q4>gwvSTGZ4@7`V4T$Hr!5W>O0~M+`tc0;FWu)VO!VaUsShCaUdM z7;arYzAcx@&BfI_HdgI*b(wMZ@#7QNWb@iP!p_@ynk7&+Wb8WRWMoboqmPuY%gYhp z+Q48Y=7IVLUtbQL3S{7uk&%&uwV|z!cpi?sqA~IDZHFQgB_;}1R$IBbxlr)1HKKd; zfB*jVygV^M0R9@P!dp5M_`AEix5}qH4aY73_c}W}2h8Za*VoMtx=*{3gre1#{ru1w zudnnEA5e1-p=(!GRtAI|b#w7hN#c&D$g@3XeAkIV#S#i)fGZ{0v2D9W}C zL*ee!ck792DRC9v`e-;-W?@??eE)tB4Uu!v_R&$j-O{IogfYE=%c&1uD!;Fqf=Ed2 zy~xhVISCn6c>bJ{*R%)t;gamvRk**8Ps4I=`oo70DHaY74;%gQ=K@vgSe#v4lp>vg zsXkD5dE;mK+?+s$ZXTo4kjpFomAr_)|X;BOBpwGb)9a^%#HOhfV)pmOQ$3 z$XxO~s#L(-T7l*fKkDh)w7#%(xbZI=#3ZHv#hHZLJ1YzkB;~Oq8pB9S%bmE@k9$iq z^BE)FSk4GNHVJ!PGsZ=vtahRh#;@hpWNVC9Qr=7f*a&GPLWFA6S1Db?g39Meve1ea z5C0M6GKwhj69=c+Z8OF}@e0DOB(&$>P~DMe!^bzjaF|#$QIQ*k>nWsL>B$e-VDzMf ztiC_r^7?vYg&vF&DQY=|sok1-$C*v?30iUS_T8`v9Gn#N>F3s0qQSwu{JZ4Y#Hh%F zwd^1L=6ghn!Spe+o4TEt4oF56bcXQ?l(LNHk9)F1a#`o+P5F)+jj(NPd%mJzkkzKH>K##Hmdk{cufI|_MhD?SH5d&J8Ntxrcsha4V0 z2EE|m;9$4dVPLJu%F4QbZ~#&R55^}ot3z|qdrxYOl=g*%^OiXf_yS?c$@IQw;JNMbx zU|AWAaXzLM7H-1_X9V+Rc2(vS6fmo)`l=ci*45QjRK!*2C@Dz@PE|WunVFddYilYg z8R+YCn)ajsJ%>ptzb~+vYd+YT(qp-WiG>wT$^S|4_R4vM&75>NjXW`$ZKck==#T#X zyUxObC-+!bTBoLx1+C!A%r%FlzlS^K)CT&fvL*@Gq&4sJAn>RK?WgKI_I3QeeS0k} z-JJN?4lz7DOeN;&-W*Ed=;*j#oBh@|At50tNf#*E>*7E?YcTl{Ha7N;SNYt0e4AtC z1yT%}HO@Aws<+h43=K(WXgp!@L4zpIdCWFpOZPbeGF3Znr18OylgHkxU0v7Q+%iD` zZ>96g(nZQzj#o&SDgsq_obHbl8Mbu9=Zgwq&qN6=*_tgHbJRKeRYRfGxExo?uDu8M@Q&Y3jpH)8cH9Wj~zAd_K3uIcNfX#>8zunzeJ1w+rTYv}4D=Q*uV!%@&!NH?; zk3rKU$Yu6*b+HQxoyC_#|M~L=N*$WAtGnB4e>u|icYaaP&R(~elY;{k8iPxcJ732) zk%aL~HP(OMMBK8?yr(hntQ{Ndsi`v))lRrLIFe7EbSDY5h!kYO zf`JPVb34pC)tiBb1ttE*PBT^U{CF;WtlX-+sL16T%4Sb0n#+Wlsp&8nDc?bfVlgZY zJ-zxT0R+l9pS$?eX&fX|K?)U@m3_&trsOk6q-1587#PsU$gQB?`T!07R7xs)O9OO? zii)9$iOiv#oLrP#=KcHk*M z{lDwYn^~2OgCQT=%9IrS<(^an1A|DalZYkh7cV-Xc3L;WSo41TNZ>XK{_*3%g`MH) z{tDDF*ih?h<3XucVVxSm*@GB|?e13)%M_&oeGZ0dV|tp1g5sG#Ip6}UM4Fc-RI}S+ zNBoyBU)&DY>AfEC@RYnv5)6`Jc%%RB9R&%=+`_`b{CtKg>q;aE4oDX!riDgAF`Wu) z`WeTzx5cn5nORvRV6Kzm;^LqPZ=ip8s9naUU1olHenP_hl9!)Z4>cxrM!Kzwwz!&hSxoSV4MY&D7U{{i$6GdJ3 zWf>xCE)K`u6vg#KErH6jTYO<=wg&R(+jwS2r#6#GeqP?2H*Z{zHaC`+vz2q;XW69_ z_sbzYuUhkwVvwOP5(RoYI@Vigy>zPV?^iN(c65+uWu~RQY57DAo&8-fF)8T+a6>V) z4~ax(K95~pTa%HIaa!&%xVpSpT`J4Xm6NRvF@F2Dhx%th!L_w}q*s)d#z0S>`qSa% z5|Bv!<>^{M{iR&Y{K5j%hLVBL;^N}@`MHSOA%ZU2f;X+E<{VTUA0M9|vFhvB*J#EX z3KguZp&`p)35yL5x1!=0Ac1~^pO25Y1WN1t+`UNSg;(`=F)|fp<)$}W2RB`IW}h}k z7ySIm&U}4gDcmDN5pX{)3<<&gcM?EI`%TE{lV{rQ?k+J2NzTe0AV;UINhT7;;E)hC zRy7HU1_iMT^pw23Pf>ka!gliui6@Wsb>)c3QqtOin=HyqnqPN5DzuJm;drhx(-( ztEH6brha-z$Wp^iNq&TJP0#~%jied0???r=BK!MhjKp*Uv`1TZ&vqTq%kq|Hy;o61 zbt7YO7z?=Ai_?Oem4q9=9C#?jnhy#%}}GF4LT$>ND<$WskA%2GI?RL-ZxQN zy8|8wiBvIecaj~iK6r(ui!7(~?0!NwHj$#u&mMIjAxeveiJbh_-rS7oi&=C@f_=I_ zvy1K>Pa!E;@skokL$f>*-7c<2YgL1S`|^W(0y{3cMYXxvSXp~ropV}P28FRPIp4aA zE*~e7(#l$Q0rcaadK8O2hSm*)jA7*`}FChib}L#y6+?%Z_?|&Cz;A4i}7BQB}MKhyD<+cO*T!X zO-)&_zbFf$bKn34cD1%ncbVCMYu`fppk-Lee4^r-JtkLtqN=J2LZw^mD(@w!T0lX8 zm91?t$ygI5LfqcI)RjP*?e-N=9t8!(oqirX=uRf!Ek3?ih7XVOs>Sq;j7V?Y`uyd~ zVd>S)R7C;EHvIhjgq${o|9u*t-f`~g0%PWM?_Frthmer=VA2Q0B_#mx{r_E7lQlU5 z0{{FLdcg2O+nsM#Zvi8XmU@9uF*d$eu51SN57a~Pku@e4KoRHT>~N8xg<~7I!SQh& zT?h0H1A737XPL@jRF9PzyE}V(cO1UrxW0RL|Bq=$dpoexl-pJ-r9U}ass!Zr>BqQ(EHAu0^t|rVr^TH%ji`*hBYj6a&xCCJXL3nVSbsI!n_LN zBtJjD+G$G^#4T`W6y6ID50Q(@`$RXutKTqGz89S&?9w+iH8nb_#TpZZrwqZGuP<6J z`8|APHTwuw1nA;Bvv#V{kRP$y8XD+WSR5LK-mGn1U3E@dG`Fx6e3EmCKBxA2kBPhKGVo zQpKqY-VH!BFrdn6C}8m04+RZV_AYUxEHAj2=4NS{a6qQorY5OA?IMl!`FUQeNny!i z4qym2Hl3n3Php9PiHVofv(wX`?0bW6DK0MFoT~4(KFKei#JO=JLiR4W?e(F8WI_6- zh6W$ok>TNr+}u@25AL`y0?UNlerRiF$4K+<-#^`Y&szCKl9Be9Gs;qVh(Kn5(;ubM z-@TiWot=Fay>K(o{<*w-Cy)}A_$f|63j z>ASbLH;{&yn3ysEz5^r?utfNjd_Bn({om!yAkxatCg(8@4GMZ@YHA88hgrTM*Sv;d zbEpA{Bni$(RrRILgcijFrr|n|Gw6g9cTXU&?r$R1o)@kpB+-z9=7yB!YZQHuaQS}d z%HB5t;TEJ5D}<8JC9sE8^CaH#349x4<>7sz#5d6GN1lp^hycg@`zGiR95D_Wn1vEj z>`dinBTY?B5EGh>DpLyz3W7tiv9TG@eMv_I&-6rHJ+_!$=T`iSK_D;{mGqx~?%u+I z%>Z@uJogSIC9rgfap%|5Q&)fCpQ^0aT6dv6_Q8V(5RV51-<sWHnz~fz+s3BOKP)4hY;c9 zT#^itiaKrVx>cdz(L}xck^TKV%*!LS#Qg9@Wn@|olb_&pXGZ@U7y#wOq`>*E?=Cln z0^99qZ*M7vnH}fe-d?Nv3qGUo$~i0yq~7q1-@o6(#)qU6;?>LtIzvN4dnfLHr$M_x z`*Yu?S5W*Y+1t}Yr-XK4kP4D7QWj*u3OyH5KQTLNj2wF`2~S@bt>>{1eQADrdiswa z?Q=Wek}*(yWbZPZyUlXXX{g3XF}P@D-p_3SFT@4KL?hw~$}huk|3oN53OcexzVbyb zIpL=)|CpG6LR&S_2j~yfeBn;0J#cG?_YUN-%^?n@|I zSahN?&^$iw{@V{*lQ&V+qsnTkZomycyv5GecC_>zi4mv6>Hvr$t$Wb`l~Gn%AfREh z0e4J(No#13JEVZX1LrhR>!zNnIKQ|^>Rq&9xa9ilQj24$y zc^XO(PU`7-?JdfCd0n-(%H~R(=C37K)frHQFluD5uW;NBfgAx8*2{-S;81suQ@C zc^MFf+XAZu(r|nD27u9sYB~PBL^d%J39%|Xzat9b6@j#hJcc3sA78Y{y^6EfI zQz!Iw*iBE}Wj-gSBMxFPuDcK}@ zB(o!R=m_=kkqCOEnK*m35B4^@BBphd@hKXbx49!4y|~nzz@n2YssYjp(PAWUlM`*T zgi-*pRl2ZijSTBIQkfQ+rq60e5%+o-`&9gH%B+1QGw1DA%+KD69wPbO-aZ7*=D}-2 zkG8Dv_UF=(WMm;4q+?a6x@=0Dfo4M~TrDh^?%pl6J-g)QIGudrUL>FQCEv61{?u>6 z5=MbM3I}=by*@z=yF?_%&vVSO1K)83nT+seAT!BiT#C-iS^JSm98v;V`G0Ji%$TQ$ zN434mjjYNtI$w&b*$}R%rv<5zSY?0I*brVGw+LsIQ&GDxpS13rm~CWJYAFVo9P>}WygZEZcg zjVB5(zWSB&zIw&f(BP}X9gV;wkg~C%G!ybVAT^zexih^U`T^BcOAZI2Z#;0L>sOsvamwkq5c1wJN?Ss8OA-Gx(Ot}n<{RdAaUexf$ z9vqB0j`T%^{0U=bUt6;qxsD^RoVP(6rl%Vk88Ke zFiUIf>iQH``$|z!QCs^*L4m>$f5sDlCD!Q7Os2774)8)S6$A?T^y$+b#w~eyd7yo@ z994k6+iU~JK+#&VQt#gmp3e%znpjd#cV&r`gdJhlBk3B%oHVsbuWkm!UCZ0YI-QGNk z`@uhTb3Q4wKW%L}DJkOV60WX-LAxB9#eVrWiH)OV@2daQ={2Q`k;4u$g3+FNm||WF zgbhU_L~lkx;Ev#Z5_KUQuW{i?z;Bxr6cQpMC2f1lJp($IijuPZW>`O{3?r{u@ZS=t zitD4l%r-`U?PrpVVHauq*S%>y;QRnn?vYVFYwJuFOOC`z;(bTVl$#B19-^YRp34)H zaC>@Vz<^o-J>bR+!Wg+T?oXYg5=!U#n5y8=Vx`gmn@k+LaFo<%Q@ z4JFfW;(UaK2HG<*ee1d1fHjZ_PzWNb%JNI!Is$V()o9i*r4A@96l$N>EQvuj>81HnU!QpsG2xsR|ok0}w{?dbEYb z#mY&vCon|q;RlK!=fmTc)YYAUNizA{a6lwiQ2{Zr7V8J5TQt(oQ0jKtf{LjkGhP< zE|A;}DYH(Q`ACX{FDU5Nw0)4O~f(=dnv<|IHh2ugh~_ zgM$MFkU9KTlP_4PxZ^`3XyH>|w<>39m13QPWENf;O_i3GzLt!j_NwYG=32s!wx$#& zr{$hMzt+Pb1L{>VkGK9juMQ}u^%6@@hqw%n^%o2_MOYe^_Ev7;qRMS2gShnT4b)&W zMrWd;q9W(>Taao%BE^#iI^*0-4GkL$4Tzk9P$2v<%D=w_QG&f?Y*jk}0Rdht%;d>= z$OHL=F&tv=(=gYL)O&d|GBB|Cn4;2z%WP$T`!)&D5cw9hWa>8X+<>vHtZanVs^82; za~LH>K{Tq5_htUd+*~7(HfBnCy4}ogjQ4x#;i6ilrXcLPm-_3iVG{7~z93d*o>`lqd4dx_+N6FLZdj?ZjK$$m1!((F! zT&eyk5RQn5=%y;d-+x4}V1sG!f>ISt-db45j$J6aI>@bIw|Ry-TIA67ut`+A4aj>)h6m4tm;hi*6>#8z-2^nq!32* zpu9pGH?uoNOGX+aqNt8z@uDJS-Xt<|?dLEOodzat}5}ZX9ni2W_hH12YoB%#m zv81!Wu%tyNQZQw~0Uf=NFAB$;uX*^sDfK_oj}}PZZ{*E&r>^YVsYG>#6*`lI8IDgh z$RFr!(r?r2cdqQ-pALNVyHRr_TOO(9y+lZ0k^2Mrg@BwNgU|ekN|g4i=pAi|yYGEP zTbIgHM{kI;pda0OMN_aLjsAh}4hkKyk5K6GRgcm2PSFxhf_=^ogZXquM#kczv5ARE zS%mg$P>?SPlDnDL)^jOYV*X}i+>L)>Y-To=u<%YrRaI(U>GW`;Jup?J0zz=e_aRbT zmNc{f91|01WDF-;Moa^xn&kBK#OUb6(*q^lbhUt0Rv zfHAf`XV^qi@;9Ie1?Kg^9s6Q9h7==b1cxFTrSC;6g=T*UNa&sA1c>5~X98%Knc!GJI)@8n3*@(N zH|y&}*WdVfeC&)V)YH%~!zpiFS5(9$ES%V9MHk0!MI++r31>XuU`h{g#?H)O?g5y0 zxfd@oV*NgT>^=E?{pJ7NnpnXVx+2x6vd>XuQ8lrP$^|{lr zTVVjF6eJ5N1>h-sFE+yc6_Em| z42(w{Ml*U|g{ZvW`P~Z%$?MlYmFSRzgN}#mBkrPCFzWF$6)_uRb33H)0_*cO&(amh z0X*<^Fa^a?Q=lIhP@*|+%9Bj$5G1BjhHj#C#~(@RSBU>FO@^No{{$w^N@IT*4r z@~9lU*TJ9=Do31-PV)LF8TW02CdlD|UobE*a#UzisHeSd;Nal+<55V8#KArQ8(}jB z)R;qVpG)#|)OV@s=@r^z<0}?8p_KgC&OeMrG5}VdqyD_Fe2eyh*}tJ7nAwTI==R>d zMVQN_rlwN$f8aA8j`;i;ra1S)evLjj=I|>jDoRdHuKWIO7`)`kdP(;^`L9xeQvV$T ziR=qj$x(%xhk2+9E97E7YpiD^A(2p2jDXELhy>#;0wYO>wLzsJk?@uT-gkWvzOP(i z&OnrxL%l2lr?;|lSv0h?`mz%D*GHla<|ehwfgAOk0&n6K2|%hZ$T14j#@@h~7*Y`y zdZHU}%8UE~E$4nboJgVwTV7q|p5=t^+_`JQ7 zbHkQT`LAog_L1Jcfexp@5=Gp~#OYwp+YCVl3REpTgA$rKWTv-6>Q5FaS0}U;6s$lL ehOSgxVeyW2dUDi{T%X-UJbU_5>ZhdshyMXIN-^gE diff --git a/tests/media/Burning's Video-draw2DImage4cFilter.png b/tests/media/Burning's Video-draw2DImage4cFilter.png index a245525bbccd0ec1e9b7b5e0c26eeb5704fd8bbf..0a98b70e40a4f85a3d6093462aeee7c52c8ccf62 100644 GIT binary patch literal 37162 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:ueRR&5B*>ic8!G$GD^YqkxIe!@rt)Ce`g=O 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

|= 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 literal 27977 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 literal 16353 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 diff --git a/tests/media/Burning's Video-drawVPL_g.png b/tests/media/Burning's Video-drawVPL_g.png index 113dc35c169f65a860e7eb31c252e7fb0acf5369..438941d1e163a68cf35936efd88bcf9be84f58ef 100644 GIT binary patch literal 14337 zcmV+cIR3|pP)004Lh0ssI2`oL~D001BWNklC<9jd3GryQb&5Op^Voa=2 zV^^&7VgVIF5m7pbN)rL$-Z^`%-ygf2eP#v(?;y$k9EN@NIWu?We9w2S?^?SY`tjK} zpxNb}s~Q0k07R|=5)h(_fI|Jw^FCyP5HS%G-Mhn1&HoPTD(4<{BLTO+a{0PWc;&L8 z0wo{_*~%WPMv?$R5D>cxm_j3jz#w1W`tf-i@=XqW>lA{5C=vxxBlo$#cE56+C8^1$ z^!t6?J6AOl2qFRptSxpodnEuk=k}cey6u7wYx39EUqpy#okvGpdZN7_A+Z1Nv3djq zB19q(5`nEiBs7BUAt8Z#+j`3ZlZTQJ01=SbtFZxZt3^?@`k;QluOktNkVvS6UAH0E zc>b+DAb`mC7R;^H*Qi!Vgw8wckJS%aggCB<{Z=9XOH}cV{)Ft%y362qjvGAr1be2x zkpPjA`#ezd-&wWP3}67e{h`jIix^i2Hta6Phc5ba_n+L-1A@~RY><`v8bw3_3Q~o| zBQHK7k1qB5a(E1(xb_^b!eY_Q4y~i?|IRV?6Wl2RvG8u1Us|=)5?}zk-B4eJ#Bkir zQ=G%@C4cG;;5!RzkMWNWx!E#Upw2(^=J?R)pBzUFVvvBuRdO_qffUO@+X(UKIx1I` zK~s(#^v+S4?H71k?r)lJs?^2@$7Q!0>!<#7t#!9zUnJ*=5mkJVpZ>9{fc|j#>_@iS zp@v^ZL^<&%6&&VpQtk~F3K6TJL^9w>SZrfiJ^s{zQx79i0wIvS6$m6&d0H8YuC~tkIsjn6y9bm1-Q>)&5XcKFCo#WK16^|yZA-&VE$j{Z)v~K%n{=6;_|w|m zc0yJU00gM>4*831j?FR&dHd|lZ{~41Ys~7AOSbiW-y6K|y9ZkAGA|o>U-6cCUEr#Z zkEz*DF8kz7^tpZi*rHNrS!YPjv8@|*mWh`o6E7oM8Ru5YdglBcQm+6Ib+wR zSHyoYu=BVQx!$bq4+SUfQ1lkcR=lDL$01p3uF%Iv^LEcQ|HoD>n+jk6egCgzRT9TY z$GRFKBn*!+iA=n-*%-UOqW}dc5gLE)Q8Bc{raQ( DI&_cdj9?p=L7=S0cN|4 zusd$whvP3u3y;?84%3@oHX*I|#5tWDQ&w`SIau(lEIdjnQPn`0_Qud@ub=$&et29q zk;uwQpPO60ck$}#`Z@Zs5~aF=NC{_7ytuH>&83a~(;{S(ST?&xf*4**V+Bft z6wqtm$2RsSSC-l{`2HPVEo

bE~Q(_F3KhmbcsC1cvi4K)gu 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 literal 13937 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 e&9zKzmj44KKiFI004Lh0ssI2`oL~D001BWNklZ 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 WpFBB}_WJ0-1K3(35q0L+l)nK@y39WS literal 2137 zcmbW3`#%$GAIF!*ZA?#?L+K91GHf?0q?tn&T0`cLG_BC)&iSyAL*|$qQ_ajd!hH)l zET>1NvVgd-j)o zZ|A>$u9+S71NGK+0OkJdVnf8;cA$jr)Lq3lf3()W+!Ly#M}mr?_oWwMp2_vK<&0dsQr`uM>O*!0oawMD9RLyjY?!;w-=wj zjAbtc+)<3!SVJbg%5t`Ypq1D$CABxBnG5jo*MZ!M+8tr<*lz!q1BpkZeS|KPmGQSq zp}4Gwkf>ja>L{Ld5KAS`3ou_3&c@qQ38U%JU|52eVn0~o7M*v?Emp~INH;0#Mhfi8 zn9qp1Lw(kbRDJQxo6J6NR#WuaBaus7{AzCRW<$BxtQo^hCUkqoK6!OBD6(g329@o^ zA;3GoQr^TF-!!F_l3Lg}T_*$*Jj=OU*ick}z!*)qhlb3>Pzw4Pgeg{+G0frEWjQ=Ehiq#1n8EufIKn*8n2*i zd}Et(M_J&Qc*WI7cq9yI3E7&o@MV~f_{g^(owklb|NP8K#{>$3h98!yw|^iH z>GQ%w{k<-`&`;J!t}WNng~G+9-Y<5E!DRb*(*o(BVDBNUoS34dF^MvEJU5KVP#-7r zu5%`$KTQf-tf5kv?oeG;9~MM>N7z@V+0CU-t>=!&IMzYVUC>`E@H0xu=woN%Q}HSK z;d;^%Vn1MaU59|R$@}!;X?>DU`o!OA9DLe)f*-Wlr0L%!atiSY?NBfSk95!MCC+|J z3_V(y{Nq)4?n+Oz#yqSSeKbjwKx^2hL*dAIwA|9PvEne^9=ByEz-;7%9GeHZU;C@> z3CQCgQf|tX^Oj=r{I8+!5~<&QOJr>dQqL4LnL>AO7<+Y@I~=Zj(KSJe0p0lEmY2c{ z)|$xBj-4t#AVJtZzGh zi9}iOkqbv<3fzc~#RQWO|A(*mlW`xL3)i`-NEVKbU>mZrjaWS?M1DST#9SuC`g7?e zg_rOmK4rm+Ax&0#MI~+G*(`@L%YQ=dAixA!;6Y1wmTSYd&SV^ljYwc2VkVyM(3i;c zaks0xuwtUu>&Tqt%+w|l4RDh#%W@)2 z#Mv6-lDovfqd0O!D&O&E6F*&>;<;t}iJQ|Tj??a>QO7B`>#AuFq~lLHyW7?{xrObiK!fvO`C})6p@)6X<}w zvs;az*nJO38<(7>Si>F^Rc{?NTDb`Bdrpv&g9iiwf#bVpD6T2`0vqm<44ptH6&yNU zk?jM7f=+$z0xj+t{?WgX@?*Mhhx9^!T$2L~QODKRcuuRJWer?(lq%iy1`qj{nwIeg zS;^Q|TbIfz(#Z%)mB2?!dB51$mlNOR@FO$JdhFiZIC=G8 z)TL?SHNJi66(&zLtjBDF-e$Jh)+Qsh+EUy(AUwYwhc$G9^~wma1c>KXM|LRV zd$vzwX1((%>6cj24zH854*gM_k2RFRkjNAAL{!aaIt=t^rym44~8~3SszJ1 z@y+9XsNK1UNK~xK>MaD3`1CVko2r2$^24;{J{cO2_RtWpp8YkiK zeCimsONC}2nKp`$sDQ3yMQ91e_-wyX!1Qll_MhgTL??=rQdYoT~>XFwr zFh7?1u$)9~ozcKL(&9gG+}3_e1ya4H@;l%Om^H>6BpQ*IzgJuC!30e94p1)Tan}XM qquU-y>kw*$!uQ|teyD%*drNhI!t!OPdD28*27oQv&Z@?eK=~KF?HVQk diff --git a/tests/media/Burning's Video-lightType.png b/tests/media/Burning's Video-lightType.png index a472e92dcc2a6e27115d5ef841ea07dbf484b281..446cc6dda316735b9f2cb8bb2832726fd65f1808 100644 GIT binary patch literal 5471 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 diff --git a/tests/media/Burning's Video-loadScene.png b/tests/media/Burning's Video-loadScene.png index b68c9144610b7203ee2010dbcc300afab4ccec52..00e08b11d0215497f4db291a18c121fc3bc96429 100644 GIT binary patch literal 24949 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 z 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 Ef_cHQ%m4rY literal 29530 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 JPDHLkV1mt+l_dZG diff --git a/tests/media/Burning's Video-md2Normals.png b/tests/media/Burning's Video-md2Normals.png index 709b97e9eb7baadcc108fe5e8e9866530634a35e..302b9b3de52bc18805f18cf328586cea7a1e41b5 100644 GIT binary patch literal 6457 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 TaiUgj00000NkvXXu0mjf#xQPL literal 6405 zcmV+g8T#glP)004Lh0ssI2`oL~D000=wNkl z`EOiVcHhsr_r9g}A}NxhHcBk1MNw)g-Oz04nQ^8ekH;P)wg*lyh<`9(2eAKu7=it} zfxu(u$2bXsz`^_y1crf3=ZC=E@N^G)rZ+25ySvrYQk1$|qPW)n>MeIU{^62OC9=rY z^oYgz;e9{|c12-TFRFiv#(C zG5~5zTmSF%x!RMjAOIyv%m4^Ma2`g{T)n>j&#rX4fzk@MKMtS^;lrf_r07SG@8cHsauN=7v>qDfi07iQf|C(x!n%z&3joed***n#vs;zT9Zw& z>H>gLnt;|WURt|y#dSQ_b<h41(@WEo8 z=Z=dAFjue7)$5uJ5h)eW>RBE0An;61ONkOdH!N9mqTP}mx{aH!Z0#{50-QU z^u6EyUV4!L9$dI^?`&gF=ppNTnMR^o%jO4@tgm+ zeDNY8AVZhCe$EF2wWW{t>UvW$fe(<>e1B{DH+Q_$>-FTq0_RL?qm;6`YN=8SPLf2* zB;K}Q08mOHM z2J4#}>5p1#h71TaXh`;%XFu7>v-u-3_Qw3(-$8As29uMMN-1l*#u#Ii*80)P3Jfeu z$V5F{UQT}`B0~lUj4`M0-1%JRY{>*ZKvE5Mk9Vb%astegl)Qrm?F~tiD5dOegAFmpT$gjsg%FP8*o&U$ zmCNN!-~%Leq_x-Ua{x=V=KzeoqP2;l$Po@8V+`i%_0`Ll8Dn;KD}+!=ovGioH@Cn1 zWhs>vn22a^uWO8vQUU-X777Kp>NI@v#THJEX()(a=BbCmotG!L~W_QRC^8p01!Z1 zjpyq1wab^oFq*w{`{BaE@tZdRVDrTn0l*kjEaby56pkCmagrp`n(rR(Z#A|sWR*&# zQm*9l`ApzZP+O`m)#d>V02}CuiE}=C`!)dFKYPyeJt<|iT8*NJbK!fw*p^$f9LL2i0I;%a04;>C+OFBb#>XM!>I+3IJBiVc}Kk&ff|zHi^*b0h8`v*5#J zW_l)y!ikBA6DN=V?9HFXN#c55wOVzUxOVN@?b~lZ{d|zv=mAZKG;*Ixjlq*HX5daN= za2#WFu~K4yh?FGpQwDWp0*@LiOl_&Yyte-9zwsMy{N#;)xPDz}Ev0HVTSQbU6vxKL zb2-0Q$a6#hFa&SD{Z_7!cZKV_K4&6|!l!I5bI~JWFbA+cSMz=M^qu+}FTBw0cFW~* z6vas*U57i4!-ezU!2?I|oaX@{ZEY<=zt^vhSI5RDyp?684C0<)I)h{uJR<6IwKR=o ztXe_9rCP1i>Ev>`cDsH2=0`x9altuHlBCgSB#C6gF`Bf|N^7M|tKBrll*%PP=MP5L z?oTH0NU6`&PR&e(VHm}+4Zw)w7yy=PH7*>^84+otJDpCq+iSJj28}k#7!5!_dgYa% z7x;OBR27RTZ zjgPk`+t^so7xJFxRmzoqzyCCiW-fXZ*r`#qQqK84=REB}2ZL{nF+@bh$Rz0m-G{3W zHEF4o(b{as+Wq(^KM8{1`d|Ks+)v*e4A6mr+1Cy-3mye_@QfWO6bd%5W-B_5vF+Xz z3D8zvF~-D6!dRana?TNvGiF^h0o?e(55Dy8|Fqq0KXjZpjuE%A%d-ss!^d$PD=iWA z`+aN5f^*I|V~jCQgk&pm$Rv?cYRwR}HpUnr;0zdp!oU2@D2Q@?es*@&zO5af@6~7~ z@F=kU(+UjR-q?P3bY{T^PU=5ft+wrSZEpWkt>*i_>$=vm8MCokq>Rx9lqRK=R!S<( z0UXAVaT`;2|C9UOewzWDJ9o~G*Y?>^$^;%M&1N$Qg0#v`tJNx%O1WIl^E}SE)mTa$ z#mV^f>rzUol-7!ffO9)2V~lmX-Oa{^R7uXwRVo$OHwQcuctqH4_|&aigR6{l^?KOv z3nA>_i!o+57o<$?pL@<`G7tdc42Tdw;8xi4^73-8+eXCs`FYOyJ_UEOK6pf=M&{_P z|MN6Wlr!eIE<;SDq{kQ{avZ@p2LLh#01%KfrnPRi+w1G=zF#aB3e`$wv(ebA-7F?+ zq@2}`xfA1wpGE~aUf=5by zt|kPxtI#&r8+M7EUL+#Dy}V_$a{(C>hzbDWptI53D3wd)VtIOM`m+b04Q(+Kc+}V& zUz^pxLs~>UbN6nVu$11s1(DI3amG0_#wbIZ&BoYRb?V5`+L>Cb*#H<4OPdX{4u>5p z$te#mT-fWSttvY}oHImJ+O*s4)z#IY+x3KZZ049JhHMgN7JN8x&b8J%wsnbY(l8E9 zC+KmcQmtiS@P*>0_DtW1y39G#xoXl&M&-Wzz$-k|euJGB}PS z1dpOqSHzPsa*%tap>LtU|zjj`boIRs#h-fl(# zK*1Fc7Z&8N{0e7mdTM$|E6?&*&UiY~GdG569EK6+dv?QM43c5ERZduGV~mkXDXnLY z&Fp?8>w`x`Is=}o!&0qgjM-~21ps`nmxzcA65w{d=tOG*jG`zAqGGYQ`-x285%IXJ zAp!u{sW40HW<5!`E4R!}j_;kV0T2@4c6CIh4FE(@)Mz%B>RCj`FB7=kk?tN&d7c+V z@!$&c;~6s|AsB6FU<59uY9H+KapBrY8z|b%-K!cmWTI(o| zy1i_n~aCqgQ1uO~^e`~FPeQA6~& zBpneE;Eqw2dGg1hdJoo|O}3ZAhUT+m0v`ftJvt%)!2K7C4eiue8~wxxYx@%sMG|(A z3492o3ylDKmueq?J*n_eOBG`Ha4Hk{kl9foc&OaU02}D3$(Y^8p6wMQoe6vh7-Nhv z00zLQr%MDC;;~YOK<|2LueiHR;6p%by|o!kCN*F??Aj~B85vJ~Fag+Vv#F~u`QESv zF@P-S?ohDS#yK(srM46hLP$Bh5VXbfaK~9I91%G;#t4Q6K*}L;0+|IL0#+nr$Pgjh znlcH_b2)#Xrx0$0%Lo*SxXd|C(M^~8#0ZE zL~!KDk)cmzOO+#Kpo^`+z)GZ@84vZbgA5L>v^Ht3BIkUsQFPV^9}elDcRP~>XK&vc zykW;qgH2I)0e?-}MufwA-B_4P^o!3aL~KfKU)&q2Llx5bRlb!&?7fD7EXl z_N3@St`PKt+1XP!-v7s)4P^q4o>W}~AYcFj01E}7l-j>eaBZnRC@|;T5u#8m`o3Sz zm*fBYe+F;fsvD6BJbDoAQKE(n5dZ>nJx2(kwH`cfVF%VrGq!Vc(e}hMQ!~;e#kY1= zD9r>OHI5?y3?h;tBGd*P1jB$a<~YtiF4}Pz5o!Hcu&onx7|VG%E^uso;@-XcJD$p> zNu$PbxIOpC5w7D1!O1YtTAy58+-sWTdCc?BafIWzp68}vJ~k6VYpsngl`Ff|h0KCS z%*hkS8qIa32!S(XiHdFFp!K>tg0LPgEC2xKyjaL{&W$0dWRfKPez;>p$#J|S8Qytk z^WYI-$H3Lfzu0Uv5e*O|Nu-Hf*R|OUu$3|j0Fd*%V;|oXLR2c1*^?)UNGTOXQ5c1- zR%^E#-#fxO6Zn8hS2pT%wO_yX?Yl{0jZbN%i2#6eu9Vs_ZbHU-U;XO8`rh~E7Zw_u zjryJX`sx~K(ozZG*hdEM7sK)jw_bYoe^bT)kI#r+s>6Q;`HgQNA{er1XE+eu0RVIL zdTj|Fp1;5xn3|aQ*0pN@u({dreBaCYQ4#^7(t3xwxm>Q-+jD4^4YEc=eXjOr@4kzO z2$%-x6pF>c=#HgYtv*)+#`5|6nKNfR&+B%(y`U$hBtte`C5dcE7_QnTsAB_wL@$ z=ktuS!6=R$2Rl2CQ!2TILcz}$TFv(Q+Gf8Sgh42!G)AwkZw$Vn9d&;;Kfh0-nZToC zb!80^9Y@&eR~F8>5F!m}7M#1TC=`nfd9%@KH{1OnjG{13qR$>Z44$kJy;Q4JDwUIq zi*|2nD4B~M9slcZ|0j1{&bbY?fvr7!?hLqD&*84?OifLZp;ogU1pPP;6B+mVy|s;v z9V;REd_IaIdlbZ8u|AmvkCdG6A=#s$k%)TTuIG7noMmT9j6vS>ea}y#IOukgIErNy z%ea2;-j1o1=Xu5$yE&1SGW=yB=lY~2-!@qLZ<^|#_dLgQ$13Aspx5h${eB#WVHiGI zTMnZkn-I~ki#x~!9w~^NI}Y2f0Gy7stiX;CuA9r}i$oBGQ5?rn9BpoHK6tS6L}<_R zo=i~Mlgverly;}XxM28rr6R5EkBG<_0k+z0*Y&kM%{_^iSGLqmQ^h^c1EMG%l4`b_ zOyH5y?Q{SI0Kh;QZ!56pILLXDBtZ~tvJHk9OS!zd+z&$lVD?ye0Avh_VmTxYX(*Y% zBc;=8Ypn^MNc&BrDz!Fbl0?a%-$Q_Q&}%drU{^E&0Du5;z8{96F;BY*mm>i0jX zRLa^A1F#X4#+a>9G=Ne{aGoSFkpY7BjSZtU0&oNl5EB#%g(Q(ruP$T)j~*%Ij`AAz z>>MJ}T9ct5=)0a1MzM@z#uxzrnS{V~T_PBo<-HHtD05N275+_BZSRXB4eUB z>IFd%1cDW<&%`Ya%iP zFg-oh>$R2ooXGgyWG;HtOpF~#q;wqdaCsTF1uoow?5ujTO}f!*+4{L7=~e}lv=oO>CL}?^O>}j z3491VTv(vjURyYS;j@)TX%ssVMNt%nVLq4Zbvv*B?2TvARyN2QDK<3j_)UmjdMP|I zxuYC75h3Ey>FL*A|M9bGF|**2Vx!~gbG2i~kAHmU&S2h(L?mMh`8;FT zkNQWC9X+|Yc;)it8#itozj^Z@+RX$W1^@bYe&^b^ueDk&A`*@`aq?t8iXN@3*lhoP z(C>A-gP!~uk`-Y&aK7~73yr_|8vuCSaen;wKPE%3yz)xESorkQPaZvbG;?(3?%g|U z>ln0dnlvOg^8VsE*rO9F5J*Pak{=h+1o<)C(`X zI6r^>`t|F#78m$fAhP4{)0b6jESPiZts&)iPkm&iE{+b5&0kd{vVt;dE!t000000NkvXXu0mjf^a^TA diff --git a/tests/media/Burning's Video-multiTexture.png b/tests/media/Burning's Video-multiTexture.png index a5666b7ccac2fc1375d6506a849fb7231454f2d9..338f257eda01c31f705e223c98f71d9423330751 100644 GIT binary patch literal 8117 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 P00000NkvXXu0mjfR^G@y literal 359 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�XJ@7 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 b2K@g3I}j7@Nvfd`00000NkvXXu0mjfnp(4U literal 37744 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 b=QsP#{Opw{bzj*7Q!j(3tDnm{r-UW|6lGL$ literal 812 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 literal 16396 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

P5_4x4N(8;g6`VSx8AFQJ? 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 Q%O9YpWvKZ{!#?`|0O@180{{R3 diff --git a/tests/media/Burning's Video-stencilShadow.png b/tests/media/Burning's Video-stencilShadow.png index 60f31cdc11908f292f097d3b024441f354172704..77c53fd6cc153c96b40c9fda736f07b4fe3aa4bc 100644 GIT binary patch literal 3508 zcmcgv_ct4i`wgP@h&^kU8mZY5HH+G#s7+f+yg{tQs!*@JN72-1OO5h2s2V|wR*jO_ z)JmulYQ&CNALsi=e4lfkd(V09&-dK>q*zhSO7D;b~WZ z`qe$k#6Zt3ym+f5%1@{-qN@|`eH0WG6?OLk$4%LKsT__9XC*&5|9sh$89u{o(a`hc zO-KgI9S}Rs&CMFik)8yz(%NItJ)@v!6<6$O_cdt{RS$Vh)5b)*?c;4&B;abAtlq%sy037Jcp|@Ju5vz?YvkN5PRe_) zf4H0bGSU{GT5gwl*voo83Vah@XulS06X#?Y70<0Uac@UiI_Q0M4Kadkx%DWnXsh_P z3rfH|yLOE_VKsvLhdXzi*2A}M(2m8)h=OP@Zo{2Fl3YT8&)8j23c^z)xvCY3aBl7P zYWf)9^ljC9eS;&LAlKCjc8EJ85m@+=iDfdyJ8N-|;Z}~}u5BQC5`MyhTniWLPI;6y z62zcQZz*M)_7DBS1PxI<+yB;+ph9rz*jh+dc%+IBzR-76{ap9Gz9S+hiauxX

FJKA#|)=NpD(q`9ltSMvY*IY^`2 z+r$@~vA*Rz@vB(mxaIO$Ai3%SzrelYw8OnTIoB12lh_TC8XGXTSj|?V>Ib~DR)`6) zXSHxJoKBr}=X8adrzoZ}P3mK?&C9JjU0NcwOJaWv9??#x+9@McBcJ;!J@L}y7vu8; z0>*+a@Xk)E4ubQ=GHpwcOr9oS*>dXxQ{aFTtj7rUdoOjOiEQyk2E^&b<28jFR_e`W zKo3ullhxj>NVH=9u^pJ$IOSLQXreM5Y>2C zqRW6y4GnpZo#W!S;Urf+>8tO(@^weMcBMJc#-tR$;l0~l2E`J1QchO$(bAO<{27+x$oUsIAW zVeWn^{xu&OMM2j09;g69zU%tK&v@&D-A};5oyZ!;k(5u?3h7stG zFA33;$&^5R(+$oWfKNag52aqly$$Xow7>(b0o^c3(g z{hH$J$URve)YP8JG5T#VmjA|JHaQ38(*&ghDdDpLe1uCZn*$pD8miUJZ8N%Q>s8z@ z6-l=E;_qXprazW579=bP=&%k@pazGFnORiv`4$0nbHT>EvBnU6H7Y(Tb`Z#9og*Qx zC@Wa@&rCi$ zGtzY}$iOg{32ZD1wgWmC$m`S2%Zn@bCcF0X(bIbO=2`uPO@8-PR1j^AuX*h$A6jf$ z8GoIWgXDrRvgifkHAJx*TyaV-#tI&o-Yhx4%dv1-s7couEEnn@-wey8L+u&w6*b9N zNBbhX%@W{2+8rMVs9 zyC*fSN+A|9bexJA*BSta*+MBa3nQlL&GXg{N6V zo=xJH<-C(GX(J`(L@JKj98@C)I>qCux&ogRSc{6AWZRZ26L4Kqt6R1MF{{_`8D ziyZB*qYoN)!#mj93!X;kC=5nE-c0!FP574Nu$FJimZVQ=tGKe?BvV%Pr)2I7gi}dT zXyd}{Uywxx^i|565C3_g#<=`iRllIeC=Ae6#)fw2a0K6s z57lsB$$V7?!vHafaSpmE3oe)IQ-&El-!yI!Dj3@V*@BvM0j$>JQ|<^{1qCujA4kQ3 zH82QppDagew~)89>|E3@cd@D9hIUee*6yGqSsKZYk9cb&%qLWh2Lk{G8UpmY#m(0N znJraRvA{3}Dzv1ib@qFMony*t7d=pPrPI_vTg2LGdua#k?R1>;;79ZEgWKS{2OguX zN6m-1PO+^0^ScPvU|PT_{vE%#PcdK=2f_SKy)mG*vrM#$5%t);ADHrT?uhuXY)VBy zPMjkJAit+wRc6zWrFF7!dASLJHgQ7l6pPHEOaQ#_fDu4flgj%0Aau!~ik@UQtyZ&< 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 diff --git a/tests/media/Burning's Video-terrainGap.png b/tests/media/Burning's Video-terrainGap.png index 835a946c6aaebc6070c1c412fc9e17d5c2642927..db12562621e74ec8a2dc8e56be33bf8a3e25b922 100644 GIT binary patch literal 4337 zcmV004Lh0ssI2`oL~D000oUNklmL+{&2bt{K+)W^RGWG!%aUz^E`{lx~{hee;}!Km2MCIC^FNo z>pD%-G)=b$e-5GJ8r>fJ3FJ*XO_N^S9{kVKJkRU8(oMT_8~7ild7jmG&0m*gk(YJ# z`iAI#k`R+MpHg!^pHF$&Tg%)Y{Ev}&t&&<-Ugp$mHMTx|%rE*A(%!U>!enY$7K^xM zTD{mzlWrUT&E%cXjH&YizHVSU~8^}AJ!Lq!JWebyEUtd)If#t09?ahA! znIYD7UDwqd&r&M&S}n6Ii&-5h@L;_&O_Pp@AML|UA(>qTra($+)MZ(o&!<{if0~)e zIVT+*q48y#g5UIiAY4oqa5J@{M2Kxh4ej_45p+{>XiULx`cb0Ds9OaBGoR=4i3QB- z$hw?Jhe;NCy=)!-_U6lp{6}r+(xL!ZR_p97My7Wc{jyXF?r>9w>Njl=TH*mu-+Gyvh^sO z5ZhmCQ7p*{hf)^LL$b8~&ccW=gHely^Ok~xXT zRdFj*s7&=yEQXj$nx`ZQeHyX$m%J7_LVL`xfP&Ry3KGuc{$g+iNi=f%Eu_W-0M4DgM z_1nO+Td>BVL<1*WB=g2AAo?>bO{op4zWzyM3PkEy)-=`^%{TKY9_?qEc{V0eM9uH0vTRqGP$W6 ze%9n2nzqCKW@Fd$!vb0@&k9rMy^w1+L#aGI3&r4!$P4WzrGKI8BfJzsn@oSz4m3r| zp*;iu)A`|TU?G;*lCeWvw6s<$TG3!MkX~J;c>F1A92sV_6gcT`X zQr%$?rR59zSwOV4E1*LGT;wFHBRw)TQSfwu57@rvD3e!WMn7kAoP!>wtal#ItV)(E z`L(JHK0TpUr{BMSV~P~E8s>8LlTv>VN;r?Iy*W$J#Np)LVCJcSwN8~#1DKJ7I@G#h zR!omV0cxv<9NruLMcPKA+o#+RJ#jK`*Esdj*VotbT9;Y2+f#n0 z6MvGaaH+^I3QjM=o9l}t83ELH>!vtbVB2S&XAG8go=AC?wqm*!SPWL(;v?OkRYXLA zZQ3$BddFbNhpq3MF%7}l<2iQ52C^Y-owX^2d1+B>cr)ym#~T{czF%H-9(6q$@A^qZ zA<}N5z(&)5|NR%jFZF844+{CH?3?spj``OxNbg=6?N+umN2xN!pohRkE1Dtd+H7Qgt?ZC~NyWy>mb6SGRuZjCxk+s> zt!rYFN$kQ1IU|!fT8#6t+35Lv`hggVHw?5i)WZG_Vf_92Xy)(Xc&T#%3Ri{4XMe3H z=ncbUs&MfF+cSL)G0ZEc&{bU~#P+(1FXLsF>_kV#v4$flqc!rU{i{%ASw)Zhon$1- zjfsZNQMlt_8`M?y0ys7F{s@a=wc=F>Q}`2eV`H~$=a)X1nK5j?!5+=8HFWfQ?{k__ z7uNOa$dU{a48@Zd(t7e%uVD-?`ldQi1qs70e<#bH6=1b2i(1I{L0)I@tQOgubYu}u zdD`$Its#If+xRWz)M9ZMP zSRJ3}j9_N4uuJ#|m-0J(wm9t%8YuY)5;Doc6aGBLBr8*t-;2@|&L0%#j2BwP+)D>_ zh*VZfwr|d$!yRl8Z$1z?he8`N6Vw!=&)+n&DGbUMxBc

<9!xt18_RHyo*k0R@`jwVegVGNHYF ztm(Ku@ho2aX;N(k-YfJnh3P{L(bfU~iem`i_B0CwUVS038)r+i*X=QVI(nW_J!u(g z<8b*4Ss4W%BQ=Nc3RMbo83F87%2p_SP_(C(XZcnZm(v;Qn0py#JQXA_pPrJ}v&1=2 zX5BM>CZ(4v4O1`@qca*FKD>q1ini@0T8^+6!+Ch{$_690u1;y=#vWN>XqF2D2ex8^ zAe=P~O`a7qA^m;Ns_C7DsyloBL=QaMu(xd*l3^%aT;fW{V!VRLcP$^*9^&qW1>h{E z*f_9rgMPl0*)kj`p<1#y+6f04k*YCZ@1kGCj-<(iGqcqrgPx+BVs$hj7PAY#-+-ek z>;jEK*{0%t5Om0wq}Q(LexGv<%h*bG);Mb`O|r6tkn$S;C^USSmr=V}?lweAdNV4N z!N1&B_Y`YoPp_&H(olhQU3m@Y_>1p840!a!vb{~0D+#97Zn(M_DlS|}CB z_63gS8)rL#w(5EcGZjOKzm0sFw{`8IHvTUwK0-Ydz}1@Du$NfiGmpCVz* zDRo;D?G&c3I4DgRdo)BjQXipFU%7o7AIPzH+4zBnjj2^@l4hr%YBp6zM`L^tmj{I|lD^d|Z{xKr9Tpk~p{3UA7dKmwYVl0)tHE^AtMwPgqw* zuKbXE6+WzH@YrcMV?}W{94nqxi21%e<$V^IJLyRlcbc}zgfE)DWJnbw`2DrntQv_D zcC~QIED_C63uX0=n7J}#ZCD<`pij+#UexlB_EyPSDVo4FUFG~<=op?|@~|}%&G$+zDg|*5$?6?o$ojNi?1n|FXA~!-$s$e9OxJ!D$aij zZUrhd1t^>>gQ8uO<<-Yn)lI0zzCAd!E@84)Qzxa$h$cvxtO)g3n1q>u#CcoT&;h{A zO71fD$+gUyaMNi6(Y|8`a(bK(&?9e;BDmIRSC+j~;_YQC1ZdJQjy5fKp&wJD{$<_x zM2GB*F_z0v-6n=h9$Y0?t26)rcQP>5sw*C*zFS|lCn1TYOlc2%Npfh~P}j|rYKY;@ zc6W_{T93x3?@#@3J~Z|LKR%G+y+5Ob8TPLB2yCogs`ozBzeTQX^h474t=XN3gje%>v zG)ZWd4DTE$Q1c%?HS4Z>K4_aYbk(s9WSG5veum!Dqz)aP0`7{MMFEUJ9k}*4_iC_! z){|+lXIMNvL+^!-U1HV7u5+T0ZAbOA@#SUC-Vi@ezQ6s?zBDJ?H0#4hX9m+|p`%uc znIRKpZ-QOt)qZkJ!`vTMC8dYm+57PuIr zn`s=yDtv2~^vkkL)AUu6^m6ZJ3~pktS(ny)E^+8fa`i`cChOQ>^r=v$(C{6@kSs>j zy|oE__O(_S1)4JfmAY`1rO$6YeV?ktJcR~hM&Vmrb@pGB>|{gD5nU^#{`l&UxhHbp zaQ=P9NPFY4kt+GygXz8LjzE4I(^OD%USx&oEr(3DCM5U{UYkFLO`mk=Gk&~@!T1qh zyV)5&wRQV*m0>28aoYt6^rHHC^7uU5aoOvXd*^$mkOz)vy+v9^2MWdN=*#+C7ygR= zVMWO80LEY|;*J1ZOGBSK@M(@?bNcUp5RH1YPaR}pDVg@0d8x7;X3l-%Nkc&eH=4+v zB;Qb{BYPdXsT_2S_dkf=E6MHyegwb=Q!@!u@&S@>Uuhs23uV(gJYdpiO%y_3sQXE=C=9uAs~2M>Yz+GHUc z6ZB8fv`jI8eBqxkv-BLgIXgNj8(P}9k+$__bta4CD6EBPPQScwBCJ&uu4O*2$E*qb zd8~=6WTO;>QWgn62%b4g$9E6Ny~}JJ*Ic$QGz`lhBbs!PX8T#>85z7eJp~@@i#FFB zc2x;ot>g64P|a8J9n`uD2Po9l-s;0DML5WQT9wU-j*R<-)4`(HfvM+#oM6|v=)Kfj fPU&#CN}m4#ypH;b?_j;M00000NkvXXu0mjf&1qr~ delta 2966 zcmV;H3u*N6A)6PFBYz8GNklpNlTF1&iRH2a?)?6{3F_QtXPzR{mSx zPv-%=+BS7~ahYMWE{Tu$!@F-V|&$n_>ID0bEGTfu4To;UNqT;#AT*JGt7T2FfPq z{@W7o(ky{Sf#4WTyB=IFzrMbjv-(KqVMCLNMX?TMbkxwj4BZ4Dc|J%v$|DU8F=XDg z2Y2Wqv9@B&GQ3@TovW!6R5bCh=roDhxs>jr8v2y1&gOF-L`U`q{&?<}6O zx@~ty0mSnNIQxQDP8ID|dQlw+im!r$lj%ToIkV<6Y@yFE0nzN{Ya+}*^>~B@NT)N9;OlmU}x7ZfL->GF6 zlM7Q$1j^CIs`=U&pdtGnqU}(~v=qf#t?9;zD}^So>x2B|4WKLH$VOZ8g|Tpi4S!JE zw7qvK!K4OywW9~23};+G_Q16<$ST+}O6Hp8!UfKT3Z7cLfmMHeAQ)GDE_v>cpcujR z8ZO+r*NkDEMC3IGyKe2luCnbZuvy{u>rMhcMB5Q}OR8qXDb+Rxk$l~7ovqZ|tBZ!@ zUW)d~UYD z>!pVx%N>CmvLY^RnMSHppJh%(0b>B*0#gZ#Ttr3ka7Tg>?Nc^3ehzkTXtlwKDyliN z`B>0=7FB?if;>@nv(iFiurl#n^uyEHLa?&VQsAlWi;45~qX7 z;M{Z_IdR99tp8hwCAzwpe>u2QzC#p?C7S>)`H@$ywq~!E%r!xWZ-n?6vHq=cbE) zA$s5UZYb0DF10Sgu$`tx;-0l`%jfLdZcX&=hE@xbNU&LbK!_GX#L<3`E9-8&B?B@a z*j*cYWPeh8cxB=?nJ>|YDZeYYs~B85X*0eRvyn1s!+1zR3p)C~*Nk(QW9IvYp!fSm zM|3+FW!NU*EQXsq$?m!;pHZ;gEz&=Z`E+}kTpt%aY;=I~n2C+i*)f}$$x#u_l9}f@ zk&ED;d+&WO=d@J%&f1nDV#Tx$LGQ4t!=vg2bfOHOI;bt)^@Kh0U#h2QuPSSgTMhWH|GLKeH-DHO zE55!V-_HlL?+aLmV;;&dnlX^x?gaBU-D03^)I`q-JsZ0IQ^qM&n#Fq(+*sn9KFqPG z30Ilc-WvJdZnxX*wryMZG>PAgWT(}6s?FcO zf6I}F5Dnrd$pmlDx3U{;j5odFI)4y4ZcFfLM^~d&g_DEXzEQ*~B7eV8ZCVA7v8&r= zbxCeZHN%TqHOKi?brzF??(TMJXlZI_B8!a`vA>fg`9PlWlU;P|w4@@Bh6M_I>{!o&ZXpKMzD*2><{9 M07*qoM6N<$f*VN0@&Et; diff --git a/tests/media/Burning's Video-terrainSceneNode-1.png b/tests/media/Burning's Video-terrainSceneNode-1.png index ba53a28869ffb94543873ad00d0dfef2d9ed2dd3..e7a899355edc3c0fe026763f65bd1dbbdf7dc746 100644 GIT binary patch literal 34251 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 diff --git a/tests/media/Burning's Video-testTerrainMesh.png b/tests/media/Burning's Video-testTerrainMesh.png index 53d0aa56cc02de87540a5103abe53c771c1edce5..ffbc74c6cfb9a5bebe48021368ce4e00dbae6ff9 100644 GIT binary patch literal 29522 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

3w$EWXQ9gan&5^~# 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 bbKU<1YuIYlPBsp+00000NkvXXu0mjfRmuCh diff --git a/tests/media/Burning's Video-textureMatrix.png b/tests/media/Burning's Video-textureMatrix.png new file mode 100644 index 0000000000000000000000000000000000000000..26afc9e7eaee8ef1c5f81ca801acaee4151cc9b8 GIT binary patch literal 15212 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 literal 0 HcmV?d00001 diff --git a/tests/media/Burning's Video-textureRenderStates.png b/tests/media/Burning's Video-textureRenderStates.png index 98282fa1ab04f5f9a038f4c1b9563b53c9c4f4fd..92c29fc74ddb2576ef82b5f3fa16c0af51d1528d 100644 GIT binary patch literal 27349 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Μ?bU&9qP_9GbG! zDsTDawGijXS1W?Y9^-jfe>`}HgsyWEwR9D9<^lxyS?|ecys;3DL2|d(w$eCf=NdrX zXGfB)Z=LxVO|8GlkBEjDSJs9g`KRX{#tUye z&se%IBN^HVj#M&F^TxlP%WF+)eyg~=={x3DRJ(fP!E=nX|J$0y!`>#<=Y%P#OPQAy zbs8AN>qN2hdq2}vae^oD>L7J z!a05c?L$gqmZub&@_f|o>m~xT`rog@OFSnC*ShkHZ~om`rI4MD^G##pxnyAYC2hOQjY}IQG}21sw`qm2=T%I9yKIa z5)m`#tQVttZQuna{4>aR6ySc3`+VtbqM;&&g|#f#_bCgO*J*w@X&xHX8`&j{f=njr zNDt>Bl!yl^L$9vLzbWdtTzWbsn_hB!iH+bzk`XcAs-s-+uJWUPr-e9q>udk?=Gm~F$Sk>&#n8ff_ zzDA7eL~iJL&ADqsXvn6Uyv8o)1yItaVA0kmy>RMI9`du*c_vbq>JiD>eN8!Xd?iV_GF%o z2XqE*XKgQ&@j2hYHdpki)7rDSi%>E31X&BwgoLx7PZy_Nt75Z7mhLPUCZ30VA(`yR zVgE(Yn(sTbETfIL^DlFa>qT6NO19IskP82%aTxSq2Oy>1~o8j`gstCGfe4kp&Yj32@tnOY;5CIU%#1zqkWBkZ)$M8Emce` z16BA0sdOsKNVQ|K`X`m|Px`0t9BhEA@!D z39SjUgtXVbo0`HFe8nU^9!a>B^F}B3+uup#%$lu|Miq8_*5>xLv&Q4?b!vZXCPaBY z6|IJpqhWYdoVa3zk(O3Q-EyUpW7AAK)*9^PtHqV5vymk&!k?!qBkU(S+`7gXP{w9K z_0CZ`SBhh1e(PI`pgL8)8yPk+^0)K}$kEOXzU;KW=!~=H+8a?9#gBO|pTiQvy8ijf zL%D?X%iU3T{X)K2uTyIB7(LPqq84a49W7qb=8ysMhRM06XWPUE&3pMKlsxbXKt0#S zrb*iX`Twu!W9L73=Z01_jIeR7Sri9UGxV--jS>dY`<6o^b*L;C%z&FL1ob!`#!Zdu zB^p}Ej?y-uNdZM}W|LuE3%j$`K2gQr-Nwsl+-;N3_89NddZHe}CEQWkCHEP2 zPROa>)s(IuNpX;bjI8?Uy~4)<*S?qPb_=-yTKEo>)oZpE_7dDmSsJEO`^O*Q@kfYKdns8z&PS}itG&88-OWOj z3Qi$+zjA^n-zK&1v^S5p2}_h3+S(0w{8o`4GObZ-y+uERy6Eye7a1~PFUOb7y!u+Z ztX}Q-tovhQ#D)j_Q)AOO&%wCjBqXIPF_yC&!)@~JSukh$G=nL&9~{~FBDm;2FdwRJ zpZX1@x(XL7<>8e@L3TFAa%-ntf1%(*Kp=#2JOU*)ubpW;$G=ywExr7JHp5uQe zgyP0)0`RR#2-dQP2IuB}Sh+e0eZ^DT*op9)`BAF{8qXRQP z7}>X|RP$Wuo@wD$#Mfs=77**FpJzWX%a0rWXQ}v%DOH%UGpkyhXCIfRglDkknL0?- zxV_d&BS8MraF#f(umSDORiWzq9_BFKE)U({f*8_H;^KC%xP%@Y_WfgQcw5E_7iw;o zMq)4Bz9}JcNt5iqkgI+{2l>ut@K@I(Mek;6r$^~`r;WEFZMQ2;yl)MZcrQ_>lDpH7|m>pKl@?$CX7NeSwD-GS{#=1$fr`W=F!O%bf9c@%8Zsn(m5n5eiA z{2AnJf}n14=FWiCSB<-u+D|7IkQC<^Uzt%UoKKp(70}Oy>QC!7g4mefTI3h%(jlw>J$GrROETdiHmX zZ#{qeXe)yEEZZe-GK;2*>0%5^IJl{%ez@#8-yoYAOhqiVb^sz;8)`vvidwx zKJ=$FF6JUB&9>!aLQH4Nw@YMd9_nT~S%bkKXV-6i98YW6$ebmfcZF_B$8SLdE=GOR zC70OLul5MX>)slLR8VM3#rCGR629xb&shH0rT!rF7uFb#=U0_Fw|V>w;NM)@ta-uv zkXO?CTQEMgGohyR|)R-*JhHgpX>^#awchc;fSO*+H<5 zX?RbKJy(g!0t0c3r6zko_^TcoU8Vnyi_}r1GuC!SQ6~;8&UOmL7L(gNz@kG8ZA^1i i?f6qlfbH5rd~QM;%Zwc20%H*^;GWTa!$y7Qr~d<&ccgy+ diff --git a/tests/media/Burning's Video-transparentAddColor.png b/tests/media/Burning's Video-transparentAddColor.png index 87261e59dcc7dd75e2f719782392ceafb0d2ae41..59374484678b8272e48f30ec3aa22b3dc0a86455 100644 GIT binary patch literal 29747 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
2PBomS4yXRk2wDQYRYPV$gS1RI` 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 literal 30309 zcmXt9c_5SjAAcOxLfMd1Vn(!b&61;qm~y8%%3LAyWjRM~R;fmE<=7C_x5+gMGq;jV z4BwQAIYKPtN-W3t`RDh?^E`il-p~7a9q-rsNwl@Oa!BO32mk`wWn=Od9*laIb*oA+hfVqbQCVkMIxUdd+LOS}Ad6`T%%M|XrjFeN*oSym2~ za851KlIGwb@Qy`3mPjmS^s)dWG;fQ)zCI&Bun9jv3@#|Db*-fZT80&Pjc?^|u5!a2 zj-=DGNtu|LeAcf;bmmo090>#nLm;^QKxr3?L?Yoj68s*rNdL?Lovh|?PvvZF<%5#f zXh(pNQ5F`z5iA^0;Ip%Wx{4HPCz1(*H`N|INHlYRKmp)p?=groo=zXrfjQ>E9yqn} zWqt4qRpY;%i}M<<0D@2>gXPEqPOXAR$&-Wfsf}|X;mXD&OcLcv9q9&uESp>15CdQy zZJOT7;f5(*y%hIby^-}Uzc~t?@aa2^ki^o43%g$o`A5K(w22fFtUoFh{k;n?~62TXZeTb1~fyB0Fi6fb$!CZ&}%z1ou!xBG} zl0YY^hlN7~h;(Ua1Uit$sAvEH0mN?fvjb3NLbx~)3Md`cL4$Z0i^UX57A9(m8B78} zV%2jgik|4@!rg5iaI@6%2-xX|Zpw&wcpy!H*ob&)CO{@-93lT9QFjHa4 zM~~DW0LDr$le^^&}Mt}tc*%-n9 zSg^KGHHY-cS~OZl!87@N+sxeIjVHu!sO;l)!`LDmMBw{kJ(DU`eMD}qA-hKp@`Ch6 z6OB%&7fPSQdexWaQHEqq$WUVkri|QvVto!ZlRaGPe=Gv>ViA8BdBkIf8NYc}u$-Rl zC$~=OM2P{BFP-r$S%Jugp4j<3v)Nch>F_?6TqpiUjD!bmI_ow!;$oqhavG>l$gI7+ zhAm>G6k3fv0h4|KLefVDlTm0^O`(%cJXwBXu^xf`8eK^RD!;5W1F(g%`c6T zJpfU7o7ZamQzL%kfKt~~;oEy83dK}O{xHx%j=aUP8bv3Wtq|*RF;cxQReC;`xAVJ4 zM{f6&;1QO1TIOYAKN}X^Ug-=yNeYJbsyhn-1v?g@JgAv0LsBu$%nVJ+JfbuRyRUfl z2K$ z4=5BNVxsAfg*%+uF+W21b#Wfxqimc^!dj#Y60Kw*mKg9E7246CiKbdtqKI*fgK-gS!noLlp)TN{$1+3wQp6FCK<~0N@YgEFn3$ zAQ?4doDa_uFwe=x47!x!D@?5fKKngho{A`^($>m_A(|cKv}!5Oq4kpx@ZH4q`2j`H zDQIX9>+1LPp8z6dYBm6p#uZ0cz>A7%QLe`Z~tG$Phrmjpx|*{d-1WZ4Szh1rHXMg6bKSUm(x=b zR))PnK%hcLDOPIo1(c|9zlA-7y(Em3l#mpPAWH<#UO>V=WB3UwPFb*O zBwz#<6fLR1;thmgb){E@`(9wB4mp2oSXYbQ^A_Qzw|` z&-tBjR|u*}&@I0-*;BfL zF6i1ZG6)QTkn9H}hso2@f=1{fTVERF8XS`Zl|U*!C4C+CTcBy9jg{0hEbjw;#|2pA zutxw`@w!5{?P4&lJQ)=vIboFnyIuOXEl(BZ)YK!DIP%Pi^iA>AvgmAa%Pb$on`|0dW7ZYR|y+SYXpX9sfSPsj?!F|ng@BKqj;yw9xf<_67 zf{0W@l}y;ob(eyt6f_I~zhgbCXU_!y3T?Qe1_^!0=g7-<7=Y$rGAVZ45{`aA(%P*% zv2UQ|Boo2BO}k7iMWj;p%SL|;LN zKLM2IVv)!oNw^$&;mK@>bNfEeBam=$aq+36As<$C6W_SihNWmfB7N)E>$uVxg1*h^ zu!7w~CrLr(97}u-ce+C0piJk-WI7V-k5_ZWSFBBUA9Z-VoV0?lZwdm+>C?4BFyPl#3TbhfQaCk0 zz2sP~rveM$6qRx#-PCh_NV2hzl)w6^%}egBar2xzLp)Ggn*bU!Tsw#rt*-BhG!}-P zatY@FjOF3n208}fL7{2${3Wv^=(72vH!r)<9FjEc&`MFBZS^%~J&w*6YE%h?XoK&< z#S^x;3aSwxC=r}42nJuW`W@VbrzH+Zt_)yJl?2K41IjSfnC8)1|EtmpmgOX9a9}g9 zz$t3BtM&qNF0z1RkB6l9l@}OV{TE)KB3wMze-L0I@k2r3xUr}MKv7>`+wBKnx08=3 z<}g)Uub2^Q@p3!5COg>kBgj*ksCPa4_&7sJtNW z9Wl{1jJ9z`hm}v?{n()S*bLv(HhL0%w(w2R`gkIF#MMC&Wk6Q-u#w?Sii43OhIw(u zzn4KgO{9sDv_;(+7->1mN)YE6_cpHRGP+qu=j!2f(hPQ6V|O!s6BI*}K=22N22)2M4%gw+A74mNhO|V1o_G5+hHj{cJvtiM#v%fD zhji2j${S&@--W>6e^I6hecFk(4)28^*=JyEM+mGfu`bXVaH+U%9D^#DXt9^X6#MzA zLCKWe*~;CFWBI1+eynrBcud`hm&1JXscj)NpoB{oyz5mC)VZv)hgD>IswrxDnuCsh zcDO5pP0t_%o&-YBTk1{s zKiP8-rhe+#jf&=&FQr0IK>z|%wSou=g0CfvjNYc45G*dG9ho_HBa&R@8XO;-P};!O z??aksb`#K=9wpQPgPCn$cV$I6{Z(7A94!A_Pz&evV#cwt(VlaSC+!s5v>(leL?5ws z5CRF0)K(A-^m+D@B!JXMl1lY;xg_GyWN& z?$KO-{nr={1KV}L@ieDpzN&@cc;W4<+Lh1yl;jUU4x6zaq>VlS{CusBHFsbr#ZsRV zd@Cj{0{~;Iq3XF2PhEkYpuft^s(H$i-k+2UM1Hu znvL3jE;fAa0Z;PzCt)m>^+5qaHg>U=9cqMBOs0i{mA*E)&B z#={C38&=T0@dmY!Xjd!np7xPnef8F@9#_|@Ox z1@>;aiR4S2e%kIv$Q-uB1L~?X%BIoh|i8md4mek$f+WnIKma^X$f03s{_cX)3)ddz0GgqYG zUUD$1*_m`MHI0WWCYTnYp%+e42%Z^;%P^(!rH9NG`Y8FCz%9V)|o9)@w^8Y zU=b0QKVq}buJ^~mFkbtEkfIFObY#nwceVcVKqn?)%5ax&7<2C;Z1az)SvotaEUf2X zIy3{?$Nws${ zHCDO>fqxtUfcxwGe!te{W&uFLH84!xc3uyVn1L#Hq=%^tG|5akpy){zq<(pI0uXo56=( zP?#=gL1c;02aT)gg z4(FwJX)!&3qkJ%nKyeehoDSUR2F}g5e!YIZq7?JZMDe!Tf$;XD zsaT78Hx0OjxAf*a{{9r=T{G@RsCYUas{tdXjU2g`ST|5QOo9Mpvl|IideQ`;0)zJ3 z__7oqUhks0EX&P(O3`3&yysbUY!ML2KJtKo!gb+Lq_|oeRSLeP+|*%W4GGQ{f}~9| z#^Y``KS4bGqBCG5k-g`Wl3&p1?BSJ|TE{-Z8xR@_F@6$cd=K=hs@1?gIyNW7Wzd_RR^$IQtRP)Z~xE8n0o|vh;{M58A^BnGP zz7Q}_&UTCDtd~U=JKaFHPpy1E8o0C(o!eHWr1EGSYf06*>l5%J`6C9%U#=E?&CYGi za|X21L5g=D2{j34s7`n#W9IsgO{khy4B}g&=Qu+jx%J)qyy4FC1REX8<=(cL#cYn1 z^rBzse8c#j03*yeD|prh5Iwvu_FfYyJ0tqkOy9SCJET!-6)Sp?B=PJfT;ecHVkUN; z#)Gk}=ybQdlKp!m{lZ9p5@-sq%f)1v4ZN5fvm)gjQ-2ckiI|=H}VXi<#Sd2mpIv23Y1>l z$9!?#Db3J+0&!XE8C*(PkspC-jcNAgiwGYYq!RbK$vNSl+TS<8c3CZZx{mobxUqSt zACm;8di?&9gk%yysZdWwTKU)z(MPtA3O{;9xLWufKkjHcT?+VmyCSPS46l~QcjVND z;UeSXuae)gJufelK%Se+t}=w=)pDBo54bvO~h}bO-rzcyne<8{n^2JGnazG+$ z?91>`qHsiXG@jP7;_PiqLMt`rjK^+uuQZL1$0w*cy9kSiUg1aK4e$}M!(Z59O423N zo%N|JW!4s2?zf931cUxJiuv|PW$nxJHWsd6QA)e}XUGACxKhXT8f^)PV9M%9<)C&E0I{Zn_ik}QLaC(F(v$?!l!>f(Dtg$z48;&duA0ih^5hgtg`bpI<((~)ffHOV|Md7 z{t33sOz0h^9}V5HuV6+FprZV@6ep3H5A2A};%|VEDf- z4*Oh1q3ixvr83e#=hj90XOT_MNSwMT2YDBaDx6omfz(Idsbn}~XCw?&e&ym{_0me| zjxZ6Oz511?2m>ZS8L^4y;{%*p$b4$AY0SV{#u$hO&14;^~cS|fKy;s7C&1)c| zu51ye?y9+BQzi!QK&Z}YY5w)X{kX2D<2|%6a5LbSt%Yej_5@I>u5`u}{X_QY1InJW zC&~!;&W4^gyCgO^pXWR>7O=IpKG?eRujc4j0D-pE7cQ;dhAB>}3j>(T+NsMA5RA(- z;-PoX`X*An{zlk81nTTlG_H&1&Uwv+jWc4ev=m&B#HPmUvRJ7tIDp^=lP= zdxqn!rbP7~pnI+_uj;07C0T9OBpKgf{l5F;oCeL;Ysnx**t_(dr);R_<$k>n&onL4 zm*oI(1%6*beMyD3Pr?;pMJ)y4x)T!Ky}Rw0y`d}COKBhcV2k@R-Ot|RBQV5A@75o^ z-Y0T0hImWkRH?S)z^f`EP%I`3r|)y`0ZOu{^aV9@YLA`E=~2W6{)+f@;1@?4C!IoS zU@t^TmS#yfAI8lbs%;((U@#bgIhH;XqpX~_N+;{lb6VeOcbazJ(7ztt_ZA^f6YfW>5EF`}K_C#sCR0uk z<|(cXs^H5g9@8h1y_zyBQ-9^@p8Jfi!++zuZdC4WSHdRcdpjfOwoja_)OZ6d)Jyhe z6$!U~KK7tEnw|}U8j+s=`7h?yKBafWt7X^M_hZ~L(lt$u@M;Ui75j?^=d;LI8s8nY1z4+ep>B@pq`kexwfOn!TWx1z;^)b8qO(PY&t=L{l^Qx#xV$;qeU6fT8Tw6y9 zGLRK?O`F(hh5Rq^XLpVUSC&$tk>kvXA`4`cxmP%sQQ4C=q%r4RzWmPe8iz4<9HxG< zXuit*c_xG7PcsKBRTPMlMzd|q)l1KR1nAca8WcS_;JLjrA24S(1$lVrzcj@;y1e46 z1*S{ek%U4*a0&PYzBF=aZya8sou~vJxa8M5vb?(!zcU^iU+W)8qmMxl+YVP4{5IHP z@E)syCQ!_7i=N!ahZ8Kd!*zTdV3?)2p-S+|biY>EW4+g!Cg_GBg?r>`-bTJkm(_NO z`K^sqQjVKF_7D($whf&uuvp@iDJ7m^)99jJ60PFC8L>w-0ogTD$Re)tzjLUo;mCm> z*@}~Ur-$c(uPrq*;_4T3x(8UGx7jm?7rR(nEw1bS9NwNJ9FOO(Zv~BS&LC2`b|7kI z3w-Y4y$_Gax@OaFv#ey(`xl2Kv^#w^ujfHfK3x^+@? zcY7r^#oWs3PwtLq0oQkiCA-J!nV@P}S!NmxR&F7%xJaPw3HS#GkQWR4ZYlR)dupV6 zEp+Dot>aa}ldU_et=SlK7Z#s?pmlqiQs#bN1!LKe20kro@1OiO^i*vrHGtDG`};D> zZOiVn)m&Y6RK3f3?A2Ndn)HU<)!xk8!}!41ag8=5`X9&mjrB&u?OE~o&BoTPy_u5t zcvKn3FU6PtYIM_ zv-;zoTv~Vk7UV+}R03j03$Ien?ME);h$jAN@s?+?_6C1;bl9o)QbwA{I-ie6(*JnJt=}Ug zPwD#6a=Nwoqcr*}#vT=L7Z%tYM||Qk!bbR3HdeUpH1NJMc58Ee-MiJrnO__DY-q4Q z(oLf==$bQg1(m|hC$MG%a$=bPl7LiCcx(K+68=-_j_lNiZU;h+cj>hL2kC-7)A#x( z1({^}`mjE9VM`82&y>9oB&v;M_Md?@P$(v7VN~JO2)$}{a6X-lJ&PurjH}bTWPBX| z7;f+INaTSY)=Vzm26>WDGmJUk;^v-^T2UW*%Bcu1a&&ci!Ye;9z)cGar`Ynf{c*?I zheW7vA`12@(YnhN1#*68xR!h!?w=G*05p3)jQW+SjzkM3z-~8?4?_La3Q_xEGVt0~259!!-N9U5j96pV4yyez&ETMN#NfrI~*_5pdmUW4(FX{6L%wf3cxEFu8p!2Y*z{|#4eJkz= zyq!fQSKNa21xsARH`ng0GDk0tD5^cA*cA4?CdF(H!d})sMEj{LwWB&p8bAk$U+z8Y z`uEX5f5QCgM(4{d)Lt|K8hLW?K_sP;Y8W4P_1%cy)3#Z=?n67bpZxYP*jM&7-mV}c z!E6E$j^$V%0;RtJC>M}g)dw`a)^9D^{0Vuh6k_S+E!bKvGO;r^WT=lso}~))+c*Ep z!F1{NweQxz=vgs+j*om&U`Kk)w3I@~~r5MGg-u#O9~95r^87TxsPG?wa+9z-rm)oo!e+2uhWBL3#TF zCEHWa#(HEg5<{c@CEPUq|1JRTK|D%M98f1xX*p8H?uXAcs zSIrOz+CTV1IFU1-G?bUS8F%8fAM3p_MNb5j2D-Q05}Av=`ui83e*iWXa2>4*lT%QQ zF3XBI8!}7BT+)s;U?1l!?Ev&k!pHwW(UGm=&t`SSp`qe}ci*j|EUvkC$xi8B%h4!& zeed#zzy0H4C!ECMtM=_@EM7gKf9~+U?`~c7jsowx_9Ld3Vd2S0R2c1cXj){sZz2HBe=k#lk^Ys(}Ojz0}nx$nO>JOGJRK0>DVY;HGu^DSsai;8D z63~v}Jmw_bOjo69%zcibDH3AOBp!T5en491O9;5P{2A_wENF0Ca`sn41u*g&1NVS% zm#?u0oy|15mG;7f%(Vx(wmuRJ=R;;zm@ ztd%Z&3NF~??ykjeuZXwGb60f>(luZH=fVc`u>g?JzH7e+&3aqJh_gAx5dk&+L8GJidgRWOcD)+5Syw{(> z(LpYQUq;H&rQ!J-7z=a4tw6nGudO>y`2B6U$Pv(r%j%taxjvHwwiePv`H;A)AAA$DvHhiCt&p@W{6d4S>VO!@=ym{mEgPE#fIB1Y^>!awb&bN zo-@AVcU$X4CUYvsEz)_s3(zE~%jF4&Cb092ZZ}{Xbq1$$?$e*(l<8o@t18F+2)R*a z3;Tbny3EB5oxFy&p!wO5VBW1G>#;sCu_#pUYVh8hwHs~9PLig7J(HKqre!Z+IkbT5 zzR%{R+eHuqMbR{WY-U5=iHC!Z(Y?PdqEV>~4fh)sDZAtcTf=)h4Ut*zWPEy=m)rGh zfa}kg8^4;Trw=8Z*0a8snc+Tm%DA0iBP@l3=%xId^*f?T$Y?Vth5Hm3ZDJI>&+VN5 z^1MJ!Vu!c;x6q(Ea#+mZhno{l&mBtLo5;HhHOf~^Wi*)wIO9@<|G+Xp)oUrl@z(g( z@g-dLU?WpoIo`|H3= z)MFLlv)ySJZvMu*t?7ofo=`;f*<70&FHi18K6iwMD#u&kFBSE# zHIBZLR#^Y4bBq_8cebEUlBB4MLMJ)>?Ell4gSqj8&qWH3{E9?bsr6_^Zizu$D+hmU zb7e?rIi0t}isvF$Y>ofs7DLfN*IjXQi=~w(s4OW6>F)<$yq7HLdjQOPoQK%ITe-Us zFG?g5m8kB6185tsS~j3Lel$JfeP`&iYkAIjQycc4%ES_lePi|Z`?K*xR2xZxNw|mWs*=8PFA?x=H$N6rZBK6XLN6Cc?EhA=* z`%2ZfL7yT+0oHR~>49RV+15fhhY?s6e!JN%plPkjVd(tn$%KA9Tvp)0 zTe?Mi-wP_88dvbTBDg?BNnW@@f6u**SK@9KB_yMXcdbBwV+@ka=8`4^0G8QaR;(d7 zWvZz}w&u+Tqws10qJ)NH8)27B(_>az+%4d|t&6Z8g#yp_k4!2ZtLVm< zM9Qv4{=zKc579pgTi^EejV-Ug-OFsuF{al&DKtFX{yZpLbQy72=lJ=-m~XPHJESJs z)DB3OZ=L0|8k4~XB6jf{4d8>w7a=tj#PKG##)UIk5gLq+tyhw-+&Qf4a-lVk!c z2hCdUzyo5h6b+w{kmoV=l!K1|cJtA*%qeeQHa%PUhZ2MkjasDWR?UJ-rbA zSTFvxBQ9H-HnLUoc@Ud!hTdVra*>6L@Bg$VtYcoW**hhhfgx*@L~>wkII=r~$}34I5#v;|RGvX0V)+F-Q*4Q5=>>__Z~?ff{@x z-^!Pgc5o#eZaxYTcJTtISFFufwho-3*66*a461_>kEXqG%fVZMkHKwY=e>uVuZSZT zXwSSfz3`QkU|5tvAvF{0j8{8ST3#PXU_ZW+PoU^sBmJ;-gL)pG)Qe7kSp>P;u16Ir zD$EFh-uSC`W#VYkzk@W3-gc|}%kuHolQ1awEr{W``b(Y}3}`+AEA|h%`5%*V_S*it z(c-F(*$M*fB_xMk{1nya?xOp+qll5vhG%`zZd%?|#OLNOh%fG_6Fj8TFwywv30K>9 z$;s4=pvJHOH4C*oBik2I>7`th{Hm^vjv;epb!*gWFn4R=3{{p%kbSLQMn3?&1zXO? zK1*G3X+6oSbdP5mM_GZI*YWeygG;*~dMX(w1fdzE!aWf}B7$KVtCy0$VMW8QoTiNi zTt^ z(DSgUg!pLRq`~@^%$_Klq2Yp1SJ9afnlayOrwHS5te} z5C6>|!2j7(s7pCPeINFr3C99YqWA1PSb?mprF8y!>Ki?iwFDos;^sosA@N&>aZj-U z;}!1lLrTKZ<<-loHdN_qhl5YsYK*MZqACJ3rHPzPD@;X31 z3lV_iXk8^w1=;PHLm0+me`rtHDUZ1FAmDFH;6z8~4ZjlY$)I@GfMX!~`E<`x+S*h^ z4Yo4pgd}|o989Bl8Pe!m{P$K~5p_G;D|xxb|DZMR=5sd~)2>HY=NybD2jhGuP0>Yz zonL(n`f9A?8J2M(PY<%IURXH66yEvJrDq0vA6Sx*`F0F!sP*$RZK-s00$Gl0&9O@$DU{&28!N0RDh(-jd6v}dSP{q0a$r(uAi{(^T=X2(6k#P{wj!& zT3;Rl$8_k;=&p8jl!wZ${axUL>75j&*Tqs=7 zlGjniBDXs90$ThR=q;ycsn`>ugNXh+|Ax&1ewV4B%YuyM7awlB4EoB6)n-nD;8_aI z13TZYrvF~mFwF6{)*BDtRT}bzqi9sK_iDa19)8~S?-M|#=T7?nb>c9V#7}w&4@N!t z%!#YV(`d5*m|+9U?~?H^AaHjO>3a2h(3#&j+9Hu0qQI zh^GxA2tWY6q{j7kWz6f7SA*GABe%bXxx!FwDXaD;C(d6!3TY$SdQzM!KR13vS3VeV zcb_?}q*s4IukT6_c~eF9TET}{&EQ_|3UU#6)bCRpbP$5qU}zNkuC3Y zX)U`#@wJuJR-DVA!~7`_RS9ha7eH4I4(3D?8HhzoEqp-kXVFAeIH|+-&{fLl1b>UM z`Y--Og$dp6Z}IEKQa|ED@oJEfgZ4?iQ%YTtqr7JiF8(TY?HLF=*XYmttZ^Vdn(rB# zal&(~kpzaC{r+S4ul4pDYd#cZ;IzM3THsAN{?jafivQLyg%5>&>I-9|4u&Rk8fNlS zr_9W=sddb!naJ>utM4ChC;!bBN+Z(gTEFeWAyh|K@#2dvr5B2Ud1vFcb{5T; zag_UgIg(a_h{OJV6Go*5R{n=y=F2LuAo&!5AT?3DvNcc0M9ClTTS_li^@}b*spa~l zh_RZ8$xBLCzKxs)`M~C;jPq}tv0GKOTyW$-Z$T>P)~CPOr)7I@1oNJd7z_=Xc6ip< zmdoj0@6S!^tP6|cD#`#8Lg{AZ~G;E56M=k*XJnTxBv3K-9XE02)0b zcWEfKL1sN(P6&?)^Qs@dzlnRPlkrjjs7E-btlGW*GgmpJC}hkv_{vRWohW z_7V0bi*FYK&5)XKtepBLkE}UtOa9n&ervJkE~%T<$C31aoPMZ3X*hVY&-Bvdsoh+g|Ig`KxPF zh;rq6IcfPEr=9uOz2qkJ{^Us_;PJxjW;>qLJ}ivpGwtCPJ)>GL-3&@bK>Zv%_(5 zkG?mR4_A5|5WH_n%c*ZTp`dWLbYM8+)z%$(udh*Tmuw77DJG@t;Df|3GR=&=5ph-; z2Ah_0%<^s!(dU(JPFBgQ46?bk9X!yGFZa2HzwQIApQB7rPR>dR;w~m}1yF<_@@E zXw^(l@mh5O@|7B;uMVmrP2dT?PftR>yeW8ZcApO2KI9lBQE$`Jns4vV z%5;ZJ+=}pg?Zy~42D#}Qu&Qk(%(5a0*m6#t zS-fkHvwiQN_t9U&$7^p-MC+PI~)DcK-YjL@SeblJk!Njjk=Ag=^-$+(10(et*j z)Ur2AI2Q5=asO8*7;SnSP!Yq4y0e{u*k7ryE@!mFUZ7A1q?KslZWeBVCAXjky=T+J z5O({aU*2bPhF&!gZwl|bx4|&vcXc1~Jtj1$aiXaDx$K}O!>DDn_3NEqTNSQhp%$~j zF+xz|{gZ5LnTkY8#dNPmcaFKk(sd>`7mkb4%6VWH866volKZYWQp2gbrF2PuFbw(Z z7@>aLZO*~cN%7rR3-iISELdP5BkEaOhDBV=t{Q4)SQl7lGE;9Xg}Ihmw0Ae`4YB8U z7nsrEznfB zgC2RLSmA`456(6$cdLyqKG3q0fKwj-Bc}4c>E109ty@NO`YHSxkhFUD<;)PLdrvh* zU*Dngr@V@-pPnM~5NQ&awxF8e#nvPzK`V&<{?{&zUBA5}H$?K+%LFnM1VZp$$uCS) zdWRpTypT>)ns(V-cIryUSd{#z(tKJ%ZKCLLCn4UhZsRQy1lplAG=|2Mq0u|g8AqjO zn*-+Y>Zi;_0O@0;EaSiJJW3g*c39VZX@SpSOz8)5)ZV?`2`ga!8SOETRF}2uy=tiz z3wv!E0sHVe-U|nh4kTdnb_rPNI|qoFT7ubCR`sjs+IQlW3hoYB2n#}L!kDa=-KAK4%)3=}~cLPMI%1hrOa-5_c2lR zh4~=H}{>{8H-YM-SYYa_4_z_JYho>Ki5F{KtFx0+s$) z22wu)pisI`OV-(=m%l(J{uS?V%nnO_OJn$RLSMZQLiLsj-lRQC3}9^i`GTmXRLuKJ zpY3#+H5>%cW__+p!Lq+U^(U*mwZkqMMxA7bjn+OP^{8fHZmztrOPBk%CsqY9`=7l^`S;GkAb*9gEh<5^x3CC4dD!T%c{VSVce$A4 zB?dji5!u@L)vRSIGgFGY+YT}N8xcePD8KVNUhE!cK8MLE4`tA(^#rqVy0XIuPAd!T21#6%kHA-Y0oGf#Wy7 z6z+7Q5C6DpsXkxZGoM_VQ)OVMNRp6)sAI76dav_WBMXq3E15MiNG^#S@nOjOdbV+2 z1~Jp}4xl5XI1G zxl-g!;wc(V^O`AdFz*4MKfXIV&PEB1BXlagV#$MIq{F^E;cm6iHKI-%-f(Ko-nKvW$LFV5`42@4O}uVaaj7)m zetJvn)eWrZDj7a&cvzOwMt3||rO-v_+KzSA2&aYbIYc_)M)rlLE6JI_>!P|(}V ztR9GY|8Ugf2X{lni7x`q9sAO`R&4U&BE}|=vw+%LVi$Z@Z;0uAiu8@Mt9|bQPm3On9{TGtR zu+ueeqp{=i5QK^+(Z@3aUfK4~`t5g=3?W$8pD$J_GvZ9|rC8U&jGRmQdWF;<^+Q4N z`t5-7y{*C+lx0_G?x`#Wqr|f}@Ass9dXf1?wA+FdNeB; zFR}Tew0`3@T+MCHzdC95UA3VDpL;iZlWB19bPbu=(4=}+)yt`NK|Fq=JJ^Lg@P3WY zcQ*I!P>$dEuypsvfZxLW8zp#Mbi~CkbeNDNBJwQSl!KN+aTTgA+ zsqCuqe8wWF$!x5_Y5w2!9o>rAYZp@p@lEnuW6tyZh6=uZ#S6Y}+!y>_CiBTP@$oB` zz`xJt9YM_4NX4YBg~I`2iI4;(#98pG+rS+AN};LC{2iZO?vBiUAitX(-Q3&^PJ5NF zbTQ?_#l3j#q+jPG4z|5H{RAv<%)I=%=NV30yM9CCg?1}KUP{r)M1oVA?Ug>$5U0!Y zFqbYZt^)E(^1+YL+zZ%W?y2Ou}A$Ne1rS$&Rcgc2*%SMaqpCle`%@ZZRN zuR&K~sQUr!a#vIsDp;M{DUyiL8B%*X`22I#jZY!0382x68B)3uuwH`59i$(NE@&ur~mk z`%__V2{&r@ntau5A12F60k3X~S&SUrz&i0(2U04s2lq37p*^p7r8rcQZHHbe!& zk7Tze=46asoYu0eVu#`Ro}UsX0$`pV3FrFe64}=9o{xe(^!J%cuU9@B)F;9$EevID zWJ+9JJl+56VhHTX$xgff?*bGEA2zz8WM>KIu?zR-5Pi#Kn;%_~NYn&6^&T`HwpO)o z?*SJzrs8#Y1bE^tZ40qBvi50@2JFRNNdUVmC+Amdcn9};d0uzxC!L*HMT#l&adNxS z-a%ZR-v-ZUC$0qmvstIqu+)Ifv zuTkpS4cCrqi@Hc==9N7z*`p#?$?kH^$|hu7dxfuSTx4e_v?*d$aenB{8*#5nAff6AC#-dkv-EJ<7QNE!aw=yJ`w&di$e5lPa78^l*}igk(l`&#~8jo2uMcAU8;RKnpvB6F{wD6s4}Z`AvxA z%@3B>+IAaYM$XOoVdo9v7fZG~t(5fEez=-{#GqNO(|cXf08S`TTq9_l1u9dJJnEBL zbo^~iRmfU3+|0#8P&-uQSE>=^r+B+5GS%SOXmv}nV2Q)) z82EKx)`8L&LdP%8##-MA<)8SEE{FOVLph6GbUOc$UR(%-AMRbX0sKzJPH*_NUR;Wf zJyU6ueBtgA!LAkGsM!;lg-Qj2R{|B3+8+x^Ev!Bk!ap-b>QLKKq}675`G{q3SU~-J zt(&EAo@oU$|DG5;P>n8unXcH`8N>n}iIMr7H;Dtrk(UyZP;ojX>Xvsi`UfLhc0KUtCs`b?_ke5tJDLx*(|C9{0FKjBKFbFJ_74xQy#}g9nIXhYh14VJ zHz*J#J_X^#jJJjRbI{=VBi~sg251or1}s3$d$SD*0irQrmAW-fs3_^4QM6 zfgjDK%2ZXq3b8^Sj+Yb{7d7T}=F~cvhCNxZ!*(i{C?*BJ=U0kjI>MsQ_Zd0=Tuo(8 z0NeRQ`acU*cB&%EJXU8n`gps2~ z9Fl}UsmKSpxCiowe&DZ7bte^J78469avBp}yg{PmfUMeSOK;xwg|ZIReFnj?SILNl zrn0`4Fn$`amQJUAaU#ftc-7q_WaWIfaw+-U+Umsqogz6VFm+|}c<2@9?^GtV|4);TwqrS%OHp73lmc#8ugBIJB3JE3~s z#icA{=NlLpa@=jwY9tY|@XZ8}d@!Exy)>xw72xA%+e02cIXFCtj4wA!@in~fne)@v z5{s`}UpxybEOikO@aFO5E7go=P>?qZO8wSz!_WiH$*sq%ac6Yl_3GgUt#@d6sb1U;S1j-X zthhq?)sGw)NtT!RY2xwvyKBjnOK|}C!5q9?(EBWv6`Tp~4`W+Q>c9=~Kl}RzRn~m8 zG-ZLfL1h)?!{#_t2wmF~L2cMtllc83PYl=eWexE@Huox(qVN1)(z@t$8iacSOriV| z4x!gITL%^^vI(ocF;apjNwm5|36FBol$Hv zeR)cs@uVr67mSwTF9Sf5J9nvm<6U&*MePM4%pUSEn{Z?-QKgbQN9a_RVi)W$c&1bo zkav{>$9`b{GkwnI|Ae2@1gA_;qYwEdi zEU_%FRaQ8FczoG-)Z@k511G3=K9Q9n+d7WlDD31EDUgJ7mnAIkwfkt;ZHY7 z*@t`1A>-{?+QXHwg}HTgEeFeq4H1}A;;nYUEa4jW^>O2Y2te!`{lkr)hehEvP&a{xEZB9886M$^?#Ie+c3~Hka?Ih|@ ztyIfJ@S+I^H5!OWNk`*K$;B(1N*`=23Qpl4{%bz4(m6clP%UZ}q=TlXHDWCW$Ud0y zG&Qh}+x-HClhkX0LSH+WRpO0|kq`WAu}D{Dzrj2$@tldHIk9iGa$VbPi!(Ueu)lWu z8;4k?^t2*+uU;n$!YR8I>5+Zw>3$Le?p3XlMqg#DjYqk1QO(g2Yb{IHbVv@MJ$&0v zS+*x4nigRtJ@nV_J_G9*=qLrEE2h~gk!V*BK(vZFU_u+Zp#LAH44yMk{>x-EX z!vTQQR~v;#Q7DnbGV-5`e_?0y#d0@q<*O=Y?}*-;BAP{Bl2s|hDUceJQpS|IvBlZm z)fCRsIBcR`jsif>f7?)KZLunROwg4hSGqFyUJtLqgDL{EY6c13s%E!uHb~jH1ZQ-# zc@;PLTvX3eY$h_hxrkg7a&|(^8+f!*j!DxsZyGUmT!1W+T};K2MbI87KM$7oa7;=_ zDv^KtC&zE%f2C1Q`q5yW9_5g;XvuM+wkI~Gxv42QAcS)4=P^#6o+e8uUsP|g3jJFn zPlTOr)DpawGYkhhJE7XS_*Y>eUTDNj&Bh|-;aI|M;@)r&xmmN$^jod`hnHJ>qIVp) za@doK#>iAQjCHfVrx^TGBI6DN)KQ0fvt>*EBK_i^+>y2*ROw)^BfaxiI3S!6tKR8r z>QOt*>=q-1k|5N$ja z@Rn0o9#Jz^`l8EUI^IcZl&}H{H$2DOroByle^G-Qlxgf#K)`AZc5i0F?JVqKFKkL# z33FOIe=gL%(E$BJHh2-Yc)C~X;V{|T5F8xlVbXkfCdZq&x3P@3^4%YI-q^6sPrlCZ zH^*BCs{K5CRc;Wz**OAaK`qMiI`_tq7VY*mVi1y5!p%oct(O2Nf0^QaE#nqJAdNDU z`y*>vO=V)!0?m+tLd{>3Wr9QhYokW!^8~| zMva6TOX_v>=~7o5CZ5u?XX-fPS2Ch%>@NK2?R^Rd%w70ZJl6*v$3Nm{a zyB-&3oi7X5M^$j91pcqddp^j4ISFVx&hXwfDjp2pajPNh#`(l*g&myH@t4f7Yncto%SO)~?|^r4sPtFW=T#uWIKn7pjZ5ZzC%r^mv(+-O}_; z_+oeYV^^J6-&WXh{n9=``MkpKnt<)qgfHTvnG`Ny=|QrCD7i+QU>Y>xJKNqt?5n;R zH)L)sBf@Q0XeypwKjv~#t(0GX?8srb(Y!&S_-@L;0S|aEc&|(G#yhZ1jm(>2s zbS3DhzU~4x%J}fuD7PTSH;crqsJDY8q>8;lkDe^lXZX)5b?r|~lvokqtX$jQrBWw5 z2&;&z?i0S$;ayUfbaN^uoD)1`99@S;_mE*fL&`~3@vErYC z?9j>a7`oCI6s5{s%Gq2QeYagq$bA2qsdQOGY2VJy$LB&0T`<*F%B%@Uuu!?V>3maP z?oj>NjZbVGE1|r6^YfzCmQ2E4;al^E;~NDM67CJ|)OpBB2}@(^?7-p^zx(OI#X`25 zYRy?B!{nP&8ca7)HD%L5Td22nGrCH#f`Br!B#dbk03q%m++KuSGBRuQ4n#dDC{tkc z-;=S#E;oqdHhX$B)xyT(#q8 zV!9{`Hg9e#w8lDxSF=o$5;oVGT}pjYSTEMg&)5HMQ0y)a_|Bh~2Zn{X9O#HD$C6W8 z|6QL(@>^Vao~v-}{5ya%hc~LRYRSfo;*dkD+RO`1(9P1=BrLwx;^k1mKLp&akFiqL zH3S1jeWv<4`ic2kyC)~oec!yToJ&yxNp~~7u^6jzzJW=zyU|U}AzXIPZvviZZZ*p! zEJ-i-7}&&wRHA;6`m9A}^EIzi8CFCZjFQVg5bBB`T_l5NHTfRbo_(tC%0F1Y1FQYM zRY^S?m22~*v7d#BN3h_Yn=;hNG6~n{RATUMPv{*fqyN;-bbZT+~ksJ>8sy(F!w}ZPV)7U_%^+-cxt9%Kl|d`;DWy|U*%}xq2IrQ3FY^> z2j{~lZ6NEJxIUswY0kkKLNk2sCIt9q@Y^za^@@yxK74S(@k8pwQ_TeO)Z?hMcO9G$ zEQIyg|7i&O||4!Y_gH4wnDQU3Q!nHqT7*pTl>6%YS zkye)9YcQz~eBDuey(#I0DxEm*0n`l?uTCfaLC*(CRsZso^w=Ss1I>^iU?}Pa`}nv5 zbO-SU%+9vpWy!f?nygDqM0-t`_5@n`+Ljc!k85t(`Io@+CS4-Ji9*C?yv)5%l`vh? z_tXFWox9i!rn}8vo^k?S+m(~@Yx7+omX{`w3 zS>+FJ^Tn3rSb1_-FU2I&%>;SivurL?AwMV;gMHoRvhC9J;wR>^3V-Bi7*-<0Wt;( zf2uw7q8TB99;eD@gBST@4=83tD$xfIew=M2Ipjsn)#yF8+l(f$u7~UoITrN>_Y9Wn zDeNU(0qR`?>WG7F9`I)XNS&QTn1XrAV*=tqF-!K978IOxd{1&@bYRAYCUD$MI8E$* zr1G>z`xW5KUs)D^4(av)OO!@Lty^aC$NHkQ66hNY|Lb*FsdjjwTkckfU7mLd0UbAyL+K!6q)co55(BREeqPX_R5T(1m z?jvBfMxK8^(26839p~bPFC*7%#gP>--7{HH&^I_}xMYA{$))q(>Vr7HXJJJDP=wZi zQx`J(Be!AsMYSj9)G%n-S8;7C`-fWWp#7hSy}_vlDGe955RLaYl@h`Rr*<>^orm1J zR4I#sjOqGqSOFzb2%I!dar_rq;NdzRS$HP_p%QU4H)FTHv=e-AvtUL5PEw4#&sgE<@-e=@z;I$b~oQ4PiWk^z7@J`(@Y!jn^1rEm)_~WpT&V= z>wp-0cRX+6a7y;YPv??S!L|n2^x3%iyz<*TKXf6v#P(f9hkhZxsf6&qJP8$AMCdr2X0EduEk~xLe$&mmkbu zWdAr<(4Ef)WQSu`OCOi-70j;(@a_*4!24&^Uvg}SEF^crh&D7xssgrx%PCg93Ms|E z@#OvPo{rg9(t(`&yn+7S&sEUWG%nw08aTdgqhEYN#m(^lsaIYB+-{G)ty=3Fa(`}Aj^&J^j zrE~<;g0fnQn;KOE549^mQ;d=H;l7p-6%3r@U}=i*b!UY{>zGDGekX#dE*DBfZ;9DJ zz)E6)dTuTKYq$h3!P^WQ3DV^2MChTEa-O`dgOMx05r>03N=vAqxze$FMkHJ$wLb2_nLputC`dkz2RvFm(WM8!ZXcNS0fEmF&GWUy zyqrHOaw2vdFE2a9HW>Ecrt;vZ73cla+6@hjyI|1H!%QAyVE`|BoDR;`HhLe!1F*aut;nK z2rkT{gJ`e(_JPv$xI)Wp{91f(C8!_I+0@!v!m{8*l%Yes2^bX|_RTEy6}pp`3*($4 zXbsu}2IB`t-_l6N$K}v}W%x@`;wr{GDR(Jr#dOZfNYPvCvCaiH&c`jD9JF541}cVL zM792^x&QTZQQAiUe(3PfJ4`s4u$VJJF3J-;=G+uPBH7S>hN_&+G;IyZX5|3}IHoUr zw>H0JJ>x-trCvtUi2}}JwRsGP+3(0*uG|*znRjkvwbxG1?R8xYSk4T(bzj(? zN6tww8TD-uheG5UaTsP!^CB*TqC5%7x`?Y-YErXI7grLS%u#h4UUK(Kggi~M!@`f! zv7*c+JhAG>y zCN(PJ@^}_faWtoi_GMF|Rxyp|FExEopw9)6Uf5=*mokvh1|B+|>M?Vf(M9))*uh~~26$y2cW zgu}t#t6rAZL}%PoV;u*cj%^+VO}e|sqs4X2u(s=jfX9ntuc++9$WBph9o|^co{H=o z6EH6F9cqur0KFqBFj<*QR=^1_b1y9LztJ`2|J^j@#f^Fp=4j$pdI0~dm+qtzBPAq^ zRS;v9V@kv+1mEjl(A9RciWq>e@L+a6vt>K=<mNw$-z<&+`PHhi zawK#F+U2}A=30oFbespmwrl3h&9Mg$e58d5ahfmXWgbQ(NPf+_^WMn)lN7~hHcqX~ zIvRv#KtGiMT9`$SC&t^~*tFpQIaw=L<$hnCZt3817$8(g^x2X=F21(OM;E6-RBq_7 zXG3m4BEUIY&2bb8EBL&x_3YqaV>#?%{^BjD;@b)fpe2MAje_NknMFb%=2VRp)H~5b z+>|V!0rNYo7iq28@zc<>G&gIsEmjoV@GQ2)BJw~ojju!_6BM|kqs&t48&MYbRmKYo z=B|4&`yM41ow>epV=2S-E4D zc+msTO5|gPjzT_w&|*-8I>l>X(FkHdn?AE2M?eL|0feM8)x;7%cW3-mvOF>qU5=7a zj+Jshn$CD;a8W1wcxXH*bX$mjDX06&`X+|krie=c5`!du9aqITLx5zrOP{H>W;SV(3=#gE&wJaiG?e3nW z)yvvte31`u%WIQF&+jSg(o;V3XKpf9rYel1hLqyCi)Tv15teB@+e z708-O02`%p#K0b8q_5u(S^$6p^#2_JI?df@36cw3qCP9HkYyeSqqwu5qwGuFY`Dr> zK#*s|Bj0o$D@M)YK^O--Ii>tenlKZ_NOa^e+ z!k%Owh?TTfI;ZJ;U5IizGt+te{cvv&JUE$G7&uj2LfTtSweZOi zQte_EOp;?53Z1D)&3U$%B5mo9zz0zb?a{UYy^q)m34N+(#q1OU!HzdB>1Mg(;1Istl$f5oqR-g z?{}lCQ)>z^2dBpoPf0*7Y$CP;O~u+hHa4bZ4kun!a{Fq0Cg;oz**Xex*^rfk;-9HI z%lS)^WJhQ{O-)3ICh6H?6Wjt=v)!g0r+2^Nco%>X%>Fk7Btrg{j!V5OLMi6m0KlhX zgM%ln!H;a5OVb4ByVY>I|Hgeqq(5Eamr0kCQvW=q7sCNmP#xrdi^0IpqQOhPNk$Sw?bo}>17Tb_AGRCjV5&SPQqVWs%&WY19HRJ9x(Vqe zfs0VYD15@#ay*?MTA{+P;ySItd2F(xB-zK!4PdBR1Foq?Vz3qtnK4U3$Iq6S_uwOe ziGLTu*OiQJ0#xc;N}YrO0q@v9Z}(j7*7hyE1ohEp)wJfPw>G{XN5snQ{o;f$F>Qn} zWxAP$CJygOzrA zdg^Pbc|faaRfMxf#Da~@DqOa}*OFi)dJS?M7k0{yOf4R8e}EIke@6J2dq5+?Ba)9U zO9j;7#)iG2x_UNQ;qx1>8s+W|a%lOoEs&=vzD1r9GAZ9QcdI{Oq%`J6uK$DebPIG! zC4&#`WYUp09C)><{P3OsGET@6tqMwf+OCpS2j}bV#WmH-XB&9Xts+*aju@QjH6TH* zi|&Z-a!VLxJg&oHK{R}PEkTV*_@7xAF3ins2ojp|r0Jrv7{#v%Y3#YSipz<2JOqHLDT*Rl7~I;_L;I)d_sx{BY=Ii`NG!g^EDnS!3 zK9qh`BGuDih6|uQDj_}sqUuILR@{&|--hY`hCWa$%6;{=vtKSnrDH?XOYJvemN(kK zchgE;#CF9c5CFCYq)i4yEZJZ{K1%x-|FAGp->yu1|Ni1)(26Ue=M|O=pti(0f?h?- zvT`!5O-;O-*Aq_FC&7-lxORjLokh9KKU-sa&vLD!uX1R|^0A4mO%nf6nIdl+^P6d9 zvj5hNV41A4p z^doQ9+i3D_w(v!j92&mj>3mrnk&G?Zo_#N~q03L4VQcHjeExoE=Wa?sAcyP`W#jKP zUw}$!z?ZBw`o2nTf{oKWK+6J=rZs!S(oGzu{2ZZalMb9TlmXvTbuC6S+s;rRAVl)# zYZjB2^-j;vFF|x6=cKT6!;<^8VOB}uO)y==_p8`Mh(1*fAD-zTf&`wH8ojFz(x`c# zQBF0xn3a70My6Jvg3rFDDGm?;{JqfdJHpMiW?z3m?1&-rByPsIl7`}wqW3W&)BRVX zF|sMIwg{Yxr><5&YvNPHjF^0%BTve*oD6%m(<)RL-wk~79#%SLR&WO(PQD!OW(tFCDi4fUbHC=Il&>J;65@`+I}O$!K#)#~X917SP)?L=-j1 zyQlWt*#(s*Hw@FjI+$)9jc*3eB`>gmtetZT?w9IiqGOkidCo9Q0piffU=k>RDhqAp zuq%x`Rm?2ZrSkW;?hY`&+0Vbdu(GMwjWjDE{Zwr4e~o#rz%MQxk7KiOD@~?}KMWh4 z(&;>!&eX-NYtd=ReZ+i7o|w2Uqa2&jl;!-3yIKg8b~6W)dsH@%p-3{Z7yDY=SNUAk z5=u;j+M!ex-p)O~?~&2;JCZ9}^6i}tU_$(9pcJE3svHNvC{z2{(#5Vs zn8;TjhFgh9Yz&OP4Q&vk_jRvsg>w=j{MWOwb+m^6_wWt$d&40M!m69;3o9x}&(7x| zb>Q;8(~cO^t8jRw?6xg}UP$4S@r{I*YN-Nuiu(#U916R{uc3Sx@>Zt39ikF39jMkV zE2WYvG`w_&SPZT8W~m~i)?d@o_mgc(e!3v8SHC(>{b@H!%M1PZwZ`B-z~kQNmzLvZ zcOVX5{hslLKXI|d{x^fW6dldZu`XznCOzb}pB;MAqgbQpc6;FR zr9Z*dzgt2=(@N5@$b`ISqIuxGmcdSQw!2!d!m^_Bt=`wsLRJ-SZaSFKP*MC)T=l1o znT?vzy#HjdEkgxK>++TTTH$Vij*!@A3 z05bwG75fDjWP>fJXr#5-6-n9)zQYdf%CL)>n3z!57!enp|C-L8>C0{LH1T+H`P(L7 z=B@5QNk@>XSpD-X$9B$~WF4Z=u$dv6LmYn~wUVJy=nnF4oK=50{}3cu#TRxe;PC_b zUVr1vW;1v|&vxCqr{RW~OY@P`%F$M)<_Vm6_lk5`I0)RatEkPSXuj#imbu+OO|$M0D;+$j*2m{% z07%f5cc8B_MhfEi4k-9X#!0w8Nzhl_Gl;t35e?4=Y=uKar ztUf@zX@NaB2)&g*Nyw-frw7PI9l!K;yt8@2daH3|MV9Q_5H@DZ{AZ+Mc9`OCuM%0cjYURPhD zPsiT|??R?)X>;fUzF$?D;^iX;2E9rxmLuUvC60gi7{Ui|vBt+ymU0zI&kp>W@{Vw} z^A2L0Z4(Sye>a?Zz1Sp2)5kdvzm@Vz?EmDp= zsBq%DOq%ww8@Sxtu(hdAl;6d?gZFH0H6$OJ7(TSl4nf&p1B@c+-xwaYVjL>}~lnYu? zV7~o($G>p>=W*_PX^Yg%?EXHbhQ|y~M1>oxmuT1_=+w#7DlB&LGgt6KlJ?193qX8x z@4mw$z;EUAQ*;qiR_o5vxq?Z_ix+U5L?nsYk))(d)JkkYsJ!HCzWM0yqn9xYEZ~SG zmX#YerK2A6EwNIEc6|ZrSbB29w?46KlNMJ*1fWj8=5&MLXJzX{Z}kqw3itT2q>V}NWmN-pXT7I5K%}@$Mmv*t7MtPpYVmjW_`LVa$!>-#< zazocvC*!09Fye*J{!9|wVlZF#{XHs2YD(ctxTD0UyU7Du-Wh1<4tZKW`gD6S&fUwE zQr>z>VfFAReV^=%>XK^MAbgQ?30N48wWItywbuKr7Tf&RT%ZO2pD%H;-)>-`vr`xv zZ=E)0WwpCXZuZEYH$O&3+wB~vOMkshmtj=wEdio|n{dbG9 zvl!&LiyDG$An4YY5hR&gQTq*YJ;U%Z56x^Iho+CQ=x)s%4$$89J#TCxW!j4y2jKy7 zNh$Z!%1%GwA-!lP>bhBHu}p_X<6Fa&q!}dQH;*XnNscH$FC2mRMn2(o64I&IlF#&3 z5&TmUorYw}I`sHbe40Z2%oZ6K!zrsw_^09$MAgzHKk6$if(|IP^DEp{eC^wD7yk^D zPyda0?b|7*%BGvp`BM*xQo|CW5-1_Hzge>8*=%)Of?+MRJy_p0i(0iYjHyBopOyVW zbS8<$y9~|FUU|(}k9XMjiX2=w)hHZ}Wcbl@`mspHV9U22_^ucNh0?a2)exz>JIqSR z8*|k4LrdgJw#?8;$HMJVLd{?i@OB=&Ewy;v@KZeTUSF((DMEGu*-B?wuR*%@5Nky- z?V8^@s#fod+C~(4Q!XKTUC@aM4*A{ljfp2KZKh7_-_lJ z4SMQZPQ8hMc$$xMf02#Q5>SXEmk`t;k8Fh)S$)kXe3f|z57P2H^j{;V@LTc)_fp}? zEm0f^HQ$`NYG4k`#ixU(>I*Bx0Y7)ms5vt~hs1D?2Bq)LZx{@ZE(vlw30+V4!#mc7t zp>r5$PCqRIJhXHU38)VXR@lY0G&R}hsR5}xn%{)l!ImvTMObKX%Zvv^D)3LIyeh~J zVr5pU?%gh^et8tmE-Q@C@v?Oq8x#2cJyqXU9NPK3ki|H&O6yTRiRC#~Sn{n;JkIzU z_`bzh#0PUaS%Kp8t6sFW%rVcfl#MJtUWl$(CzDL0=E-T$KLsy(G;Lerp%bsWoNiIi zVs{}0W1XLK^yMbhBmrJf@-F@bxOxD$b>D>v&D#EDuju3vLgq1>oXp1-J34lUj-+cy!`U2u{5BhfaTY$ zk}@AOCgMfw`3bA?nf=9F7+gt^o+e*@WbNR!XJa$TKui~YMt@su4hZ0ji&G#-JBS$w z>5;r?gp_z$!@>Dyzla%$|Lx{Z-Lm<`tvK$>7~Ui7n*d#c_+yuMmiywghuGlcSIqoM zi}R^Y18|bR>%6Eb%gXxt0@1l@!t7t=jWoFxt|d{t7@Ze)l&7{IKj3EoeZPYn)&#}- zI`3IT_X)iO)1ZUp4D=SqaeqCb@`JYg$V`xFnP5VF99+O66+*KuO$X4bJUlyZzc^?; zGZ4`bVyJB*|F-{6DeMQQAQ%Z+a^$EMLhljyLaEL!rIR6Ns!{Mds%hR`n_8l%mVS@E z;Q=X9Wa*Ms4`c*wkwk77=Sawi+9#CsRk~8Fw-nXh?_QR0gv!Ul1yyty2~t6_;17|}qvP)D zuL3=-PMqSB7Nr7DCNgD;gK4oC4**1YOl^{9S+FV#Ry$qJBQXOgD zo%~~!o|Kzhy#`1a4w5KUWGd@(A{G<}t!6|MblO#+J~8wO61sEM$nEV)(e7O(=0>A!=H8w7xf=z~HUDx$=h%Fx4V*|;8 zHX?9ttoj1VW$gcq-&+kY*o67-&zz)f-SsiY0IM8dhQomzY>ToXI*D zb^bdbPZXW_2a7nwiX&0asJes2shocPVtw=_^SjeEf@m>Oeeivgx1ji`T^h$9RNlA+ zH=*JdGaa}nH5O#^E_~l@s0d08v0K|Q-@of*s4qoIMK5XHze^G-<5t|OyiT_b_q|b7 zr&%gingOUvkK2ASqN7Lso()HI!bMER=4$isxr`}hfm<-5=dpNHP-jC8%%$J5Ow8Ox zSi`S%-a~Kq_?T*(-q^}z{p$9S zl+l%F?6jBycx_cpM-3YHZ-YDm4>UJJR8J90k02}VS@um!Fq~P#^`#!KA!fdpfs#eMFh6^_%|z_^lfK diff --git a/tests/media/Burning's Video-transparentAlphaChannel.png b/tests/media/Burning's Video-transparentAlphaChannel.png index 0986ed446f1d808b5ad44fdeecab577760a0efab..358455d3ab1601dd186cf294124c95550f9049f8 100644 GIT binary patch literal 29346 zcmXt9dpuMB{~tzkNt;_p%-nKkODMTDEVpuJ?#z_sy4>$l=8{XfO^Xt8X%x9%laGlZ ziN#z(EEX!coU^n2arSth^SV4=&*$@`-n2A1%_YhO002&3Mn{ zwkF4Kiu=YMEsA6 zENg6d4ku(e(JR$-~j`$Hhzf0c4S@hiT z-)cL z+iJP9?-SJ!Bw`&?)Ek*hATe%Z0|NuyCtGI&D8bjtwB?SO-T%(&-|1|Po(iQmU3S;x zhhVWnST|hNTGu9?obhooRTyG-1ya-06`J)*uFBgmf%BI736p;HIK>>6fr2~)d6^E}W)T579aGH*kVr_C zT=n?LU;K@!RzT2}T1=2I*zvgD5dxsp;PZeG`f*u<^CNnQ3OefvVNaln;Y`PW-XaIm zt>W1r&>Te(r4%601M4+HEzyg+WasQXqTa9HN5x>Vlao@v+bl5~bYlV}hX~{p$#x1R z5tA#GAUAzqlKB-SjWAQsT(sau$zUU-(UUc?#{_?sgdd$!Fjka}m8T>Ch^Z~H_rwBF zXJoNnUJri~27Wf$W4O5WtKr5-V`PLd=M!bDY|e5%0joIcPrPq}#TX}F3-jlEhr*v8 zC3!zM$Cn1;Gi23ABUxWH#$;v$?FOGV_ectvROjH+H!Oe4WoCEY+cse9r@9IfES+ZV zKIG=f1l)X(LHIpC7mZ}qg0KK!m;94IN1f^m$^s!h@*5{ZU12jtZR6;nNu{$@2{v}& znh1oH7eoXPOL%*!t|nFV8Az&so21&#mp9sW1(wFe3P2gzMFt=7AROXWqDlmrxb3;b zo3>~i0E3GZHu+4~?~7XFs@wOkM%TFp;H=P80;sI9z~Me3*tksuaZQ$= z1xZEe0|r1a_^x1;h3)4Xc;`N`k-d5)K5kY}DFIVKfO%llMhS$Us_lQ~P*byYOh58d z#&slqM4QpHDJ&ws@h<*|*&UPD=`ef^vts(heGJhL?1?za@qh?DOxAFig2HMD_G=y$ z+78Jn2Ss@D2c^zHg{O8i=ToDY`k$lg4Am&hO@xHh*;mD7e(~>EVIkqt$euwXsuIj6 z8n)I+)1)^&REK-hqmTr(H>}XdgiErrWs}a@E;5f4PPuF7)?9${sYBq4Xk3PREq>~A zMW<%6$3zGrmfjs39a!D>Z3qsB5pE{)CxD}IAW(8LDjE4F;t(e7W$&+$1|rt6GB!d# zJ8#k=n<`*Q1gby|;7gHlUtBxUL>jau5r1eEV2YeZ%R)bq(vN=^94o^V8rT4m`OTS3 z(}bu9B*tF4I)o>o$-Hq?oqA`wnrqB?l)4o|z1hcGI7xVi4aLY0|Nk!X9Alu zkl(0xp9r2Rygz1`Ts)f6-b!KArA=PET0lmz^--Y-a~IX^Z0)2<;ev>U%C{T@5qSkd z4EZ{;Q$y&j_WP?dcIDe{zUaxP_*(7Ms%^_;oMnQ5r)TX~*QA&? zp~=5p62=WP^bu&*peWq1&e5i5SlY=u?^IO7`}LDU?DhM2^dBH6jLjhsqD0o2te`Ez zNs+xXEJ;0Riaq{!F#m5Sr8-vvY$f}4a&B&JujF`N6`Kz*f4doN_pGk$6o9M&@f3PS zQ)HfbJINqz@Pf>F0JO+9=knliRSyluE2P5o%st{s>)1IONH{q97o%Gj+P^iWoaV2uqN1!ypJiOeA<`G}=G##Tt)9vXr3|1#Y7DwzLuaQJYjAB#{L` z{T-vrZ5wm5+8ae&4Iq3*+vHXMAs~?hebmnF$*9e94al-I*|K(i zk7N^RzG^O5kFUA{KL1*QFRhgufdM_9f*HzIn}lf^+E(#r5R`OCM1>;GQfoc$jqT#p zY$vz#EDb0PnZwW#fJcc;RmLe!eE^82z4of>X3o!{2wG_BC98)q2IWzIyXM!P7*4Yi zU_1$gWKlLD|0pEOxg^8(!_ z2vw;dT!j>DOwom^)C&efL4Z^!f{G}u;TsQiT^MUF-k|+eB6#2g%@-_*Q|R{D033O; zs5|34>X3bE@E(HYHzEjOBmzx!Mj0FmYD4UPu!o1phdWPcYESMz-f{a0i{8X? zWD}%Kv$D?klLMcafNf;_AdrcCPvS?k>SNp8u$hy~5~RKC*!u{{uXcxVWG_JV?Ks_% z`R@2YvQZz29}1tH1$fS9?gnW)!lbl z=-|!nTn(RHq^Nh5-_dBK8{yUpF(>B)A=z!OkSM_daVmg16J)hE=D?VWnM$y6O%73;tVC9Y7Cr#b=0k5?b=rw}RVG(z-*H&m>Z(w1?nyo?lS=KB3xlyUPy10wFj$ zItMObvFu92Li%k_$VMn>syWCpo561dw-*6cvc99AQEl zw|gwQLHM&41}BODm|9$Z5E~4b4<_W|kxvB+*$pRm`CG+hqRgxP^)i>j=CjUm%6%if z5Ff2^|Ko_KHu8Pd86`+36C!l=+{C8Q*u-pP<){9RULAP)DOY^U6)1e@Ec*G`0DI)% z-8|V(h1$KdXCXCVNDif)mxxX-Ps7Q_lSKRTEGVx`0`oHD^~c+rM@Fjvfpi*L3U(&T zT!;lI@a=|Prl-nsSUO&lxm1_u`>d^%II@c zTGEh(MzvH2bk?=buz^#F$4B$WxT~(4vBXpYfiGC5vjz{}it@OHQiy)~pV0lTf+pK|?ERYWhkmN+L@)_9O@)|Vv zTHA*OE7mhe%UdNq;%UvlemHNK9PBP5 zPAa~pog_@Ux>Tk#TkECFx8NW2rimv9rPsO()8^g=y0*-21}?uOZyy}hDs;#FlkQ2r zLw=}EtM{ij``36Z`pKzB(+elwvwWP)2*QpaA(9o7mjQM;HQ#Ml*bncY3r+d$2H0gcO*y2e?#|H?Bdc+;Y4fC+vL|?t zXq%LOKW^YMXDy1Zo1t+zi|-Ww&^twx*@3IU2Dn zuP^KkTyfzjq-s$jbi_v~_Qwc>c*q_!H#Oca4iR1-2id(y%WszhUJKUq7X@Ng5h@ z%JW8%9n$N_u?IUNeaO$Y&;^|v$uSyINL+22Rl=J6Y4tj0wPuj(i+*XlvF>R@SV;Q7 zGuS?)dw>(5wAc_ezx1VU>zh}*8?_dmLtl(PqQ%=x5MCk6rU^IgthA(3zqicOCyl1z z%|Svc(^FEAn+L{(CO0HfyRSusoHc2OH0l*%nJ(IZ6k`Lh?x=V9{J**+wz+i?iB#>h zn>BZ7Zz1XswnP+S*9V8|+~vsjlr8OSo@_GIrdl`_4#fI!@S7m{DsN%I*K()}s%=*! zotb@={=S}?a+W9$PcKQVbRj+}!Xl0UhBG>P3*hkjVZ|9FJ<<(l33z4oiY8TeHgAAR z?-JCVZF+jWHaLK8A7iHdm^kc-Yc-LSmG^MICB=dcT>c0d>BV+!UTLWHDPh0QnsmGy zf7Gntnzy*tNBmC;oOWT>?WvC}pP-KwDVKoh=$Frl(-mK8gB^0a0Q3#{7D;RnLaWAk z@513^q(b4Kk%Hs`$(y{bE!dP4O}JSLAargLJg`ka{xeexJg6lrZ!Kw|nbod#L?gTE z_nEIj2zT*~uH>5UY4ve2hmK4VPI4mQfZaWo_yp2JsVl*9aBk!;ScDEQ2jG+uXL{~3 z2dB}=?leK7(rF^#S?>ish|~E%cCWy}-=(sS5#+p*8MC}Jg4!7?H=HEKX*b<7Bbo4h z8c@GGX~**1817;b#2!@v&S_`qz^+bwAl%ZA0;U3yNw#4|F?nr3@a+4CkYOdnWCl}b zH#WRsuDOv)r9OS=pV?@CniKHMKN^EsiL`_zN!z9VY|L-3Qiv%}oP4Vh;%8AH!maA8 z(6;Tb9IY!6zdv3Qcd$-h4~y3=3ET~bU8Vq%{O9?49Flz-zmXeFakQ;uHEH;{>{*%% z?(KR2&Pud&yVJ9X&R%B^?^QP9^THkc4~c&~4|S#!)bj!;lH}3g2hoov_XsGY3`;H3 zI#Qmu`e{waaL-Aj1OyfP;>dfi>KD_2z{)8BtfbN)?HrfSZ(w*<5TL8p?7jpe71g=R zYpR`(j+c^PCi)zn!vjTT|Q1bReWjEk0n87EUqw^LD$N*Rt$eY1-3 zaD-&nKvS|mooG}Dhe;J`!K3G^o2~qDkzRZVZru3U=z@qV8wXAE8-YknK;Y&)nt4A# zhlS5i%!#u&yUG7v#=ylJ4K~Xj{kyx(f%9{Bo{myfoBuKyH=LKgXbRbn1?x^0LDD(x zFnSx+(+88$xY$7QI-M8LsgVHnLbT5ZW=NZp<)PbMMws%WuJbGxW^B(rrfRP~-X&M- zF<5&vEE=!s79Yf&l#wMl+cJ%UzaZ`bz`)vGw_`9Qb{Gw|!?>K4zUx2q>YwTI@nliY z{L6i-sj3J?#3@HrqRIH;=#0fV6LiIBBeZlst#o5!H+m&~cGkA04ipXrngcJ7`eNq- zn&%Ekh|;&<6#$^c{|ShV4^|l2!k=9a+{@}dIs*g%Wuc|VhkH*>Le-Z8aJpcc3qmvr=eQ88pxVXXo{$kfwAoR&+oXt6~y&U2uaOuo;;dc^l5>unE2=| zLWQU&>@ovrKN~QOw)g{TMb-FOD_93MJ3s%vb}MTMS{gXtWhbwUECN7`ZYw8M*V``v z_DK|e1jdRreGmfxd~Kq(>~{8sl4b0a(%)6h6&S6+kuy!_p*4GTjc#d~gdjO-sNtZx z@z@B~_@^lK^URCJ2cQI__y=m-L&CTzZfk7PjvMbU!)hv?bibju#w_vmauYa#$futi zt@pDs(L^J9z&tzkruV~y3?8%QpmfIt#TnSxxKt0@U}^FXT#*Qr^=6q#(rW^$<=j}5 zg{RXWnR%U`UG!&+5?lB6kK?pMHz0$O8qeG-a;4Ew+iCgL<{JIvIW;jbF2yc}PT+-8J`&n+b%4xH8a?jUoFM z#8?qO1j-5pHMo7Y-EZ>mr1iZ-<01B*$`lx!^o9ZnE-rq8^5F@YUraLkotktFu*n$F`=fmyTzj1sO>Yl7a)fw6# z4%LkX-#t3*^Ps&>BV9DjJjG>WNSSZO{VE-;h=AP#Ipb)BjK6oA57u?1_9uZ=yoVa! zP{NE4N(m^`@Bb`6A3#f6Gl=OJhdkikUW6?h`cJsvy}IDRt-mw-_G0!`9KYE4J3?gD zt1g6xHJi7MG;Gf`lXq20ItI;@bA#x+>WmKKK#dS55upY1>gnd#lQE=usj{hMce1Fd zqB=<=J8^Y;V&(SI`~H;EO*y!|#;;-#mRc#}$vF$RdDLd9iH-=H936ibhn7vs96CNe znys(e-Q2dp0Qn;pM?T))ZU}4!)Fy7!;5>No7+CMp7yr)hMUN#AHM_ip>|K7n z_5@MBaVe?PR3c0tH9INX&=^*nrLN-n!CbofZg8=$WQ#&efGpW(MUkCFf3p*?Ul8`~ zzpqHpuaKbuK6(3J9xFws0_puo;%%G{Fx|s&PjH7X8GvPdrGZ42`6l@-o%QA|@4kBm zh=Ca9$F}>wS?L&YUl^K{PKXn0j*X9Qk3ZO1rw5)8u8ML~O>@n2wrb~lCCOcHe!UrK zvMe5TVHDB!wT_-osqmSbn9p|;xN zl=C4FaM9_h=E=4LU&N{;b+7cxYXvM$`4i#R{BA)}71zD^G-c<4Ln;~&0xaqY>Y-q7P-_b$EpV7 z->KN8|2kRkzXge|_~VrLmf3)Ei@6>D`KC$188zit10_&H!?4Ln%4jT=g4enA_y@`K z9U%MuAxugv#Hfr7p5ny!V7v&S=VK1@+TfasK6T;o<4RT-cLAo*r@NMU`9=x8HkC-V zZqP&h2?ClC>Qrt`{h*)s>sfYteCUIFm7W8(jv6vQlLcxJCWWns;{tcMsxzbT&Jj z9k;!o$fv`{Ndn|(<=l(p9PW2m;@2okG5(Wr{^;G`XED~g(CA)vVPI-%HgMvoHY+RZ z3I@s6gXXzug^xepao%)>KA@y$PiOIk#l*y@S*iV*bNe?8a;!II>opx?xAxbDP5fNI z@8p&)zDa8YD=vB!o=Y|Cbxd~xvqA0**CCy;)$h$mherAMiq*v?{FlI)QKtd(dS9ZbkJ==kg_K$tB_mj~d(>H25`_t_Uvg8% zC%$1U9{wO+S$?>6FT`XI@SSD&SI%qb>38qne}uD(%AO$dNil$yv{ZQ`vqPtJ_u=;I zP*>XDU%%c}C)>hb0Ka#tro+m+V-M`*4r6p*(z`ZK_%K!g7>+<%FF)dr8=n4UwB);a zg*77>rVenUy&q;tB#N3jJv`A0_KP-RPEPi^kD8BhBb;^entYGi`PBjWT#dW`cK-e2 zY`8tYGjM@9IrHKfk-S}W9&z@TQpp})ox?N!vCZz|fCZWLJEgI7=sSNm1}7)zWH5gn z8ry!tY#jf4sdv1p8vk!=ck|@yNp>Ht|L=BWde<%1kgG1)N%l+g^h0?bK;!F=1P!uKE96P-4Xw0P~-osUKHAF2y;!a%8@ zbcz9Tf*$JnpN#`u95UY(Yh!n&j>rS^3#|5EY!o_wpj(UQb;m~iIGCKDpa1tuBK~;D z{oi3$_pw`5OI3hH^fOV8^15Lw zr~b?cGr$5S0*Zs3B4qgttDFGT=T$o5S@dbqSAt=R%_yV;$w@W_? zz@AK|!n9kR!`m*n+kwI{x~f=gAAW?&6HksRoGO|`OK~BSL@CrneQJj+Ah(U6Am@;C zBnJEG09WBK^jjjNGQ{vM2Td&2udXXmoyG@^H9nk0hNK%hYSeFZGRP2s4fYe@rR$MoD{S5X1$|TiR0Che}7fu|2BZ- zAA>m`gCSB7s3gSex$7UGWf^b~_zf9`xmG-Ic3?dF;Xty|m!vT1(|p(52>dqzVyq!f zN!Ny#Xbg{-ktwH@7Qkv-t={op)zaUguV|qxAA|1ze*XHk6gG2JSxgdfRrtefzwk8+2JH^nVIo?$gcfS&qtsM}UWllgC=|2%$ePX+`DMCUkEOAHO1EPIBj0#OIIvfVjiGoYm^0F&Y{b(!PnybeEWnKH2EIozl9alx>}o1$D+B zH9Nsc1tKNb)-NMNn{gC3-*k!co&2{;uUG;%tU%a3=*<7?r{3_usu5|ky=UX};8Aiu zBxgGM-04)Dc1O(~eoQ3a1Zc|i`oP9wb^DVA9S0-J80+W#_ zRArqm0=v&zBEo&+rQ%Q1Hn3{1!D?=%l?%a_lo|IZz%vvbt;nzQ|hcEq=(C6fn;55Z!M+ixe^W&2vKS}828 zS>Zn1uzgzzMrj2ET767UHA_etm|(Al=H3JqR(%%r8LKnEviwN8)7e5B;=Ar5!M{je=A;U4m^juvVl6uFP zCckzW@3ItQ|J98KmURBxc*{nxiDT!VeB-EjxZ;dlNlkSjCpi$OJah}dS@-nhH)WJ@ zt%fmg&RUe4+0=G2egt+Ec`~G>+ft6KE65YC)PvLP+u5@T;D7+d_aX+MbBmHOHgOJJ zoje(${Y$F{%2`h&#%Fclg;yK)=mR_;(7n5$dvAFtL#w~jJla5~Ua*LMWvxfvYXOXW z<^R*G`_Wg$SPE_|7vcpJ7O6`ODoU{lJq>G|v+7C*Z5SXmBoJFC+Us9!1&;ss0)T^Y zrxOC34@g5-Puc*w0rYAz?|S|yW9vmlwl|M{$9%W1BNDt=h|g%1*yW%LOToVjqAt?5 z8-4AyzW$97T2a_5F!1R{yHE22-uso$or1`w`7N558lG6vat@s`uGI3TP*QvuRs2l38-r z(SZLcD&UjKR@;gT&H@X=BwRd~d~t@NLA{5x#mr|iwjyUXw{*-}DySi18vcho_Q!jB z7gz#)2!5Ef4KQAHpG~h(B;gC14XIz5<2xqmo>Xi-Nu$<05H{*UEFJx`zqUE~Rt>co zOV83?If@&loGUgT^&3r1Z|k{jv1Pq8~}J z^`u4(8tik-UO*U}x9|V0p)NFKn*N$FFaSUqda%me$~gC!J35)Aj!H}|xod&^aj?+@ zK4C=hn{*W=!o`)!@?^@^;m*3IkUqfxWuq#N+usm#Itob1k`I!oFMnV@f>??d* zrnm3&KPu4fUC)!;^DX|Ea;f@<&wS2SF;UOx&FIkw>>EsXSSyqSrb2YHS-u@-(B zumd}Y4)7r6n`UQH>%$;-{!;4PHOiDM2)A&=&drnTDs0Ruf(XltD0>gJ`1}wVe(3)W z?b!rl47L3d`={lw!5?UuhU^h!S{9DB%ukvZL^@^R%W{b4u zFyNE*R!HOr@`Iedp+4yw_Y}n9;)*)uVF9sEhWKCadQVyV6Zax?Ha1Uj!$UY&UlE{X zJgmK#VA=4 zdR@{pGHub2^Y{^Kl%Q};=LM`)Ib$0b4)Y@`Ba)Q#BC7CuRVM-lm%hsS>-fT^ybyN2*DNC>#3!D$;VGw$8kK?-{xH;2Y@nZGaJ>;< zCVZ}+tL?8%#u!woVCuuluvo7=1j>0&UXTTplY0LpWxNVv`XK{hwl5&^U(Ub1zlnh2 z_fkaxu%TF^1e9J$&CcJh*n@RZIdIWbeWSlcAyf2qg(w#ALwrLLCZm3Eux)Xj@D=O8 z!4H*H-(7DR8KMR>J6F^-4w@fy9q;`z;mn@B=fuTrHowz$e!$gJ|1GJE1lsmBU0SwV^-xmrA09(a;$LJz`0FQk3BT2{)-VG1& z4Nviv2cE)~;MCOIRPjV?E7ql8RchviZCC)rc!AWv$}@8NEtX2?kv=^e(#?+-O_YpC z5Yhi+{Pyu3;JF3kVJme3Be={XsZ?$Le0J4zP!>kk`7z;|?UR;t)c9Q70cBo7Pj7_5 zpU`yVUpr28t$37}j42V(uc$N?=?yVIqDR%H(5^X8RT+6wbx1XbJ{-ulL?cDln4qwww>DKTr1 zZe%01?r8cIy`%cfkTehp)8}|*o+cg6b0c2aqAbNk^x5OGOFzzSUqxr3M?}1@>Op5G z?>f7?t3Q<#S=?Ujr$O;vi?LEjQd<9Ouzi9Eve)vhRY2dBg?_K9+@vZ%(KBAEVc!Y* zl}kn0R5VR~o&>bjb+Hb-T+%sI@;t~ z-?XhqFF6!qmB&~T@Jtrdb$;wcMB_#o4Qlw?>=Idwf|#wiZZp9Lrbi{FgAos9b-?Ou zeowB#0N0Da5MzDghq|aQy>;3}w?2Toku4>Aint#r0^#OGAxU^=U$OoG2&hjKHc0%c zaX0fPJXq8N{PIH62t9`^mvf)e@td=&R)ZqyJ*>`X?C;?*_Aod0KpET;SFY!8jNOdA z#!n(3Jjf)r-e9R2f@c3iZz9o`WS(PVgG%jR9a;h5z3BT1G1t z6F^_5Eiqi~Wd~Az#bm;?j2z2+GU4Tfp2^70G*|51iRxX&A4lsCiBfmC?i}pI=yLB1 z+&$W6(h4wdE*%%H9_((8GOpRxF>~9NKF;FQ3kbOT^#ZJ@%2H0%IdzzkFr*e|*rDVg zb(ZQd?izWZap$MQ=4T{L6e2kTkd%7yWw7lIF!dKA3GtC-c3dyKSjRqrg`FGqzG*D% zChh?Sa;Z)b3tVdJ4~>g8l;zJaPKV^Jf?HE76vB-J;fWBnvl%Q~=I$TeAsJ62yj`Dx ziYg66E3;8~S0aaVh$BG#gqbjN!}X_*o+prF)Ex7`XE7(~Q_+KVa61^_$IPy?Fo$8J zzf~xqI#%?1M_CC6>-N?oK9jb@y`!V%;H%D?kktU>%}<|B{31x55()a`@gDs+=wwFF zX3W>=d^=tie_o)?eaZJ5&GlLz$kDlad&`}@g|CP9v{b`2b#y4EUl-> zD+l&<1|D!UpKJT-7;##7v;&wCB=z0=sfYLXGJY8YHjSH4-@g9NsC`Xmoq;^kVuV^n zv;{V6O2^6n<)f+^{`u*%G1Tmj`&h@!c-UeZ{YoKrXhp~}LqwIkh zI+F*X9O?u^=4VZ5^AhZ(*kavLjZwx@jLryrYbz&|n|s3I^e42G*X>Rz@#^3oA~`dU z(eNLW>!lyc=H9Amv zW+p9%F#YNkH;N{Ts#Ao|6qtw~oQEo?@-@eH->;(wtGy#J87K1SV*(Y68_dn0Ytz*g zN4F*#G+v+Aye$fmcB$%6U;(r0&n7sQf1ZsFv^a<8O#Vvs&R|ef{prEc?foAVC`XwD zZ!(||$BB2HVvbOPk$oXG%eyx&T5+p@8bK}@znP|zC+0!(K5151<&~NiVC(Gw{IGf* z&IQkNhSF9ehmdOdERGDl=892jQ14%g89Xjqvj~^|P^;W|mGq7}BL%NX>zGw`VL1Yb zZrn#-tC9JB$SV59$# zg(#fO@`5B6o`zQ2C{m@_2tYubsoFA{XS@dK&3Yt;x)C8r&-jBr54rIXv;K}=+_9Mg zyZni2x}q-~ZeZT`pGWn%mv~QN{JR$Hy`P6?Ng?4Sd^S~t00axT`$b*cPj-enP6ybB?aK!w>N{Owh( zse{5&U&UcwD+$1aF%Z~mAd*$;>$U3N3I*E{9_W>0gUqL7uKaa59NK2c$ zz%`Q~X_LK!Rk$R7!fI&GiHl*HGvVEA6;775`RheB^(Wd%HAF&&`Wavlehu)@6RUQL z6$1^E28KLiCe(HJ(mdJNUtO^oEU#_-oXaPvD_-I`B5q?^%R3$Iod1wZ(z+`B9;Kz_ zn<0tNlL67naEuuvaH=DGy?A{Bu7sEBM47N!4Y%qPOT5TBVf^E#vwrqclHnX&uDDHSont^^s+zkTUTUo-!=-d)7cP^yQh!ynR%=1H`fJj2?i3RR_|NqbQ1 zS6fZuJU@e^9*_d6@t4o66i2FH`av|o;Y^@q;>&}S7Z2sM{3K5$lgvg0!PfE>gCwJs zLPIW4mzyv@tnYx{Jobd}t;0MAS*SHUmMxs>nyl?lU#DbsgUeqB4U&R`q3V2>wOFdA zgT=LJ528o3U&gG;*7=bZ<-`_M5eIvF`h5b5^g6}M-)NG*)6x6P{92z>gPr<(u-Z2g zLrguX8TuWP*YHR;?8_>|TmGahaLPmw)T%noZqUzg4;x08(24n!(0XKz=4Y7tM;z@||kgc9`c6 z&p5n|=S&h4qgog#$^mZj>q}8R0xIq{=J;W=82{F<)-hN7@FcxB2c(iryYqD?%;gtS z%ef=oH&Q3J`*Zy|AC6IVeDkMrTAs>5AU-S0aqU-&OR5A6|DD;~%*vWS-rGDrTH5mF zsV+a<`z0m%S-t;+@_!#MCRf-c{WEyCpI5JT+uBq~(y;SI5B z+Kkxwr8UAChaa5YJbWhzRc+-i9&dt3uYWLeZTb#?(<(>6X&^h;vl7TI`5fWZ^Jigu zN%K_lUPN9mXs)edd&Op?fkC~cHeoya@x$;K(Dq~QjP#mTh%_|JYZqADXJP)|%?Z{2 zY-X+}lR`$E`cWd${21NQr-d{hPJOGx8S7e~&a1lO^mQQ*RV($Acq>?^jh5(@D#z;T z;cKn zNQA#JO~HY zi?8nlR;hVgg=?}vEeUJ9*+caK=NhU&l1~}YIU2INm9$ttFEpocsb2w98SxmT7lZo>g#W%)%qsL7mx>BGNDP z&%A%=DO2}dK)*wb7sIOVLSg2z&LZ{c06LeE9?Bp>~e-017NAbOpXRnpaKjQUB zSow-F#uQN>MHXj{uh@c9)6b2qL#a^p1`U+esRW`9-s-^-=kX=H1r#qAD3HY zDPE5Ku(d?RkxzIPjZfdcDDH933x7Ijxy|+>UDfx`gle#5jErKg^?|U=S-Bg_rl$t9 zrTEmJNWs}21gYGWyag0L)xiqBsdJNKBeUoAe=Ls~HSP~n3RRxTmXorz7#%8_tbQhD z&*K7)i)v5Sdf_(!MP-16=} z_}Vmk?uUWpkE8FM-10KwWWAECu~BP>1Y_#E%?!3Qb-Zw$%^_ZFf`nk?T4ye5KjR&$ z-nm>oH%2ChaDSprand^y9?XXi&%wU z$ox!u%>plFJ1F-z!PI@rdj-Qv|7$C$>z1r2?0VVJa<3@Ad_)@#lk}-gtG^Qt!7*%J zzV7w_09J&F9Q~Ny>R0)nx9&c9U}NxEsvcQkos=80n5#`hkv03iT`MTBWh&F|^S@VH z5wtNbtB)&C0i@}Z9#oZ~U6;e+11X6YXSa32fnNf`O^qxb2t!834#ep7_jP0$Z2|Pi z4H;F`UPN5m)OuW<_6dE`nf3g{Zzx7NiaT@L@hkNaVNa0fL`2mZ{#emHX+ZnDS~K4E zg$*F18cakq6h4TTSBnqmXE{w7VCP!XCar^s9syXtH|utH)8)SKIkMDze-p!6>S*k- zGc=V=mgbJ{L&MY%VA^L0rDXVIyjb}dOF2$pWE!O|~mz_rf9p}{M)2(Xd7>1-I zGPBOkxLUi;taie@B-&lED8`vkNrK-=mJ2@RJ z7Fv}WVVLE4aT_zXlEQu3Nn-nU0QZ2bRKD~ZQi=GA$;UNAiH$Qq98)5 z@_rw)t)J(U8#o$Y@~I%oW@5R?=pS+5VklO+Y-kACN6I~)ibN)T>CHge&3R^IA&2De(ZM#q^gKmC1f`AR`Fv6%VDbh+n0)|UGP z|1om6w5!nvy%yy)FO5vH0KN?ZcQUS2Pbk~a~&68R$ixePyGi?ynij1hkrl){iMKIq=@+_Byw!?>K#k$WnaA# zy;MGry;c^;82E0I2pinc(8GjP-$e7``&G4%=e~P}eEA}1NhD`U`Wcw}Eao!nYw7C+ z?(ql9&3b=4>GXrvO@F-$XMv8B8mio^hxC$ve-5%rBArrS5A*X+jcElB#_0I+h|1(y z3ysOYAj(6&S&v@*o)pm}HTS}oZZ^UQCS;&B5e#JPMH>t4rxg6i7}}fl28k~{$QGq; z--g z^X&D@3u`=MEVYW$9xcAmXUVr0Lf$W*Z+6$3*O{-Jk(}?CF)MH>u;pUJtUm-`{=|t_ zOqxZ-AG~;;m^f%FvcmRGm^8+(FKaIJLg?-_JLEmyIrAG&Z`^)CA~qbKO$lq7zd94Gdi-*_}=`4)iLmNI;UPs=P%5 z(q70k04w6kC<2{_b_i!)E!u2B=HWET!kQ>cziu4=NrB3LM!!gXXb}^2{^f|aA@BzB z-OY;{rQHq8b;W;~1d!1L)y`K-{Bz50v9(HTe|NsMC|;KO#@|-m>Zwg3rxiPd8DvgqNk^;ry?owkB4g*R1u`X&#=1L_&LHr3)Bu+M1g?KD8ew#@y*A zF|xH~p*Hd*SuZS4KR$(!iu!P;G3lDblFk{#sEmBCR?2Qh$7u0yuTPL{ zo3LcE+qm&!bAu)}OwF?IZL8DBa#*)2-SqCV|9?>JOdg18@4Xz3_-k&Q7TSzHu`{<^ z;jqik)?D(-RkU@bU=^jP4UbMU>IYag!ah64KmcKlKYcxpX9Vzk(r86Z(?tK0!BxAG z@etaF4p}sO*xXv}jKrmiVNZ%$k+DQciQdVJ(=jnS>eTau5c#1nv+|(1jlk|dTLNN7 zGd??Gybcy18AhKiv8h~TCDPRExxD^jb(p`-jK%EdVHb@kOgQ6_ROwq4oU8pQOOiy1 z#F0)un${eSHGDSdOqP-1FjU8Nru0-#UXChRR|`kn$OX@?+)dftb??8W?Xz+*)o&%% z@lX8&XoHd3jXSuL_XlT>#)4aw6iV3kSw2^f)oy~7-L)<7fyqH*F!3lZ&q*cB!j$A&wFddONsyn#W zMJ)C7hgn-WDL8E6RRBX>!oOwcX#E^Q*(@hVSf0bA^d6`n>Plv3RzrSkZ8%al^9c8| zpkU3~+VX2xKuv3*JfL={Uw-?NiNuR$Qq`oL-R$=IdH@!0`s1w1mFv%3mt5YzPA2ej z#BtvB8L4zA@TqDnCa2%Z%Eg*47IDXt^UVFfptKFLlPbVcFM+&x%TNL*JG7QLd9Z4l z>}UBNEZ6oPQ%rpOOz3Um{lmx%M%)IaRl;9ybaJ1BPfIgD6TvD6MTfZ2Lg{nG5_)VQ zs~aygAHVr&3?N3zZ#UhUI)9t>v@{3iy(cU_KE}rlH628eN<0v|I@)#izsqI+?*))J zRl#sJ-RP=yu3`rq6n+&A{FvVDWtrS*rtJAp--^tf&ctUHTiZYVD&ASQc2N;qWaiY| zes6fL@NZnZ?@rI_st@%_ot+og@M^#6YpbvMz_0M9?bX*xCduxn=nCI^Y9MgGmdFl9 zTDadp1kiE+4r+ySQYD(U#Ruvfc$-&17 z|3&0c@$%V3=mNL z{~$$gI?cn?4gLKR0j7}m-;)A!r>|>DN>*k1*h)zv5kOAnqPq{%#SD_~_7mmTgNawv zT(xsaTy7>6P-VaL#+M!>h_!lt3zTOUU zM{z+a)Wj(zlJ5=L3{5*ePJ@GP4RKaX#<4&G2@Vg%I7Q()GGQ(Ag-nU}N*8ET*Wwgo zi_A7!#1ERq|~EpOTeeQEY^dv}F~Z`6JUUBb};Ey=8(p`86&Z zY0@uA%`h2%M=nlRg`wh><1P%z|SbRyS6|gaIzry%`FS$|T9()CyA*cy3bP ze_m!!@s&fIqt{7Hpud|O#cesqefL0zyJz1R1I04d zE-NV8r2RJ@;0nJ7{|Vca*A23^?zGzm;DBNvnsWVPM55>Pyc=r)%C7DozncZR9#b|z z9QSB$BgHZXRY9_+lN3v7w0gcGubi@SfGQd+g$P1KYc`X{KUVFBD9n~%o{0j!$RclS zYz+bc?f0%zf9o{fv1qJ6J*Z>Q8Met@p<@_u`pVf->GIs^!pmUXuZ&L{JAZHBiQ^0E z)5nRgBjM^*vB>^&)_8Q2383Of4I<_{b3QfjcXMu!Q3m(E@YmsAo9j(XQ?VG^%(HsB z59Pyxp2kH$W$G}4D?#{@8G{5dqiOF_gXl!=HW~S`;$SzwNHxw^OnHX|M znPII9v7A3I^1oKS@+9EG1OYcBSEYrv3)V>v6C(~b0;amc=IfGF({}6ps%HL)Cfd*M z_2z{&J`z%xyQUcZX7k|m{+2(3DAW>`TXw;Z-TSRyIxIiPe)2M2JWGoJU;JqTc{5_T zesXYHw`x{(w%A6K);k_>j&5t2M|^l==t}1x2XN>QdWePAlRxxibXylsdZ0O`tORZL zQ_r0=&~(T4I-Kz@zvsHAkFW#(FdY4((HVZHWdDZFQ%gx zKCK3S6#DkwF&UR~++X{s3cO;%C)olxVL? zNsH=tS77xJYg+&zZIy@l3cA73hUq=B__}t6t(=6_P6-c)=^+)56Xz8IJi9Gab_n5} z=K+=VJhL}{#j<~aLrNk!SPoFu)JR1lWmf6zg*A!rr>W{m0tj;?sK1PykX39aRDDRK zcP07iZ=j50ao@YTgmiZ)OS?x;H4drowz- zWg-pQ2w*$sT>BCX6I84|Bq!Oy)TEEmka8?ZRH{{#NnXyyxko~t$m7}5%n~N58!HC{ z=L4Qd>e^gUc)qJqbW>|YGlSDiFXbn>#>{$RNmVq+XYiSl$lX)|cf8vCxJ~bzk>w~` zuNW-QWWd+@wM`JI9&5cUhgat>zBj|)63ko?+?TL)9oLTaY>z=FD^c^1`SsO}keI5>W{8E=k z75D^2G|c;N3L6usOV5!roBn_X?YtfdbmE|geZsDdl?r;K@x|Ec&hawtgR{>qt6a+a z>h+*=>NyM#`hF(9s<|GcmiKy6@Qix4e#Tnm`!KMB#TAuGSqf>62i#oVg;QrkOd-r! z+Ppopb={BPCTpe{(rEiEsG4fm*W8@vB>SyPEL0&(J4WqXJDfPWY_PR_Cmv8WWP zNDn#?UWK3I!IJ1N&=h*V4yAC?Aw^MYExcx|BTme`$$m z8~Ti0;4VmJ_mkP(XC8x723jm}ugiAM_Nvby_hXeLHRj>jaOoJzVm$l$$w}nwO+da9 zn4JY+{X=1q(AHj4X2Mi9<1j)>hUce_w8wlDx|oCa7@Xul2Q#9dr`3o9bu^-5bg*>2 z6EMUzX<1$?=^&m5pdqP0%Kh@8iDfluo zftLE+Ct7r7Pc^0GjVEBmX5zOAS`Vz-Cd*Nx^uogGa;QfSG+ab8aKTR{ST%KN_HfIw zk}g_s7H`2p`mi=Z%grxJF91Gu#xo9tub;4KPXzv6Z|aV&&H|$kqJ$|+PonBVUbs8i z&W0^_jiLXNj}Ed|mGh}%5vI;+UY8%F{8of!X6*W4)9Fl6jQo-*Wy735ci{RL@hG9} z>;!p>RP_(Lmh`|D9DgYtAuHP}^P`|ClJ$*qFS`Q#)nfW=z3de(MJriSRu}cO{W>S- zCzs(*h#21K0rW5-+kwv@^zj>RooruaZk4354;Wk-X&64d>w?ndy0lUJ)T>+bPL4w8 zt3?u(>w(`yJ3Ks-B{I${x`tE>|W?QTVhm|WcG6dp*um6 zi6kI|9Lwp8NXX%LIwtUz=XnYA-}^1+U&(M!_mM+-aE)#c8-xIapKh;(f1ZlPm)SEJ zyF&1I(>|0%mzZIHI#<;D(o*kyCD*=qOx!iKB72dRQi5x-YYF)dv%3Y$Tcvc%4y`iX z;Bz|4wUwBUAm}oDqTyljCQEhe1Umf19O0hwf<0y-qVqaYpS5w{!tZCHmDj^F zn~AH1-MSqtN5O}H$MpPD97$u%46^naJ-n+d0E~(JcIkM^IXc%mWyuI~l>!YPfUGo$ z7UEM1&?#Mff`W=Yq95k#p2#9iEc^M3u>J5?3lSBjrcm-ddds!r6&J?#V1E}JE*F{}wGk>4gaGI^-$O$K(aSj^r5s;UYvBpSI5H|$XfZfq(^#xi1D z45BzSQBE#o14I+FOs7g?VLBlajK|Fw4Heds#Lij2rHNRe^tu3{7Uqm|!pcI%z zs=WGLvFBaznODJHF8ZDuS;1VD zLKK?T9a)YKgxnMGUd_P~Mp@qU;t4Nkq?u3B?Uu?PZ@g>?Eg7e2%vxWi^4RHg_|E3h z(sARzcXz)yu?AxN)>qjV-JPc@u`@FQr#lP7IZ11OkB?|y*)4vbFH4N8df|d*0S|j& z#u7&9V@un8{mQrF5zGyrN#JpLVTy-6y-<9DD7I%S4jOi26VS8ucGB%UJa;W+D&TmH z!avwW&^^frN?H8gDzZ!um{)u+`|^tW!PWzU_oiJ)@UmXRY+zmy2imN6XF;XbY+P@F z$on^6q4{5pEX(#&t-}+Y4v$$?$@CrqJwTk&JE!Vl>!E84{K7fYaoJ``%D{}g?XZ34 z@12052g%J7^co&KyvZ4V5eOE0$BJP4y3g3AbNy^h<^sSd13nJ~1(`tQ zSs~?RYmiMXTSuPpw zg;=aKAVx9Luv+MI`Q2+DLjIg>YoCsQ3JK_A%OJ)5A62JSIzgV1erls_Mr9R)uzc0s}xT@|gj`&FCNRWCx$xPeN+u{ovV8 z6h5XbE6sC`al+~EI<%JBN)b_)GPFdp}h)rQZPiDKpB%dEn$3p@DZp<<<6%Es8DgHSJyZ~gIG>3Ff3bcq1y$6D-vOXD-!^V_BdrZmx$*OR0F8&`x>q-|v_j zSeSfB+8YBtn&q{-=zMEVC3{ST`YyKcX5y52Kbh&Zl2U$AM(0t6 zKB%}`ooE--n;+R#lbmfbqD+M>D(Bx4tcSf)jJpT|gWOld)Zfk|3&(s_sM}nhjnV3_ z-|A%r=~HWLw%^izgwG5^EaiGSjQAodJs$rEXc}k_q~OMZ{L;#Vy3En zwmo@CCJz*il;n|5-a(Fu))c!kJ)V^@!K3)gLwu#!>3K%%jUG;0*sCAD{S`z`-8o%| zXGHosCgF{DrFB=V?hRd|6dW?~DF?V;(%GN6CpBL?NPaft3K&7)=YMcu9AhNvJ!3dX zeBShIO{S!5HEOnQGN<{~!u{vzw9y-8Z+N7JVnsD1{;g%I7wcet-9(n z0NZZWD5u)rfZP&mga-px%T2i34L^_h1#bu@O8Dh{u3J}HBws)yo+jqeZX;g9ZK#wH z5j4AdM_NOicv=F_*hyWL+hZnrrhA~Kt4C4v1%0RF=BZt?Q>b-P{9OHS&1dr=s!Hkk ze|sEb8P1c;0ZC1LAG(TX+WA$fKVs?~%srCx;42RJCw~DH_&EVM-*U2rRwn02wFbds8SK&bVHp=ke>~({H-$7=#Sc zWWH`TN@Mo4p=G|U?JT6Z4L`Ur+x-cxno`>6(cgA<>R+X%&oVaTVG&A?ASw_agAk(6 zmZm`uoPP12(3xlS@I}bK4md?bTKDc;%VA!Y$JL^jwpuwt3@m*X!}o&D1H$kZid?Mr zv9MC?dXNyaS{xAEj-78-Pe~zSHxA@HEaE)XfiY-7x2%s%vtQK!IJ&7SV)0(K`Kl~2 zaT*&{e#P~|{BhGGLa$r?^_mLP;frFVzBO*ngj&paM#2}uk4<={Z!y3O+DMl%>99bD#dR(4rb7c+Q}rL_IZJ3fSKNjT4)&QizCgJ4+Obzz z(Ik5Cmd?)QXL-E-$~_-V+n9&EkrtEnKA08(@7`~n&t6$t3bpM{!!OSmT4!QaJ+)Fj z%`92PpcU(a7N-sQj1oe}-avh2Cq@v-(9VHX09@KOc*0?T|GBfqi-&~Y znVYw|N)qE(8pdaac@_M@P4|L#9Ox2H)nczYSv!24JbY@#F}KXwRs~!KWpSCGgiELA zI)T2V|DB*DU;DI8tJg{sps#LEKBv6~5-NAF8A*-86ybzrKi)i$)LNusZ9k8|iN@~b zI9b4E2o%w2iC)|QT(XQU*$ohupMQ(bN4@MP?P9;WvtKewN@Gm%V(IjU+z5gB z8vQ*unF>EUt&gUCIenT%uw^pyktgyn-1O?X> z!fR`Gxg@7csiF)QILCN)Fr7Vn#Er!2Nkau<4BR>>6miF=VB(d33;6}ljgv=e&l5_} zDNuc4Rw87bkS^&}Mw#=eYxUmGP_k@QM_wic(<06#odqwDH~PD?OXt6$H4h^9 zLWDU26kih>4ok{vx0DQh9vqtk&VMIo-Hpe?|E>Hu?mvHQ*kP;jWKoMGNxg?a$q(Ri z9$Wly-Tcn``o5@*vSGt{c>vLdi6g!Q6aRKE%Y5Vh`zobt$NSZfwnX?l@a zXDgcyP|xd~h%l*?u(`D46S&a-s?WZi&C(KBqG{{Se(ODutF+D2M;i!0dOEHy_`#nK z_t>tty=C40_op4A-hPp@ukgZmsec~cZL(C5Qcb;<+PxW057Kh@#SAk_@&^>B5<+pKFD+E>uRibP& z2RBcWO=8T^>pKTb?-Wn;lLyP3*YWN_6#n`9R6|P}`2G!jnnnv8gwFWLvDmHhHRYCp z!q=|J=bDdlA?BRhtwKZJ@(t>ZBbI+J?M#b|{D&YfX*jCWEk=8ANj3Hhr&CEeSGs-u z<)-#IqW^}{W2R@+=+mtT_0%O+7c`qK&`!#wzt8K-~2#AJcZ2MNrOM+B5 z{$9UA+tcXHm+#a+FNO84|K$R2ju`fTy?V03$nLR_l=FP>Mh|9IdwaC(1#ZbhRB6!N zsT|lNxgE+qD}VBJ)#TR-b) z5|*sh^JwGaydQMCGzs={5PqlI?xG$K%^qQq0Kj0fgHPy<*c52pta+Q!f1kdKxa~na zMOgke?bzCy+s2qcFr0*LhVPf<5?`f zV`Z>C;e=MdCB~CrO`^kJ?iRH;q8b>G(KrG{T()9qOw|e>f#ZM0Jq*^U>))BQ%KSUs zEv-D$_M|6Vq|DX3`ou-nsp{W_c71Yc`Y^T%xG|xh)9mQZj#HmrZ)4s>-PGsq_;21c%-3~(-3|Bj z(Ui1+kjy}pWP=1@<8A=w>kX&`l?#~lbLDQbqh^&Kn1NZU5P21V5FgeoDN2K?wT@Dy zhb@7ii8u6T4lZPeI5pfw08qP%wT>3caf57j!&C7^7;n*@fE{Y6D2!9_CI6k*&)c?f zRw3#DF!Sbgr-Csep>bR=`omwB4VtHqVb{Q94p3CokM0{Y6v?g@ZTZo&7tiqO^vfsH zVV(*BD}?ScGW+H~?58erRiKk0Fe0zCF{$^x2qY^hhR;VV>jlWjm|$wW@zlYcHKzGW z%sQ?Be=e>UqCgymnQ`;ApOBjb*PG(TmGY(tuy%}|ZOe9Ptg+~XZ!;dkeH(Ag4XdsZ zra(&4ogT!r1cPtB%|U7ioGb6uX@{4Rpy>q$%9iU~i{3jo6XrqBq@|RrgAhBl1fO;uJ=4@i=Uzu7L77B|AINSA>o5PC04ll^C#?Y^XG(C@n;p$y-J z)6*r&o169+D?LwcddTgcMZbCxZ`K_?$RZM>{xERS>er=LH%w6|)$gGioi>?1+!m7e zxHN-=BiDKbRjmysdjwF<)uqjupAilKDNHupM}V*ngs!$u|jv0U9wuYR$tqu_ogv*l?&br{{aeYiT2rlky+JcST=I&u(=I1jserZYB_LLuz+`0##>|-*QdiK96qK7MnK1$_i{7XM~2`oR5p&}~(ubUiubuj4ciRfp=vv4ht zqCmVrlTRh2HmdTy*u{$gPLR$qRr{wlIJ&1Cr zbKF-JldF?T%Jj~ewawQX-~KKAUdA;4Y#t zai`-%S%qeH>n~MROYg{X^%IxwrbOkL#dRT=zQ0bN;|JCl_00oZ(YxR!)oHVM_{5)} zve%BDfL@C0<|0(C8rchTdBFtY4dZw!k9j%-GkEr>{^_$)oq5$aYQP?T2q*{Uj-c-W z6YUX>CjbDK{{Qa?&?p!K^2B=g4E_W&1DrDL6D==LFVz0xFXDFDoWu-R&L8S=c9Nwn z8d#vOb3C!v;*$d8Yifxg-LADI9!RBpleWIZr@F0`_jr7F(?U?KL`UVM?>AV|9yGDo zP;h@tlK|8_-k@c&Ej?`|9UGf5ETUwIA0(ZX0HQ$?K)YK4W1q=+{E`;{oXGP199y91 z@;=`x<{Ggnw^8h2$$hYUmHll+D~CU0t_BWSH;r__}S zxzb15>F2;zlfDvCq*|ptS?w!u_C7<5FC7@VQ_=UB(!Gp`WrwLRv94}7d~@*al2#=s zmz;0d$aFksQywT?qzJ29=H*}0lIL(vXmXzyM8rPuzUfdtsM<4W!uob;y0)%=Ah*(J zhAbhIj1&K{|5Q$8MDw;3Kcstp#7E%2s)3Ct?mV^wjtjZ86ZyOYlnn-&eI_u(y~d>TneJ>(iEn#;{aRaRXTK?c#f?s3#(BqQm{Jz8VH?^P8(hbuPu@@+zS7GX)vh=oq($-KZSdpYoeZA?1?#3R0!$uA9Z`&49t9D^RMcsp zMNjFb(IwURacE#o*h|24$K=W+ZCmlj%^oHc)yd3UxAylQKe#>ep<#fvCe3~}(TIE* zVDfmDP9_r@ub)jtpV$G6woOj6x;|$~^05)+i8kO^7D#5J``0x;*$j;{Cggi;fgo_8 z2{mwKbD##J2snqx{9tn}d>=qGvPikBYBxab)*S}c6s9dG1jec$Fd-v>CWSKL=U=L6P4=+}+ zGP2YT1As1M%qeATZ<4apHvX38!RK^fjoDIWE6Ki;G5#6cJLuz!s@sUTX^FXEFeJuZaH{mbZF3b92IKJtJQx zo$YH}azWWI&O!9b-ZE-qtNvq5E6;e!>8twE5**NVK&n@MY)=cI)RlKeP-gZB3wP@LJ?wg#30c zW&LKodqS_f1)r3G#OcXlv`;1eXd{HVxbDNU`RGbZhOwmMtcqhAX6}b3rDMA1Jm@Z89}>}9s+_|%h!zG1CV`&u67dicwvh?A4|N2d6nUvpzeU5xDl z#gI5f{~Z5Q9=4{9YGLd#`pdhs^-+0W2R$hJ_g&nc1r81p66W35hCbqQl@YoI0C!hd zOXYP~O)rH$=5)*-p#};a>D-OO`#1s=GaDSsE6KEt^IPXrP_X{NR0<==dc0{|a!7cj zmIIxYBX~otiC~T?BGJ*+4_W#K6C}qvXAcC6A{t)S+A!U9 zxZc5%HY|?HBKcU{7w?c}J(D z9bpps#pIB-Z!pJ2>@4oR^uo13oh)x4D)68R1$elL3K5E^Q9V%_>Fq9Ajq41ufD(Ch?O-+(svUeSz|Q3unhB2LKas&E2p|HFe9I@DYQV(^B6XBKjHZ(6U6 zh@Ck&nGPSh?h=*Gu9T(eO%Hzk`rJeO$p%dAUJuh(spNvqJLOj?c^QPFRL=J-p}Uxqvq#|L za7|DF&v0x{#4>)j#9<|hw8mI4nmHcGYYp6)IdDiGcvcnp(BX$e+`;`sLS*rQjn;yX zZoypo>!pLcO`F z^?JSD|Bg1GHjYmA#gl(ZMZUe9S>IPep9ef!Hl1HLRDHJ}eYD&5o3^e>pNRphWMPL< zwapEF;l(uvbu9~J9Q?Q`^q$uE)QutW^D(vQxHmd%hOXA{9oV!6d;4Z4V@Os`6R-ZgR6<-NE~D$^lWTK7ZHQ)$=I?_ zF3`z)d5%_BrHpSZz-qHlW4s4<}njp zy1#|=R=NUI^tyB;xWcz0sOr&!e5oDmXW~0h^Pgn{k?bS#0)$cQ=|eg=t%`g+cJytonQ9G%_5YP zYy;=Pq4z5XR5ivo=WcB#gD@ABO8vxjWGh!X9kM3oaNQc$K--5o;_qc3A}ZVT{7?jl}VV-cj@sg50`D*JYW5kPel0LKW>c}5^U@w%1t*kvL#$f z$yRe%9PD@al6iWxmP0hQH)SHlw=D-H1>QL6&$;Wf;YMf?4@|M*Hp!Mt!~CWlR0-7n zZn-NHWUDU(@b=aBEnsrX4a^duaRC+j(Tw(_{E)9 zSB2avzC{mmWSMC5#-+VZoO?Y|vFY+19M8h7312xME)9N$c$~{3*}%%m9W&uz;g9i@ zULwo8n7md=9+)|Zysf8=(rveKyIISV)|>-10PjEOlTugL{ixt-&=qQzAxf8Vz$Av- zDDfdCteKJDa2G)e7gs4ClGf8GU4saI$mevOy9gNFOlZHG3jJFheG(dz5FVZFJC*+% z#F^&ax!sUom{?F47MDwa>P`b?i;o z=SS0yj*dp5bF|&{RHzyQ&tfXAsVa%(qFZJCI98TO{O(~wdbL|I;M(~qkmM7mUnX4?&tlM?#;G=zXbutrLH)T0qRml$}W32M-BbL0xehr@M;HB|aLYvJ?R4 zY#0xOTRgPUy}3De)jgL}$Wv-~Ix8xQt++&jz_`ScgyT}P*9QG)^aq1=nCM4SPN3LR z)IQthRn?ZKdyx=wu8VCR*2t57XO`cysh>eN+_PEah271^)v3p8;=ZzM-z21tFuxX;q z9H~iPVptH^PhsCeHP}P>vKo!j`*kzv!x8a%md3^kA`eJf0ofW&tDxU_Q|;VVm47MW zwRyjCjCf2_f}##RpXn;mB)P-}J4_e7@!5|Q(lfXT&pH_Y%J03I0-)fx@2jOm?xkm7 z25M?%{c>mi%ggRbvXN^1K^5gfo0mLz*2yTO(9w+dPLw;3d(Mtd^=M3mroEjE-qKWI zT4Ja;XZA3cRAN_TR$mL3@vlV0kSf=kwjy*Y_&k6L9+A7oTdK`qSGAaK$=XFbtK&_+ zxi5Y}!;KiD8RST9Y883%WdGmsF;C8cVa`1486!9?*NeYUf%UoW%@4Flw#X0|Re>H?RsnC)}GgSk4p zXHQK@hpDrTBL4G_04&>$4$1HxLw3?dP%FIvtE1mlauWmM9N9IKj6lecl@d}wfJnl6 z4a#BAVq^{z_>iswygM};mPa(vHr%=jRup^l#pXYV*;{!qgVlq)vOB!J&shA>JdAu+ z*t36IXL1@QB;+zBb&JT$l~-sFxXD~>$6xT%5{oC`PX8`VeLFkd)fl1q4ykByh?ib~ zxAdoFinU-f{-YNgKi*|~JjmN@lZ|i8LPkvaMu;uaFB_nbgBG$p9uBk0Dwr=Un>7t~ zBpYtA#$DI{r&@oK$zzUUKcvT)F*Yh!^pc7{#1iw>z-3+xb*zn(C_mB-uPR`=pci?Z z?Z2o+l?BPbj%vW$x|@%Sd4pZs#NrF$eB?m4%y#3rKFFgpn`PHqH&7_Q**Z_>+;RU< y!$OJS(i>X0`(s=Am{Biq8gJ{p*t3wQBDs*i!}|(q;`F;G0mk|kh$>x|Xa57pGhvAU literal 29521 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 AF#rGn diff --git a/tests/media/Burning's Video-transparentAlphaChannelRef.png b/tests/media/Burning's Video-transparentAlphaChannelRef.png index 09ff338bf08b28145472a1a32d28257de8a0fd7a..21844ab283d398b90eb314cefc654200b70627e9 100644 GIT binary patch literal 30009 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

qd{wP}f1wQ8nckk~_Mc`~sjQQJpTCV@t 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 LNkvXXu0mjf9G}FC literal 30112 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

!+)QYW(39+5C8qBum8dviNC6xU;L@7DHMKC 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 literal 21621 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 N002ovPDHLkV1j%L+9m)1 diff --git a/tests/media/Burning's Video-transparentVertexAlpha.png b/tests/media/Burning's Video-transparentVertexAlpha.png index b8f268c6693e90cc22f4d03828af92863a3fd219..aef6dbd7b868d6a313350888ec3965166138986d 100644 GIT binary patch literal 29855 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 XJpcriq|o<{0sw}(Ch$sayQu#G==3fi literal 24479 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 literal 6477 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 diff --git a/tests/media/Burning's Video-writeImageToFile.png b/tests/media/Burning's Video-writeImageToFile.png new file mode 100644 index 0000000000000000000000000000000000000000..08288a85b105d966ff00d5bc722fffe93f672200 GIT binary patch literal 27905 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 literal 0 HcmV?d00001 diff --git a/tests/tests-last-passed-at.txt b/tests/tests-last-passed-at.txt index 673e1c4d..9158849d 100644 --- a/tests/tests-last-passed-at.txt +++ b/tests/tests-last-passed-at.txt @@ -1,4 +1,4 @@ Tests finished. 72 tests of 72 passed. -Compiled as DEBUG -Test suite pass at GMT Mon Feb 10 14:59:56 2020 +Compiled as RELEASE +Test suite pass at GMT Sun Feb 23 02:59:02 2020