From d79a8f960240df8a68d1f94f4bac7e21bd69e1fd Mon Sep 17 00:00:00 2001 From: n00b Date: Sat, 23 Nov 2024 09:46:33 -0500 Subject: [PATCH] Added default material for drawing 2D objects --- rcbasic_runtime/main.cpp | 7 +- rcbasic_runtime/rc_gfx.h | 107 +++++++++++++++---------- rcbasic_runtime/rc_gfx_core.h | 26 ++++++ rcbasic_runtime/rc_os_defines.h | 2 +- rcbasic_runtime/rcbasic_runtime.depend | 6 +- 5 files changed, 100 insertions(+), 48 deletions(-) diff --git a/rcbasic_runtime/main.cpp b/rcbasic_runtime/main.cpp index beca67e..649b5e9 100755 --- a/rcbasic_runtime/main.cpp +++ b/rcbasic_runtime/main.cpp @@ -4442,7 +4442,12 @@ int main(int argc, char * argv[]) //ogles2 test #ifdef RC_TESTING - rc_intern_dirChange("/home/n00b/projects/rcbasic_alpha3/test_project"); + std::string debug_opt = "a"; + std::cin >> debug_opt; + if(debug_opt.compare("a")==0) + rc_intern_dirChange("/home/n00b/Downloads/Shuffleboard/"); + else + rc_intern_dirChange("/home/n00b/projects/rcbasic_alpha3/test_project"); #endif //--------------- diff --git a/rcbasic_runtime/rc_gfx.h b/rcbasic_runtime/rc_gfx.h index 40a51ca..ffa1434 100644 --- a/rcbasic_runtime/rc_gfx.h +++ b/rcbasic_runtime/rc_gfx.h @@ -868,6 +868,24 @@ void sortCanvasZ() //std::cout << std::endl; } +void rc_setActiveCanvas(int canvas_id) +{ + rc_active_canvas = canvas_id; + + if(rc_active_canvas >= 0 && rc_active_canvas < rc_canvas.size()) + { + if(rc_canvas[rc_active_canvas].texture) + VideoDriver->setRenderTarget(rc_canvas[rc_active_canvas].texture, false, false); + + rc_setDriverMaterial(); + } +} + +int rc_activeCanvas() +{ + return rc_active_canvas; +} + int rc_canvasOpen(int w, int h, int vx, int vy, int vw, int vh, int mode, int canvas_type=RC_CANVAS_TYPE_2D) { if(!VideoDriver) @@ -962,7 +980,10 @@ int rc_canvasOpen(int w, int h, int vx, int vy, int vw, int vh, int mode, int ca } if(rc_active_canvas < 0) - rc_active_canvas = canvas_id; + { + rc_active_canvas = canvas_id; + rc_setActiveCanvas(rc_active_canvas); + } for(int i = 0; i < rc_canvas_zOrder.size(); i++) { @@ -1052,28 +1073,22 @@ void rc_setCanvasPhysics2D(int canvas_id, bool flag) rc_canvas[canvas_id].physics2D.enabled = flag; } -void rc_setActiveCanvas(int canvas_id) -{ - rc_active_canvas = canvas_id; - - if(rc_active_canvas >= 0 && rc_active_canvas < rc_canvas.size()) - { - if(rc_canvas[rc_active_canvas].texture) - VideoDriver->setRenderTarget(rc_canvas[rc_active_canvas].texture, false, false); - } -} - -int rc_activeCanvas() -{ - return rc_active_canvas; -} void rc_clearCanvas() { if(rc_active_canvas >= 0 && rc_active_canvas < rc_canvas.size()) { if(rc_canvas[rc_active_canvas].texture) - VideoDriver->clearBuffers(true, true, true, rc_clear_color); + switch(rc_canvas[rc_active_canvas].type) + { + case RC_CANVAS_TYPE_2D: + VideoDriver->clearBuffers(true, true, true, rc_clear_color); + break; + default: + VideoDriver->clearBuffers(true, true, true, rc_clear_color); + break; + } + } } @@ -1438,13 +1453,6 @@ void rc_drawRectFill(int x, int y, int w, int h) VideoDriver->draw2DRectangle(rc_active_color, r); } -void rc_drawCircle(int x, int y, double r) -{ - irr::core::vector2d r_pos(x,y); - - VideoDriver->draw2DPolygon(r_pos, r, rc_active_color, 30); -} - //Filled Circle Code from CuteAlien on Irrlicht forum @@ -1476,23 +1484,6 @@ void makeCircle(irr::core::array& vertices, irr::core::ar } } -void rc_drawCircleFill(int x, int y, double r) -{ - irr::core::vector2d r_pos(x,y); - - // create the circle - irr::core::array verticesCircle; - irr::core::array indicesCircle; - CircleSettings circle; - circle.center = r_pos; - circle.radius = r; - circle.color = rc_active_color; - makeCircle(verticesCircle, indicesCircle, circle); - - VideoDriver->draw2DVertexPrimitiveList(verticesCircle.pointer(), verticesCircle.size(), - indicesCircle.pointer(), indicesCircle.size()-2, video::EVT_STANDARD, scene::EPT_TRIANGLE_FAN, - video::EIT_16BIT); -} void rc_drawLine(int x1, int y1, int x2, int y2) { @@ -1542,8 +1533,8 @@ void makeEllipse(irr::core::array& vertices, irr::core::a int ry = settings.radius; for ( u32 i=1; i < settings.numVertices; i++ ) { - irr::f32 x = rx * std::cos( radians(i*stepSize) ) + centerf.Y ; - irr::f32 y = ry * std::sin( radians(i*stepSize) ) + centerf.X ; + irr::f32 x = rx * std::cos( radians(i*stepSize) ) + centerf.X ; + irr::f32 y = ry * std::sin( radians(i*stepSize) ) + centerf.Y ; vertices[i] = video::S3DVertex(x, y, 0.f, 0.f, 1.f, 0.f, settings.color, 0.5f, 0.5f); } @@ -1566,6 +1557,7 @@ void rc_drawEllipse(int x, int y, int rx, int ry) for(int i = 2; i < verticesCircle.size(); i++) { + //std::cout << "V[" << i << "] = (" << verticesCircle[i-1].Pos.X << ", " << verticesCircle[i-1].Pos.Y << ") (" << verticesCircle[i].Pos.X << ", " << verticesCircle[i].Pos.Y << ")" << std::endl; rc_drawLine(verticesCircle[i-1].Pos.X, verticesCircle[i-1].Pos.Y, verticesCircle[i].Pos.X, verticesCircle[i].Pos.Y); } @@ -1573,6 +1565,7 @@ void rc_drawEllipse(int x, int y, int rx, int ry) rc_drawLine(verticesCircle[n].Pos.X, verticesCircle[n].Pos.Y, verticesCircle[1].Pos.X, verticesCircle[1].Pos.Y); } + void rc_drawEllipseFill(int x, int y, int rx, int ry) { irr::core::vector2d r_pos(x,y); @@ -1593,6 +1586,31 @@ void rc_drawEllipseFill(int x, int y, int rx, int ry) video::EIT_16BIT); } +void rc_drawCircle(int x, int y, double r) +{ + rc_drawEllipse(x, y, r, r); +} + +void rc_drawCircleFill(int x, int y, double r) +{ + rc_drawEllipseFill(x, y, r, r); + return; + + irr::core::vector2d r_pos(x,y); + + // create the circle + irr::core::array verticesCircle; + irr::core::array indicesCircle; + CircleSettings circle; + circle.center = r_pos; + circle.radius = r; + circle.color = rc_active_color; + makeCircle(verticesCircle, indicesCircle, circle); + + VideoDriver->draw2DVertexPrimitiveList(verticesCircle.pointer(), verticesCircle.size(), + indicesCircle.pointer(), indicesCircle.size()-2, video::EVT_STANDARD, scene::EPT_TRIANGLE_FAN, + video::EIT_16BIT); +} int rc_loadFont(std::string fnt_file, int font_size) @@ -2314,6 +2332,7 @@ void rc_getImageBuffer(int img_id, double * pdata) void rc_setBilinearFilter(bool flag) { rc_bilinear_filter = flag; + rc_setDriverMaterial(); } bool rc_getBilinearFilter() @@ -2361,6 +2380,8 @@ void rc_setBlendMode(int blend_mode) case 8: rc_blend_mode = EBO_MIN_ALPHA; break; case 9: rc_blend_mode = EBO_MAX_ALPHA; break; } + + rc_setDriverMaterial(); } int rc_getBlendMode() diff --git a/rcbasic_runtime/rc_gfx_core.h b/rcbasic_runtime/rc_gfx_core.h index 30d453f..1e2ff96 100644 --- a/rcbasic_runtime/rc_gfx_core.h +++ b/rcbasic_runtime/rc_gfx_core.h @@ -738,6 +738,28 @@ irr::video::E_BLEND_OPERATION rc_blend_mode = irr::video::EBO_ADD; bool rc_bilinear_filter = false; +void rc_setDriverMaterial() +{ + if(!VideoDriver) + return; + + irr::video::SMaterial material; + material.Lighting = false; + material.ZWriteEnable = irr::video::EZW_OFF; + material.ZBuffer = false; + material.BackfaceCulling = false; + material.TextureLayer[0].Texture = 0; + material.TextureLayer[0].BilinearFilter = rc_bilinear_filter; + material.MaterialTypeParam = irr::video::pack_textureBlendFunc(irr::video::EBF_SRC_ALPHA, irr::video::EBF_ONE_MINUS_SRC_ALPHA, irr::video::EMFN_MODULATE_1X, irr::video::EAS_TEXTURE | irr::video::EAS_VERTEX_COLOR); + material.BlendOperation = rc_blend_mode; + material.BlendOperation = irr::video::EBO_ADD; + + material.MaterialType = irr::video::EMT_ONETEXTURE_BLEND; + + VideoDriver->setMaterial(material); +} + + void draw2DImage(irr::video::IVideoDriver *driver, irr::video::ITexture* texture, irr::core::rect sourceRect, irr::core::position2d position, irr::core::position2d rotationPoint, irr::f32 rotation, irr::core::vector2df scale, bool useAlphaChannel, irr::video::SColor color, irr::core::vector2d screenSize) { if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) @@ -826,6 +848,8 @@ void draw2DImage(irr::video::IVideoDriver *driver, irr::video::ITexture* texture driver->setTransform(irr::video::ETS_PROJECTION,oldProjMat); driver->setTransform(irr::video::ETS_VIEW,oldViewMat); driver->setTransform(irr::video::ETS_WORLD,oldWorldMat); + + rc_setDriverMaterial(); } void draw2DImage2(irr::video::IVideoDriver *driver, irr::video::ITexture* texture, irr::core::rect sourceRect, irr::core::rect destRect, irr::core::position2d rotationPoint, irr::f32 rotation, bool useAlphaChannel, irr::video::SColor color, irr::core::vector2d screenSize ) @@ -916,6 +940,8 @@ void draw2DImage2(irr::video::IVideoDriver *driver, irr::video::ITexture* textur driver->setTransform(irr::video::ETS_PROJECTION,oldProjMat); driver->setTransform(irr::video::ETS_VIEW,oldViewMat); driver->setTransform(irr::video::ETS_WORLD,oldWorldMat); + + rc_setDriverMaterial(); } diff --git a/rcbasic_runtime/rc_os_defines.h b/rcbasic_runtime/rc_os_defines.h index c4814d6..b73a342 100755 --- a/rcbasic_runtime/rc_os_defines.h +++ b/rcbasic_runtime/rc_os_defines.h @@ -2,7 +2,7 @@ #define RC_OS_DEFINES_H_INCLUDED //USED FOR TESTING ONLY -#define RC_TESTING +//#define RC_TESTING //I am checking Android first since I think it also defines __linux__ diff --git a/rcbasic_runtime/rcbasic_runtime.depend b/rcbasic_runtime/rcbasic_runtime.depend index 371a48c..20638a6 100755 --- a/rcbasic_runtime/rcbasic_runtime.depend +++ b/rcbasic_runtime/rcbasic_runtime.depend @@ -1,5 +1,5 @@ # depslib dependency file v1.0 -1731732087 source:/home/n00b/Projects/RCBASIC4/rcbasic_runtime/main.cpp +1732327607 source:/home/n00b/Projects/RCBASIC4/rcbasic_runtime/main.cpp "rc_os_defines.h" @@ -1247,7 +1247,7 @@ 1727545973 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/RealisticWater.h -1731729981 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx.h +1732372520 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx.h "SDL.h" @@ -1271,7 +1271,7 @@ "rc_joints.h" -1731727404 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx_core.h +1732372339 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx_core.h "SDL.h" "btBulletDynamicsCommon.h" "BulletSoftBody/btSoftRigidDynamicsWorld.h"