{"id":4911,"date":"2014-02-03T20:27:30","date_gmt":"2014-02-03T20:27:30","guid":{"rendered":"http:\/\/www.west-racing.com\/mf\/?page_id=4911"},"modified":"2014-02-04T14:16:16","modified_gmt":"2014-02-04T14:16:16","slug":"megascatter-scripting","status":"publish","type":"page","link":"http:\/\/www.west-racing.com\/mf\/?page_id=4911","title":{"rendered":"MegaScatter Scripting"},"content":{"rendered":"<p>This page will show the public values and methods available to scripters to control the MegaScatter system.<\/p>\n<h3>MegaScatter Enums<\/h3>\n<p>This holds the two types that control how many scattered objects appear in the scene.<br \/>\n[cc lang=&#8221;c#&#8221;]public enum MegaScatterMode<br \/>\n{<br \/>\n\tDensity,<br \/>\n\tCount,<br \/>\n}[\/cc]<\/p>\n<h4><strong>Density<\/strong><\/h4>\n<p>Scatter count is calculated from Area of meshes and splines.<\/p>\n<h4><strong>Count<\/strong><\/h4>\n<p>Scatter count is set via the Count values in MegaScatter and MegaScatterMeshInf classes.<\/p>\n<h3>MegaScatterCol Class<\/h3>\n<p>This simple class is used for Texture scatter objects to define color masks.<br \/>\n[cc lang=&#8221;c#&#8221;]public class MegaScatterCol<br \/>\n{<br \/>\n\tpublic Color lowcol;<br \/>\n\tpublic Color highcol;<br \/>\n}[\/cc]<\/p>\n<h3>Members<\/h3>\n<h4><strong>lowcol<\/strong><\/h4>\n<p>Defines the start of a color range used by Texture scatter classes, texture color will need to fall between this and highcol for an object to be placed.<\/p>\n<h4><strong>highcol<\/strong><\/h4>\n<p>Defines the end of a color range used by Texture scatter classes, texture color will need to fall between this and lowcol for an object to be placed.<\/p>\n<h3>MegaScatterLayer Class<\/h3>\n<p>This is the main Scatter Layer<br \/>\n[cc lang=&#8221;c#&#8221;]public class MegaScatterLayer<br \/>\n{<br \/>\n\tpublic string\t\t\t\tLayerName;<br \/>\n\tpublic bool\t\t\t\t\tEnabled;<br \/>\n\tpublic GameObject\t\t\tobj;<br \/>\n\tpublic float\t\t\t\tweight;<br \/>\n\tpublic float\t\t\t\tscale;<br \/>\n\tpublic bool\t\t\t\t\tuniformScaling;<br \/>\n\tpublic float\t\t\t\tuniscaleLow;<br \/>\n\tpublic float\t\t\t\tuniscaleHigh;<br \/>\n\tpublic Vector3\t\t\t\tprerot;<br \/>\n\tpublic Vector3\t\t\t\tscaleLow;<br \/>\n\tpublic Vector3\t\t\t\tscaleHigh;<br \/>\n\tpublic Vector3\t\t\t\trotLow;<br \/>\n\tpublic Vector3\t\t\t\trotHigh;<br \/>\n\tpublic Vector3\t\t\t\toffsetLow;<br \/>\n\tpublic Vector3\t\t\t\toffsetHigh;<br \/>\n\tpublic Vector3\t\t\t\tsnap;<br \/>\n\tpublic Vector3\t\t\t\tsnapRot;<br \/>\n\tpublic AnimationCurve\t\tdistCrv;<br \/>\n\tpublic int\t\t\t\t\tseed;<br \/>\n\tpublic bool\t\t\t\t\tnoOverlap;<br \/>\n\tpublic float\t\t\t\tradius;<br \/>\n\tpublic float\t\t\t\tcolradiusadj;<br \/>\n\tpublic int\t\t\t\t\traycount;<br \/>\n\tpublic float\t\t\t\talign;<br \/>\n\tpublic bool\t\t\t\t\tclearOverlap;<br \/>\n\tpublic bool\t\t\t\t\tmarkstatic;<br \/>\n\tpublic float\t\t\t\tminDistance;<br \/>\n\tpublic float\t\t\t\tmaxDistance;<br \/>\n\tpublic float\t\t\t\tcolAmt;<br \/>\n\tpublic AnimationCurve\t\tcolcurve;<br \/>\n\tpublic int\t\t\t\t\tforcecount;<br \/>\n\tpublic int\t\t\t\t\tmaxcount;<br \/>\n\tpublic bool\t\t\t\t\tperCurveCount;<br \/>\n\tpublic List<MegaScatterCol>\tscattercols;<br \/>\n\tpublic AnimationCurve\t\tscaleOnDist;<br \/>\n\tpublic int\t\t\t\t\tvertexlimit;<br \/>\n\tpublic bool\t\t\t\t\tvertexnoise;<br \/>\n\tpublic float\t\t\t\tnoisescale;<br \/>\n\tpublic Vector3\t\t\t\tstrength;<br \/>\n\tpublic List<Color>\t\t\tcolvariations;<br \/>\n\tpublic float\t\t\t\tminslope;<br \/>\n\tpublic float\t\t\t\tmaxslope;<br \/>\n\tpublic float\t\t\t\tcollisionOffset;<br \/>\n\tpublic bool\t\t\t\t\tuseheight;<br \/>\n\tpublic float\t\t\t\tminheight;<br \/>\n\tpublic float\t\t\t\tmaxheight;<br \/>\n}[\/cc]<\/p>\n<h3>Members<\/h3>\n<h4><strong>LayerName<\/strong><\/h4>\n<p>Name for the layer.<\/p>\n<h4><strong>Enabled<\/strong><\/h4>\n<p>Whether the layer is active in the scatter or not.<\/p>\n<h4><strong>obj<\/strong><\/h4>\n<p>The source object to use for this layer.<\/p>\n<h4><strong>weight<\/strong><\/h4>\n<p>How much this layer will contribute to the overall scatter count. The higher the number relative to other layers the more of this layer object will be in the scatter.<\/p>\n<h4><strong>scale<\/strong><\/h4>\n<p>A quick scale value for this layer, makes it easier if you have source objects of different sizes.<\/p>\n<h4><strong>uniformScaling<\/strong><\/h4>\n<p>Should the random scaling be uniform across all axis or use per axis values. If true then uniscalelow and uniscalehigh will be used as the scaling range, if false scaleLow and scaleHigh will be used.<\/p>\n<h4><strong>uniscaleLow<\/strong><\/h4>\n<p>The low value for the uniform scaling variation.<\/p>\n<h4><strong>uniscaleHigh<\/strong><\/h4>\n<p>The high value for the uniform scaling variation.<\/p>\n<h4><strong>prerot<\/strong><\/h4>\n<p>Some objects have differnt up values etc, so here you can correct that so objects appear correctly when scattered.<\/p>\n<h4><strong>scaleLow<\/strong><\/h4>\n<p>The low scale Vector3 value to use for scaling variation.<\/p>\n<h4><strong>scaleHigh<\/strong><\/h4>\n<p>The high scale Vector3 value to use for scaling variation.<\/p>\n<h4><strong>rotLow<\/strong><\/h4>\n<p>The low rotation Vector3 value to use for rotation variation.<\/p>\n<h4><strong>rotHigh<\/strong><\/h4>\n<p>The high scale Vector3 value to use for rotation variation.<\/p>\n<h4><strong>offsetLow<\/strong><\/h4>\n<p>The low offset Vector3 value to use for positioning variation.<\/p>\n<h4><strong>offsetHigh<\/strong><\/h4>\n<p>The high offset Vector3 value to use for positioning variation.<\/p>\n<h4><strong>snap<\/strong><\/h4>\n<p>The position snap values, use this to make objects snap to grid positions.<\/p>\n<h4><strong>snapRot<\/strong><\/h4>\n<p>The rotation snap values, use this to make scatter objects only use certain angles.<\/p>\n<h4><strong>distCrv<\/strong><\/h4>\n<p>This curve describes the distribution of the random number.<\/p>\n<h4><strong>seed<\/strong><\/h4>\n<p>The random number seed for the layer.<\/p>\n<h4><strong>noOverlap<\/strong><\/h4>\n<p>Set tto true if you want the system to check for overlapping objects.<\/p>\n<h4><strong>radius<\/strong><\/h4>\n<p>The radius for the layer used in the overlap test.<\/p>\n<h4><strong>colradiusadj<\/strong><\/h4>\n<p>When scattering against walls etc you can increase the radius check size to force things away from ignore objects, Has no effect on overlap just on ignore objects.<\/p>\n<h4><strong>raycount<\/strong><\/h4>\n<p>Number of rays to use in the raycasts, the more used the more accurate the tests.<\/p>\n<h4><strong>align<\/strong><\/h4>\n<p>Value from 0 to 1 to say how much the layer should align with any ground object.<\/p>\n<h4><strong>clearOverlap<\/strong><\/h4>\n<p>Clears the overlap data so layer can overlap already scattered objects but not itself.<\/p>\n<h4><strong>markstatic<\/strong><\/h4>\n<p>Marks any created objects as static in the scene.<\/p>\n<h4><strong>minDistance<\/strong><\/h4>\n<p>For scatter along objects this is the min distance from the spline an object can appear, 0 means on the spline.<\/p>\n<h4><strong>maxDistance<\/strong><\/h4>\n<p>For scatter along objects this is the max distance from the spline an object can appear.<\/p>\n<h4><strong>colAmt<\/strong><\/h4>\n<p>How much the vertical coloring alpha is applied to the layer.<\/p>\n<h4><strong>colcurve<\/strong><\/h4>\n<p>Curve that controls the vertical coloring of the mesh alpha, can be used to make things stiffer at the bottom etc.<\/p>\n<h4><strong>forcecount<\/strong><\/h4>\n<p>This value will override any counts calculated for this layer. 0 means use calculated count.<\/p>\n<h4><strong>maxcount<\/strong><\/h4>\n<p>The maximum number of objects to be scattered for this layer, again will override any other count values.<\/p>\n<h4><strong>perCurveCount<\/strong><\/h4>\n<p>If the scatter shape is made up of multiple splines setting this will mean the counts are calculated for each spline as opposed to the whole shape.<\/p>\n<h4><strong>scattercols<\/strong><\/h4>\n<p>For scattering to textures this holds the list of the various color masks for the scattering.<\/p>\n<h4><strong>scaleOnDist<\/strong><\/h4>\n<p>For scatter along objects you can control the scaling of the scatter mesh based on distance from the spline using this curve.<\/p>\n<h4><strong>vertexlimit<\/strong><\/h4>\n<p>The max vertex count before a new mesh is created.<\/p>\n<h4><strong>vertexnoise<\/strong><\/h4>\n<p>Set to true to apply vertex noise to mesh scatters.<\/p>\n<h4><strong>noisescale<\/strong><\/h4>\n<p>The roughness of the noise.<\/p>\n<h4><strong>strength<\/strong><\/h4>\n<p>How much noise to apply to each axis.<\/p>\n<h4><strong>colvariations<\/strong><\/h4>\n<p>If the scatter objects are being colored this list holds the color variations to use.<\/p>\n<h4><strong>minslope<\/strong><\/h4>\n<p>The min slope angle this layer can be scattered on.<\/p>\n<h4><strong>maxslope<\/strong><\/h4>\n<p>The max slope angle this layer can be scattered on.<\/p>\n<h4><strong>collisionOffset<\/strong><\/h4>\n<p>Allows for control of how far above or below the ground meshes will appear, useful for fine tuning meshes to sit nicely on the ground if their pivots are not at the base.<\/p>\n<h4><strong>useheight<\/strong><\/h4>\n<p>Set to true to use the height values below to control scattering.<\/p>\n<h4><strong>minheight<\/strong><\/h4>\n<p>The height below which this layer will not be scattered.<\/p>\n<h4><strong>maxheight<\/strong><\/h4>\n<p>The height above which this layer will not be scattered.<\/p>\n<h3>MegaScatterCollisionObj<\/h3>\n<p>This class is used to describe objects that scatters can and can not appear on.<br \/>\n[cc lang=&#8221;c#&#8221;]public class MegaScatterCollisionObj<br \/>\n{<br \/>\n\tpublic Collider\tcollider;<br \/>\n\tpublic bool\t\tactive;<br \/>\n}[\/cc]<\/p>\n<h3>Members<\/h3>\n<h4><strong>collider<\/strong><\/h4>\n<p>The collider object to use in the scene.<\/p>\n<h4><strong>active<\/strong><\/h4>\n<p>Whether is collider is used in the scatter tests.<\/p>\n<h3>MegaScatter<\/h3>\n<p>This is the base class for the various Scatter Object types in the system.<br \/>\n[cc lang=&#8221;c#&#8221;]public class MegaScatter : MonoBehaviour<br \/>\n{<br \/>\n\tpublic bool\t\t\t\t\t\t\tbuildOnStart;<br \/>\n\tpublic bool\t\t\t\t\t\t\tupdate;<br \/>\n\tpublic bool\t\t\t\t\t\t\tmeshPerShape;<br \/>\n\tpublic float\t\t\t\t\t\tDensity;<br \/>\n\tpublic int\t\t\t\t\t\t\tforcecount;<br \/>\n\tpublic MegaScatterMode\t\t\t\tcountmode;<br \/>\n\tpublic int\t\t\t\t\t\t\tStartCurve<br \/>\n\tpublic int\t\t\t\t\t\t\tEndCurve;<br \/>\n\tpublic bool\t\t\t\t\t\t\traycast;<br \/>\n\tpublic bool\t\t\t\t\t\t\tNeedsGround;<br \/>\n\tpublic float\t\t\t\t\t\tcollisionOffset;<br \/>\n\tpublic MegaShape\t\t\t\t\tshape;<br \/>\n\tpublic List<bool>\t\t\t\t\tusespline;<br \/>\n\tpublic List<MegaScatterLayer>\t\tlayers;<br \/>\n\tpublic int\t\t\t\t\t\t\tseed = 0;<br \/>\n\tpublic bool\t\t\t\t\t\t\thideObjects;<br \/>\n\tpublic Vector3\t\t\t\t\t\tglobalScale;<br \/>\n\tpublic bool\t\t\t\t\t\t\tfillHoles;<br \/>\n\tpublic bool\t\t\t\t\t\t\tcolorMesh;<br \/>\n\tpublic List<MegaScatterCollisionObj>\tignoreobjs;<br \/>\n\tpublic List<MegaScatterCollisionObj>\tsurfaces;<br \/>\n\tpublic MegaScatterQuery\t\t\t\tqueryObject;<br \/>\n\tpublic Collider\t\t\t\t\t\ttexturecollider;<br \/>\n}[\/cc]<\/p>\n<h3>Members<\/h3>\n<h4><strong>buildOnStart<\/strong><\/h4>\n<p>Set to true to have scatter objects at start.<\/p>\n<h4><strong>update<\/strong><\/h4>\n<p>set to true to allow the system to rescatter.<\/p>\n<h4><strong>meshPerShape<\/strong><\/h4>\n<p>Tells the system to make a new mesh for each spline in the scatter shape or color mask for texture scatters.<\/p>\n<h4><strong>Density<\/strong><\/h4>\n<p>The density value, the higher the more objects will be scattered.<\/p>\n<h4><strong>forcecount<\/strong><\/h4>\n<p>The number of meshes to scatter when in Count mode.<\/p>\n<h4><strong>countmode<\/strong><\/h4>\n<p>The mode to use to calculate how many meshes are to be scattered, Count or Density.<\/p>\n<h4><strong>StartCurve<\/strong><\/h4>\n<p>If the shape to scatter to has multiple splines you can limit the splines to use by changing this.<\/p>\n<h4><strong>EndCurve<\/strong><\/h4>\n<p>If the shape to scatter to has multiple splines you can limit the splines to use by changing this.<\/p>\n<h4><strong>raycast<\/strong><\/h4>\n<p>Whether this scatter objects does raycast to position objects on the ground.<\/p>\n<h4><strong>NeedsGround<\/strong><\/h4>\n<p>If raycasting but no ground set then with this set to true no object will appear unless there is ground for it.<\/p>\n<h4><strong>CollisionOffset<\/strong><\/h4>\n<p>How far above the shape raycasts start.<\/p>\n<h4><strong>shape<\/strong><\/h4>\n<p>The shape to scatter into or along.<\/p>\n<h4><strong>usespline<\/strong><\/h4>\n<p>This is a list of bools one per spline in the shape so you can turn off or on a spline to control the scatter.<\/p>\n<h4><strong>layers<\/strong><\/h4>\n<p>The layers to scatter for this object (see above)<\/p>\n<h4><strong>seed<\/strong><\/h4>\n<p>The random number see for this object.<\/p>\n<h4><strong>hideObjects<\/strong><\/h4>\n<p>Will hide any objects generated i the hierarchy.<\/p>\n<h4><strong>globalScale<\/strong><\/h4>\n<p>A scaling value to apply to all layers, makes it easy to adjust the whole scatter object if it is not the right size.<\/p>\n<h4><strong>fillHoles<\/strong><\/h4>\n<p>With multiple spline shapes will tell the system to detect holes and to scatter or not into them.<\/p>\n<h4><strong>colorMesh<\/strong><\/h4>\n<p>Tells the system to color the meshes.<\/p>\n<h4><strong>ignoreobjs<\/strong><\/h4>\n<p>List of colliders the scatter should not scatter on or near.<\/p>\n<h4><strong>surfaces<\/strong><\/h4>\n<p>List of colliders that the scatter should scatter on.<\/p>\n<h4><strong>queryObject<\/strong><\/h4>\n<p>Not currently used.<\/p>\n<h4><strong>texturecollider<\/strong><\/h4>\n<p>Texture scatters can use either a texture or a textured object.<\/p>\n<h3>MegaScatter Methods<\/h3>\n<p>[cc lang=&#8221;c#&#8221;]public void SetShape(MegaShape newshape)[\/cc]<\/p>\n<div class=\"params\">\n<strong>newshape<\/strong> &#8211; The new MegaShape object to use.\n<\/div>\n<p>The shape used for the scattering can be changed by calling this method with the new MegaShape object to use.<br \/>\n[cc lang=&#8221;c#&#8221;]public int NumLayers()[\/cc]<br \/>\nReturns an int with the number of mesh layers the scatter object uses.<br \/>\n[cc lang=&#8221;c#&#8221;]public string GetLayerName(int i)[\/cc]<\/p>\n<div class=\"params\">\n<strong>i<\/strong> &#8211; Index for the layer to return the name for.\n<\/div>\n<p>Returns a string for the layer whose index is passed in.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public bool IsLayerOn(string name)[\/cc]<\/p>\n<div class=\"params\">\n<strong>name<\/strong> &#8211; The layer name to check.\n<\/div>\n<p>Returns true if the layer with the name passed is active in the scatter, false if it is not.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public bool IsLayerOn(int i)[\/cc]<\/p>\n<div class=\"params\">\n<strong>i<\/strong> &#8211; Index to return the Enabled state for.\n<\/div>\n<p>Returns true is the layer is On false if it is Off.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public void LayerActive(string name, bool onoff)[\/cc]<\/p>\n<div class=\"params\">\n<strong>name<\/strong> &#8211; Name for the layer to set active state for.<br \/>\n<strong>onoff<\/strong> &#8211; bool value for the new state of the layer.\n<\/div>\n<p>Allows you to turn on or off scatter layers by name.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public void LayerActive(int i, bool onoff)[\/cc]<\/p>\n<div class=\"params\">\n<strong>i<\/strong> &#8211; Index for the layer to set active state for.<br \/>\n<strong>onoff<\/strong> &#8211; bool value for the new state of the layer.\n<\/div>\n<p>Allows you to turn on or off scatter layers by index.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public int FindLayerIndex(string name)[\/cc]<\/p>\n<div class=\"params\">\n<strong>name<\/strong> &#8211; The layer name to get the index for.\n<\/div>\n<p>Returns the index for the passed layer name. Returns -1 if name not found.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public void ReScatter()[\/cc]<br \/>\nTells the Scatter object to re scatter.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public int GetLayerScatterCount(string name)[\/cc]<\/p>\n<div class=\"params\">\n<strong>name<\/strong> &#8211; The layer name to get the count for.\n<\/div>\n<p>Returns the count value for all the objects that were scattered for the layer. Can be used with GetLayerScatterPos to get the positions for all the objects that were placed in the scene.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public int GetLayerScatterCount(int i)[\/cc]<\/p>\n<div class=\"params\">\n<strong>i<\/strong> &#8211; The layer index to get the count for.\n<\/div>\n<p>Returns the count value for all the objects that were scattered for the layer. Can be used with GetLayerScatterPos to get the positions for all the objects that were placed in the scene.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public MegaScatterMeshInf GetLayer(string name)[\/cc]<\/p>\n<div class=\"params\">\n<strong>name<\/strong> &#8211; The layer name to get the MegaScatterMeshInf data for.\n<\/div>\n<p>Returns the MegaScatterMeshInf class for the named layer so the values can be altered.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public MegaScatterMeshInf GetLayer(int i)[\/cc]<\/p>\n<div class=\"params\">\n<strong>i<\/strong> &#8211; The layer index to get the MegaScatterMeshInf data for.\n<\/div>\n<p>Returns the MegaScatterMeshInf class for the indexe layer so the values can be altered.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public Vector3 GetLayerScatterPos(string name, int num)[\/cc]<\/p>\n<div class=\"params\">\n<strong>name<\/strong> &#8211; The layer name to get the scatter position value for.<br \/>\n<strong>num<\/strong> &#8211; The index of the scattered object to get the position for. Use GetLayerScatterCount to get the max index value.\n<\/div>\n<p>Returns the Vector3 value for the given object on the given layer, useful if you need to know where objects were placed.<\/p>\n<p>[cc lang=&#8221;c#&#8221;]public Vector3 GetLayerScatterPos(int i, int num)[\/cc]<\/p>\n<div class=\"params\">\n<strong>i<\/strong> &#8211; The layer index to get the scatter position value for.<br \/>\n<strong>num<\/strong> &#8211; The index of the scattered object to get the position for. Use GetLayerScatterCount to get the max index value.\n<\/div>\n<p>Returns the Vector3 value for the given object on the given layer, useful if you need to know where objects were placed.<\/p>\n<h3>Example Code<\/h3>\n<p>Coming soon.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This page will show the public values and methods available to scripters to control the MegaScatter system. MegaScatter Enums This holds the two types that control how many scattered objects [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":4853,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":[],"_links":{"self":[{"href":"http:\/\/www.west-racing.com\/mf\/index.php?rest_route=\/wp\/v2\/pages\/4911"}],"collection":[{"href":"http:\/\/www.west-racing.com\/mf\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.west-racing.com\/mf\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.west-racing.com\/mf\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.west-racing.com\/mf\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4911"}],"version-history":[{"count":18,"href":"http:\/\/www.west-racing.com\/mf\/index.php?rest_route=\/wp\/v2\/pages\/4911\/revisions"}],"predecessor-version":[{"id":4936,"href":"http:\/\/www.west-racing.com\/mf\/index.php?rest_route=\/wp\/v2\/pages\/4911\/revisions\/4936"}],"up":[{"embeddable":true,"href":"http:\/\/www.west-racing.com\/mf\/index.php?rest_route=\/wp\/v2\/pages\/4853"}],"wp:attachment":[{"href":"http:\/\/www.west-racing.com\/mf\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}