[Request] Custom (procedural) Drawing API
Posted: Fri Dec 26, 2014 7:20 pm
This might've been requested before, but I couldn't find that thread, so I'm creating this. Whenever developers get time.
This is a pretty simple request: I want to draw things onto the backbuffer, but before the GUI is drawn.
I'd like to see a drawing API with LUA bindings. This would make me =>
Perhaps the drawing API must be used within a lua callback, named something like onUserRender(dt) ?
BUT, screen-coordinates-from-entity is a needed API in addition to this. getEntityPos[ X or Y ](entity);
I'd like to draw beams (gradient line) between two points, and their endpoints (gradient circle). (c:color, a:alpha)
- beam (color interpolated line) : drawLineGradient( x1, y1, x2, y2, halfWidth, c1, c2, c3, c4, a1, a2, a3, a4 )
- radial (color interpolated circle) : drawCircleGradient( x, y, radius, color1, color2 )
Additional geometry that could be drawn might include:
- lines : drawLine ( x1,y1, x2,y2, color, alpha, [thickness] )
- circles : drawCircle ( x,y, radius, color, alpha, [bool: filled] )
- rectangles : drawRect ( x,y, w,h, color, alpha, [bool: filled] )
- triangles : drawTriangle ( x1,y1, x2,y2, x3,y3, color, alpha, [bool: filled] )
- *sprites : drawSprite ( sprite, frame, x, y, scaleX, scaleY, rotation, color, alpha ) - example.
* For sprites: When a mod is loaded, the modder is responsible for calling a sprite loading API. Returns an integer handle.
For example, a line shape can easily be created in c++, and that might end up looking like the following code:
This is just a start, but this could be the beginning of some pretty nice visual Factorio modding.
I've been programming in C++ for about 11 years now, I could implement this drawing API pretty quickly myself.
This is a fast and simple solution, it works for batching polygons just as well as it works for direct blitting.
This API could definitely get more advanced, for producing more interesting effects, tiled, wrapped, offset UV on shapes, etc.
Anyway, I hope someone see this, read this, and hopefully like this request. Unfortunately I'm not a factorio dev, heh.
This is a pretty simple request: I want to draw things onto the backbuffer, but before the GUI is drawn.
I'd like to see a drawing API with LUA bindings. This would make me =>
Perhaps the drawing API must be used within a lua callback, named something like onUserRender(dt) ?
BUT, screen-coordinates-from-entity is a needed API in addition to this. getEntityPos[ X or Y ](entity);
I'd like to draw beams (gradient line) between two points, and their endpoints (gradient circle). (c:color, a:alpha)
- beam (color interpolated line) : drawLineGradient( x1, y1, x2, y2, halfWidth, c1, c2, c3, c4, a1, a2, a3, a4 )
- radial (color interpolated circle) : drawCircleGradient( x, y, radius, color1, color2 )
Additional geometry that could be drawn might include:
- lines : drawLine ( x1,y1, x2,y2, color, alpha, [thickness] )
- circles : drawCircle ( x,y, radius, color, alpha, [bool: filled] )
- rectangles : drawRect ( x,y, w,h, color, alpha, [bool: filled] )
- triangles : drawTriangle ( x1,y1, x2,y2, x3,y3, color, alpha, [bool: filled] )
- *sprites : drawSprite ( sprite, frame, x, y, scaleX, scaleY, rotation, color, alpha ) - example.
* For sprites: When a mod is loaded, the modder is responsible for calling a sprite loading API. Returns an integer handle.
For example, a line shape can easily be created in c++, and that might end up looking like the following code:
Code: Select all
void drawLine( const vec2f& pt1, const vec2f& pt2, float halfWidth, int color, float alpha ) {
float a = atan2( pt2.y - pt1.y, pt2.x - pt1.x );
float s = halfWidth * sin( a );
float c = halfWidth * cos( a );
vec2f p1 = vec2f( pt1.x + s, pt1.y - c );
vec2f p2 = vec2f( pt2.x + s, pt2.y - c );
vec2f p3 = vec2f( pt2.x - s, pt2.y + c );
vec2f p4 = vec2f( pt1.x - s, pt1.y + c );
drawTriangle( p1, p2, p3, color, alpha ); //NOTE: Shapes may be batched :)
drawTriangle( p3, p4, p1, color, alpha ); // - And later actually drawn in a single draw call.
}
I've been programming in C++ for about 11 years now, I could implement this drawing API pretty quickly myself.
This is a fast and simple solution, it works for batching polygons just as well as it works for direct blitting.
This API could definitely get more advanced, for producing more interesting effects, tiled, wrapped, offset UV on shapes, etc.
Anyway, I hope someone see this, read this, and hopefully like this request. Unfortunately I'm not a factorio dev, heh.