diff --git a/gml-outline-shader-drawer.resource_order b/gml-outline-shader-drawer.resource_order index 7df5c54..005de32 100644 --- a/gml-outline-shader-drawer.resource_order +++ b/gml-outline-shader-drawer.resource_order @@ -14,6 +14,7 @@ {"name":"CanvasIsCanvas","order":4,"path":"scripts/CanvasIsCanvas/CanvasIsCanvas.yy",}, {"name":"sprite_to_canvas","order":5,"path":"scripts/sprite_to_canvas/sprite_to_canvas.yy",}, {"name":"DemoPotion","order":6,"path":"objects/DemoPotion/DemoPotion.yy",}, + {"name":"sprRedPotionAnim","order":9,"path":"sprites/sprRedPotionAnim/sprRedPotionAnim.yy",}, {"name":"sprHellToHeaven","order":4,"path":"sprites/sprHellToHeaven/sprHellToHeaven.yy",}, {"name":"__CanvasCleanupQueue","order":1,"path":"scripts/__CanvasCleanupQueue/__CanvasCleanupQueue.yy",}, {"name":"__CanvasTrace","order":6,"path":"scripts/__CanvasTrace/__CanvasTrace.yy",}, diff --git a/gml-outline-shader-drawer.yyp b/gml-outline-shader-drawer.yyp index 6fc44b3..036c9a9 100644 --- a/gml-outline-shader-drawer.yyp +++ b/gml-outline-shader-drawer.yyp @@ -37,6 +37,7 @@ {"id":{"name":"sprSingleCoin","path":"sprites/sprSingleCoin/sprSingleCoin.yy",},}, {"id":{"name":"__CanvasAppSurf","path":"scripts/__CanvasAppSurf/__CanvasAppSurf.yy",},}, {"id":{"name":"DemoPotion","path":"objects/DemoPotion/DemoPotion.yy",},}, + {"id":{"name":"sprRedPotionAnim","path":"sprites/sprRedPotionAnim/sprRedPotionAnim.yy",},}, {"id":{"name":"sprHellToHeaven","path":"sprites/sprHellToHeaven/sprHellToHeaven.yy",},}, {"id":{"name":"__CanvasCleanupQueue","path":"scripts/__CanvasCleanupQueue/__CanvasCleanupQueue.yy",},}, {"id":{"name":"__CanvasTrace","path":"scripts/__CanvasTrace/__CanvasTrace.yy",},}, diff --git a/objects/DemoPotion/DemoPotion.yy b/objects/DemoPotion/DemoPotion.yy index fe9ca75..1f8b79a 100644 --- a/objects/DemoPotion/DemoPotion.yy +++ b/objects/DemoPotion/DemoPotion.yy @@ -39,8 +39,8 @@ ], "solid": false, "spriteId": { - "name": "sprRedPotion", - "path": "sprites/sprRedPotion/sprRedPotion.yy", + "name": "sprRedPotionAnim", + "path": "sprites/sprRedPotionAnim/sprRedPotionAnim.yy", }, "spriteMaskId": null, "visible": true, diff --git a/objects/OutlineObjectBaked/Create_0.gml b/objects/OutlineObjectBaked/Create_0.gml index 4136696..eef6a33 100644 --- a/objects/OutlineObjectBaked/Create_0.gml +++ b/objects/OutlineObjectBaked/Create_0.gml @@ -1,15 +1,23 @@ /// @description bake on first draw event_inherited(); -canvas = undefined; +canvas = undefined; +dynsprite = undefined; +origsprite = sprite_index; + +__browser_flip = (os_browser != browser_not_a_browser) ? -1 : 1; __free = function() { if (canvas != undefined) canvas.free(); + + if (dynsprite != undefined) + sprite_delete(dynsprite); } /// @function bake() bake = function() { - if (canvas != undefined) canvas.free(); + __free(); + origsprite = sprite_index; show_debug_message("Pre-Baking sprite '{0}' with {1} frames", sprite_get_name(sprite_index), image_number); var begintime = current_time; var shader = shd_outline; @@ -19,7 +27,7 @@ bake = function() { var u_thickness = shader_get_uniform(shader, "u_vThickness"); var u_vPulse = shader_get_uniform(shader, "u_vPulse"); - canvas = sprite_to_canvas(sprite_index, -1, outline_strength + TEXTURE_PAGE_BORDER_SIZE); + canvas = sprite_to_canvas(sprite_index, -1, outliner.outline_strength + TEXTURE_PAGE_BORDER_SIZE); // now bake it with the outliner var target = new Canvas(canvas.canvas.GetWidth(), canvas.canvas.GetHeight(), true); target.Start(); @@ -42,16 +50,26 @@ bake = function() { canvas.canvas.Free(); // ...and inject the pre-baked canvas.canvas = target; + + dynsprite = canvas.create_sprite(); + sprite_set_bbox_mode(dynsprite, bboxmode_manual); + sprite_set_bbox(dynsprite, + sprite_get_bbox_left (sprite_index) + __browser_flip * (2 * outliner.outline_strength + TEXTURE_PAGE_BORDER_SIZE / 2), + sprite_get_bbox_top (sprite_index) + __browser_flip * (2 * outliner.outline_strength + TEXTURE_PAGE_BORDER_SIZE / 2), + sprite_get_bbox_right (sprite_index) + __browser_flip * (2 * outliner.outline_strength + TEXTURE_PAGE_BORDER_SIZE / 2), + sprite_get_bbox_bottom(sprite_index) + __browser_flip * (2 * outliner.outline_strength + TEXTURE_PAGE_BORDER_SIZE / 2)); + show_debug_message("Pre-Baking took {0}ms", current_time - begintime); } __draw = function() { if (canvas == undefined) bake(); + var before = sprite_index; + sprite_index = (outline_always || (outline_on_mouse_over && mouse_is_over)) ? dynsprite : origsprite; + if (sprite_index != before && (os_browser != browser_not_a_browser)) image_yscale *= __browser_flip; image_index = canvas.get_image_index(delta_time, image_speed); - if (outline_always || (outline_on_mouse_over && mouse_is_over)) - canvas.draw_frame_ext(image_index, x, y, depth, image_xscale, image_yscale, image_angle, image_blend, image_alpha); - else - draw_self(); + + draw_self(); } if (sprite_index != -1) bake(); \ No newline at end of file diff --git a/options/html5/options_html5.yy b/options/html5/options_html5.yy index eda4049..15db4cb 100644 --- a/options/html5/options_html5.yy +++ b/options/html5/options_html5.yy @@ -3,7 +3,7 @@ "resourceVersion": "1.0", "name": "HTML5", "option_html5_allow_fullscreen": true, - "option_html5_browser_title": "Created with GameMaker", + "option_html5_browser_title": "gml-outline-shader-drawer demo", "option_html5_centregame": false, "option_html5_display_cursor": true, "option_html5_facebook_app_display_name": "", @@ -14,10 +14,10 @@ "option_html5_google_analytics_enable": false, "option_html5_google_tracking_id": "", "option_html5_icon": "${base_options_dir}/html5/fav.ico", - "option_html5_index": "", + "option_html5_index": "use_default", "option_html5_interpolate_pixels": true, "option_html5_jsprepend": "", - "option_html5_loadingbar": "", + "option_html5_loadingbar": "Use Default", "option_html5_localrunalert": true, "option_html5_outputdebugtoconsole": true, "option_html5_outputname": "index.html", diff --git a/options/windows/options_windows.yy b/options/windows/options_windows.yy index 590ca64..0591a12 100644 --- a/options/windows/options_windows.yy +++ b/options/windows/options_windows.yy @@ -4,13 +4,13 @@ "name": "Windows", "option_windows_allow_fullscreen_switching": false, "option_windows_borderless": false, - "option_windows_company_info": "YoYo Games Ltd", + "option_windows_company_info": "coldrock.games", "option_windows_copy_exe_to_dest": false, - "option_windows_copyright_info": "(c)2022 Mike Barthold aka Grisgram@github", + "option_windows_copyright_info": "(c)2022-23 coldrock.games, @grisgram at github", "option_windows_description_info": "Demo Project to show the functionality of the outline shader", "option_windows_disable_sandbox": false, "option_windows_display_cursor": true, - "option_windows_display_name": "Created with GameMaker", + "option_windows_display_name": "gml-outline-shader-drawer demo", "option_windows_enable_steam": false, "option_windows_executable_name": "${project_name}.exe", "option_windows_icon": "${base_options_dir}/windows/icons/icon.ico", diff --git a/rooms/rmDemo/rmDemo.yy b/rooms/rmDemo/rmDemo.yy index 19e4a2b..28b1746 100644 --- a/rooms/rmDemo/rmDemo.yy +++ b/rooms/rmDemo/rmDemo.yy @@ -22,7 +22,7 @@ ],"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":672.0,"y":352.0,}, {"resourceType":"GMRInstance","resourceVersion":"1.0","name":"inst_49A75E2D","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"objectId":{"name":"DemoPotion","path":"objects/DemoPotion/DemoPotion.yy",},"properties":[ {"resourceType":"GMOverriddenProperty","resourceVersion":"1.0","name":"","objectId":{"name":"OutlineObject","path":"objects/OutlineObject/OutlineObject.yy",},"propertyId":{"name":"use_bbox_of_sprite","path":"objects/OutlineObject/OutlineObject.yy",},"value":"True",}, - ],"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":992.0,"y":352.0,}, + ],"rotation":0.0,"scaleX":1.0,"scaleY":1.0,"x":960.0,"y":352.0,}, {"resourceType":"GMRInstance","resourceVersion":"1.0","name":"inst_36AD6CD4","colour":4294967295,"frozen":false,"hasCreationCode":false,"ignore":false,"imageIndex":0,"imageSpeed":1.0,"inheritCode":false,"inheritedItemId":null,"inheritItemSettings":false,"isDnd":false,"objectId":{"name":"DemoMace","path":"objects/DemoMace/DemoMace.yy",},"properties":[ {"resourceType":"GMOverriddenProperty","resourceVersion":"1.0","name":"","objectId":{"name":"OutlineObject","path":"objects/OutlineObject/OutlineObject.yy",},"propertyId":{"name":"use_bbox_of_sprite","path":"objects/OutlineObject/OutlineObject.yy",},"value":"True",}, {"resourceType":"GMOverriddenProperty","resourceVersion":"1.0","name":"","objectId":{"name":"OutlineObject","path":"objects/OutlineObject/OutlineObject.yy",},"propertyId":{"name":"pulse_active","path":"objects/OutlineObject/OutlineObject.yy",},"value":"True",}, diff --git a/scripts/sprite_to_canvas/sprite_to_canvas.gml b/scripts/sprite_to_canvas/sprite_to_canvas.gml index 6211446..498f2b3 100644 --- a/scripts/sprite_to_canvas/sprite_to_canvas.gml +++ b/scripts/sprite_to_canvas/sprite_to_canvas.gml @@ -71,13 +71,14 @@ function CanvasSprite(_canvas, _image_count, _fps, _xoffset, _yoffset, _bordersi __matrix = matrix_build(xp, yp, draw_depth, 0, 0, rot * __browser_flip, xscale, yscale * __browser_flip, 1); matrix_set(matrix_world, __matrix); //_left, _top, _width, _height, _x, _y, _xscale, _yscale, _rot, _col1, _col2, _col3, _col4, _alpha - canvas.DrawGeneral(subimages[@ frame], 0, image_width, image_height, + canvas.DrawGeneral(subimages[@ frame], 0, + image_width, image_height, -xoffset - bordersize, -yoffset - bordersize + __render_y, 1, 1, 0, col, col, col, col, alpha); matrix_set(matrix_world, matrix_build_identity()); } - /// @function get_image_index = function(_elapsed, _image_speed) + /// @function get_image_index(_elapsed, _image_speed) /// @description Should be called every STEP to ensure continuous correct animation /// when you draw this sprite manually. /// Example (STEP event): @@ -94,7 +95,16 @@ function CanvasSprite(_canvas, _image_count, _fps, _xoffset, _yoffset, _bordersi return sub_idx; } - + + /// @function create_sprite() + /// @description Creates a dynamic sprite out of the frames of this canvas surface + static create_sprite = function() { + var rv = sprite_create_from_surface(canvas.GetSurfaceID(),0,0,image_width,image_height,false,false,xoffset+bordersize,yoffset+bordersize); + for (var i = 1, len = array_length(subimages); i < len; i++) + sprite_add_from_surface(rv,canvas.GetSurfaceID(),subimages[@i],0,image_width,image_height,false,false); + return rv; + } + /// @function free() /// @description Release the underlying canvas static free = function() { diff --git a/sprites/sprRedPotionAnim/3c283983-d86f-4db3-93bb-176648960364.png b/sprites/sprRedPotionAnim/3c283983-d86f-4db3-93bb-176648960364.png new file mode 100644 index 0000000..c328044 Binary files /dev/null and b/sprites/sprRedPotionAnim/3c283983-d86f-4db3-93bb-176648960364.png differ diff --git a/sprites/sprRedPotionAnim/5b56b045-6b93-4bd9-bf98-a12301c96f2a.png b/sprites/sprRedPotionAnim/5b56b045-6b93-4bd9-bf98-a12301c96f2a.png new file mode 100644 index 0000000..726e38c Binary files /dev/null and b/sprites/sprRedPotionAnim/5b56b045-6b93-4bd9-bf98-a12301c96f2a.png differ diff --git a/sprites/sprRedPotionAnim/f69bea07-ccd3-4476-abf9-0dd3cd20e991.png b/sprites/sprRedPotionAnim/f69bea07-ccd3-4476-abf9-0dd3cd20e991.png new file mode 100644 index 0000000..251e014 Binary files /dev/null and b/sprites/sprRedPotionAnim/f69bea07-ccd3-4476-abf9-0dd3cd20e991.png differ diff --git a/sprites/sprRedPotionAnim/layers/3c283983-d86f-4db3-93bb-176648960364/94388683-76af-4de2-aa2c-06580b1f2e87.png b/sprites/sprRedPotionAnim/layers/3c283983-d86f-4db3-93bb-176648960364/94388683-76af-4de2-aa2c-06580b1f2e87.png new file mode 100644 index 0000000..c328044 Binary files /dev/null and b/sprites/sprRedPotionAnim/layers/3c283983-d86f-4db3-93bb-176648960364/94388683-76af-4de2-aa2c-06580b1f2e87.png differ diff --git a/sprites/sprRedPotionAnim/layers/5b56b045-6b93-4bd9-bf98-a12301c96f2a/94388683-76af-4de2-aa2c-06580b1f2e87.png b/sprites/sprRedPotionAnim/layers/5b56b045-6b93-4bd9-bf98-a12301c96f2a/94388683-76af-4de2-aa2c-06580b1f2e87.png new file mode 100644 index 0000000..726e38c Binary files /dev/null and b/sprites/sprRedPotionAnim/layers/5b56b045-6b93-4bd9-bf98-a12301c96f2a/94388683-76af-4de2-aa2c-06580b1f2e87.png differ diff --git a/sprites/sprRedPotionAnim/layers/f69bea07-ccd3-4476-abf9-0dd3cd20e991/94388683-76af-4de2-aa2c-06580b1f2e87.png b/sprites/sprRedPotionAnim/layers/f69bea07-ccd3-4476-abf9-0dd3cd20e991/94388683-76af-4de2-aa2c-06580b1f2e87.png new file mode 100644 index 0000000..251e014 Binary files /dev/null and b/sprites/sprRedPotionAnim/layers/f69bea07-ccd3-4476-abf9-0dd3cd20e991/94388683-76af-4de2-aa2c-06580b1f2e87.png differ diff --git a/sprites/sprRedPotionAnim/sprRedPotionAnim.yy b/sprites/sprRedPotionAnim/sprRedPotionAnim.yy new file mode 100644 index 0000000..0d45891 --- /dev/null +++ b/sprites/sprRedPotionAnim/sprRedPotionAnim.yy @@ -0,0 +1,78 @@ +{ + "resourceType": "GMSprite", + "resourceVersion": "1.0", + "name": "sprRedPotionAnim", + "bbox_bottom": 237, + "bbox_left": 0, + "bbox_right": 127, + "bbox_top": 0, + "bboxMode": 0, + "collisionKind": 1, + "collisionTolerance": 0, + "DynamicTexturePage": false, + "edgeFiltering": false, + "For3D": false, + "frames": [ + {"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"3c283983-d86f-4db3-93bb-176648960364",}, + {"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"f69bea07-ccd3-4476-abf9-0dd3cd20e991",}, + {"resourceType":"GMSpriteFrame","resourceVersion":"1.1","name":"5b56b045-6b93-4bd9-bf98-a12301c96f2a",}, + ], + "gridX": 0, + "gridY": 0, + "height": 238, + "HTile": false, + "layers": [ + {"resourceType":"GMImageLayer","resourceVersion":"1.0","name":"94388683-76af-4de2-aa2c-06580b1f2e87","blendMode":0,"displayName":"default","isLocked":false,"opacity":100.0,"visible":true,}, + ], + "nineSlice": null, + "origin": 4, + "parent": { + "name": "objects", + "path": "folders/demo/objects.yy", + }, + "preMultiplyAlpha": false, + "sequence": { + "resourceType": "GMSequence", + "resourceVersion": "1.4", + "name": "sprRedPotionAnim", + "autoRecord": true, + "backdropHeight": 768, + "backdropImageOpacity": 0.5, + "backdropImagePath": "", + "backdropWidth": 1366, + "backdropXOffset": 0.0, + "backdropYOffset": 0.0, + "events": {"resourceType":"KeyframeStore","resourceVersion":"1.0","Keyframes":[],}, + "eventStubScript": null, + "eventToFunction": {}, + "length": 3.0, + "lockOrigin": false, + "moments": {"resourceType":"KeyframeStore","resourceVersion":"1.0","Keyframes":[],}, + "playback": 1, + "playbackSpeed": 8.0, + "playbackSpeedType": 0, + "showBackdrop": true, + "showBackdropImage": false, + "timeUnits": 1, + "tracks": [ + {"resourceType":"GMSpriteFramesTrack","resourceVersion":"1.0","name":"frames","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"resourceType":"KeyframeStore","resourceVersion":"1.0","Keyframes":[ + {"resourceType":"Keyframe","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"3c283983-d86f-4db3-93bb-176648960364","path":"sprites/sprRedPotionAnim/sprRedPotionAnim.yy",},},},"Disabled":false,"id":"e9105089-e70b-4dfd-a52c-1baea9fb27f9","IsCreationKey":false,"Key":0.0,"Length":1.0,"Stretch":false,}, + {"resourceType":"Keyframe","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"f69bea07-ccd3-4476-abf9-0dd3cd20e991","path":"sprites/sprRedPotionAnim/sprRedPotionAnim.yy",},},},"Disabled":false,"id":"4c945fc6-ae5d-4d10-b008-c442cd15000e","IsCreationKey":false,"Key":1.0,"Length":1.0,"Stretch":false,}, + {"resourceType":"Keyframe","resourceVersion":"1.0","Channels":{"0":{"resourceType":"SpriteFrameKeyframe","resourceVersion":"1.0","Id":{"name":"5b56b045-6b93-4bd9-bf98-a12301c96f2a","path":"sprites/sprRedPotionAnim/sprRedPotionAnim.yy",},},},"Disabled":false,"id":"9a99b58b-3a0b-4736-868d-caf34a61f149","IsCreationKey":false,"Key":2.0,"Length":1.0,"Stretch":false,}, + ],},"modifiers":[],"spriteId":null,"trackColour":0,"tracks":[],"traits":0,}, + ], + "visibleRange": null, + "volume": 1.0, + "xorigin": 64, + "yorigin": 119, + }, + "swatchColours": null, + "swfPrecision": 2.525, + "textureGroupId": { + "name": "Default", + "path": "texturegroups/Default", + }, + "type": 0, + "VTile": false, + "width": 128, +} \ No newline at end of file