Line 96: |
Line 96: |
| var window = canvas.Window.new([512,512],"dialog"); | | var window = canvas.Window.new([512,512],"dialog"); |
| window.setCanvas(myCanvas); | | window.setCanvas(myCanvas); |
| + | </syntaxhighlight> |
| + | |
| + | Here's another slightly-restructured version (untested), to better encapsulate the concept of a "managed texture" so that the code can be reused for other aircraft/purposes, e.g. for placing bullet holes etc: |
| + | <syntaxhighlight lang="nasal"> |
| + | var ManagedTexture = { |
| + | |
| + | # this create a new TextureManager object |
| + | new: func(name, size, path) { |
| + | # create a temporary object that inherits from TextureManager |
| + | var m = {parents:[ManagedTexture]}; |
| + | |
| + | # Create a standalone Canvas (not attached to any GUI dialog/aircraft etc) |
| + | m.canvas = canvas.new({ |
| + | "name": name, # The name is optional but allow for easier identification |
| + | "size": [size[0], size[1]], # Size of the underlying texture (should be a power of 2, required) [Resolution] |
| + | "view": [size[0], size[1]], # Virtual resolution (Defines the coordinate system of the canvas [Dimensions] |
| + | # which will be stretched the size of the texture, required) |
| + | "mipmapping": 1 # Enable mipmapping (optional) |
| + | }); |
| + | |
| + | # create our top-level/root group that contains all other Canvas elements |
| + | m.root = m.canvas.createGroup(); |
| + | |
| + | # hash with all layers/images added |
| + | m.layers = {}; |
| + | var.basepath = path; |
| + | |
| + | # return the new object to the caller |
| + | return m; |
| + | }, |
| + | |
| + | replaceTexture: func(name) { |
| + | # Add a placement by replacing the textured face specified (name) in the 3D model |
| + | # This replaces the texture on the aircraft and attaches the Canvas texture |
| + | m.canvas.addPlacement({"node": name}); |
| + | }, |
| + | |
| + | addDynamicLayer: func(filename, callback=nil) { |
| + | if(contains(layers, image)) print("Warning: replacing texture (added twice): ", image); |
| + | # Put a raster image into the canvas and save the image in a hash: layers['EF2000.png].hide(); |
| + | m.layers[image] = root.createChild("image") |
| + | .setFile( path~image ) |
| + | .setSize(2048,2048) |
| + | return m.layers[image]; |
| + | }, |
| + | }; # of ManagedTexture |
| + | |
| + | |
| + | # now, create a new managed texture, specifying the path to use for texture lookups |
| + | var ExhaustDirt = ManagedTexture.new( name:"ExhaustDirt", |
| + | size:[2048,2048], |
| + | path:'Aircraft/EF2000/Models/' ); |
| + | |
| + | ExhaustDirt.replaceTexture('Fuselage'); |
| + | |
| + | # Create a Canvas dialog window to hold the canvas and show that it's working |
| + | # the Canvas is now standalone, i.e. continues to live once the dialog is closed! |
| + | var window = canvas.Window.new([512,512],"dialog"); |
| + | window.setCanvas(ExhaustDirt.canvas); |
| + | |
| + | foreach(var layer; [ {file:'EF2000.png'}, |
| + | {file:'EF2000-dirt.png'} ]) { |
| + | ExhaustDirt.addDynamicLayer(layer.file); |
| + | } |
| + | |
| + | |
| + | var timer_hide = maketimer(3.0, func() { |
| + | ExhaustDirt.layers['EF2000-dirt.png'].hide(); |
| + | }); |
| + | |
| + | var timer_show = maketimer(5.0, func() { |
| + | ExhaustDirt.layers['EF2000-dirt.png'].show(); |
| + | }); |
| + | |
| + | # start those two timers to hide/show the dirt texture with 2 second delays |
| + | timer_hide.start(); |
| + | timer_show.start(); |
| + | |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |