{"id":2451,"date":"2017-10-01T16:52:22","date_gmt":"2017-10-01T16:52:22","guid":{"rendered":"http:\/\/julius-ihle.de\/?p=2451"},"modified":"2021-05-02T14:28:28","modified_gmt":"2021-05-02T14:28:28","slug":"playing-with-osl-3-windowbox-shader","status":"publish","type":"post","link":"https:\/\/julius-ihle.de\/?p=2451","title":{"rendered":"Playing with OSL #3: WindowBox Shader"},"content":{"rendered":"<p><a href=\"https:\/\/julius-ihle.de\/?p=2451\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-2452 size-full\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/oslwbox.jpg\" alt=\"oslwbox\" width=\"1280\" height=\"533\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/oslwbox.jpg 1280w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/oslwbox-300x125.jpg 300w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/oslwbox-1024x426.jpg 1024w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a>The latest addition on my journey to OSL is a WindowBox (sometimes also called <a title=\"Interior Mapping\" href=\"http:\/\/interiormapping.oogst3d.net\/\" target=\"_blank\">Interior Mapping<\/a> or Parallax Mapping) shader.<\/p>\n<p>I remember\u00a0one of our teachers in university telling us about how they rendered all the interiors of the buildings in Spiderman with just a simple plane with a shader attached to it that simulates the room interior with proper parallax. Since then this has always stuck in my mind and I saw it being used in some studios I worked at whenever there was a big city to be rendered. I finally found the time (.. too much time :) ) to do this sort of shader myself in OSL!<!--more--><\/p>\n<p>It&#8217;s been a really exciting but also quite tough journey for a not very math-savy person like me to do this project but I have been able to mash something together that works! This shader is useful for\u00a0giving the illusion of room interiors on just a single plane. It therefore safes you from modeling room interiors for mid-\/background-buildings. It&#8217;s solely texture based &#8211; \u00a0it takes a single input texture which should be laid out in a specific way to make sure the different sections of the room\u00a0are where they are supposed to be:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-2454 size-medium\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_template-300x300.jpg\" alt=\"wbox_template\" width=\"300\" height=\"300\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_template-300x300.jpg 300w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_template-150x150.jpg 150w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_template-144x144.jpg 144w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_template.jpg 654w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2453 size-medium\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_example-298x300.jpg\" alt=\"wbox_example\" width=\"298\" height=\"300\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_example-298x300.jpg 298w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_example-150x150.jpg 150w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_example-144x144.jpg 144w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_example.jpg 653w\" sizes=\"auto, (max-width: 298px) 100vw, 298px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Apart from all the walls of the room you also have a midground layer (which could be furniture for example) and a curtains layer to give additional complexity and depth.<\/p>\n<p>The textures can be created in your favorite 2D program, but if you have access to Nuke and you are familiar with it I also added an example Nuke script to the package for creating and laying out your own window boxes.\u00a0With it you get a few convenience features so you won&#8217;t have to worry about making sure everything is placed in the correct spot.<br \/>\nWhen you create your own textures there are a couple of things to keep in mind:<\/p>\n<ul>\n<li>Make sure you only have an alpha in the midground and curtains area.<br \/>\nAll walls, the ceiling and the floor should have a black alpha.<\/li>\n<li>For use with RenderMan and Arnold, make sure to convert your textures to mipmapped texture files using maketx (Arnold) or txmake (RenderMan).<br \/>\nThis is mainly for performance reasons but is a requirement for RenderMan.<\/li>\n<li>If you are exporting your texture in an initial format that keeps bounding boxes (like OpenEXR), make sure that the bounding box matches your format exactly.<br \/>\nMost renderers will take the bounds of the data window over the actual display window (this is also the case when converting to .tex files).<br \/>\nIf your bounds are bigger or smaller than your output format it will mess up the alignment in the shader.<\/li>\n<li>The midground and curtains layer should be unpremultiplied.<br \/>\nPremultiplication is happening in the shader, so if your input midground\/curtains area is already premultiplied you will most likely get dark edges.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>The shader itself has a bunch of basic controls for placing your room interior:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2455\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/controls.jpg\" alt=\"controls\" width=\"429\" height=\"417\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/controls.jpg 429w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/controls-300x292.jpg 300w\" sizes=\"auto, (max-width: 429px) 100vw, 429px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>It&#8217;s a bit hard to really show what it can do with still images so here&#8217;s a quick demo which shows it a bit more in-depth:<\/p>\n<p><iframe loading=\"lazy\" src=\"https:\/\/player.vimeo.com\/video\/236300648\" width=\"640\" height=\"360\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><a href=\"https:\/\/vimeo.com\/236300648\">Playing with OSL #3: Windowbox \/ Interior Mapping Shader<\/a> from <a href=\"https:\/\/vimeo.com\/julsvfx\">Julius Ihle<\/a> on <a href=\"https:\/\/vimeo.com\">Vimeo<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>If you want to give it a go you can download it from <a href=\"https:\/\/github.com\/julsVFX\/osl\/tree\/main\/jiWindowBox\"><strong>HERE<\/strong><\/a> (<span style=\"text-decoration: underline;\"><strong>updated link for github<\/strong><\/span>)<br \/>\nThe package contains the source and compiled .osl and .oso files for Blender, Arnold and RenderMan, but it should work in any other renderer with OSL support.<br \/>\nFor use with Arnold just put the compiled .oso into a folder that you append to your $ARNOLD_PLUGIN_PATH and for RenderMan either load the .oso via a PxrOSL node or <a title=\"Fundza OSL in Hypershade\" href=\"http:\/\/www.fundza.com\/rfm\/osl\/uses\/index.html\" target=\"_blank\">do it the nice way<\/a>.<\/p>\n<p>I haven&#8217;t tested it in production yet, so use with caution and modify as needed :) Some bits could be more efficient here and there&#8230; to be continued&#8230; maybe<span style=\"text-decoration: underline;\"><strong>.<\/strong><\/span><br \/>\n<span style=\"color: #808080;\">_________________________________________________<\/span><br \/>\n<span style=\"color: #808080;\"><span style=\"font-size: small;\"> If this post has helped you in any way you can express your gratefulness by using the <em>Donate\u00a0<\/em>Button below to buy me a coffee! :)<\/span><\/span><br \/>\n<a href=\"https:\/\/www.paypal.com\/cgi-bin\/webscr?cmd=_s-xclick&amp;hosted_button_id=VH5RW3YDWDJSQ\" target=\"_blank\" rel=\"nofollow\"><img decoding=\"async\" src=\"https:\/\/www.paypal.com\/en_US\/i\/btn\/x-click-but21.gif\" alt=\"\" \/><\/a><\/p>\n<div class=\"moz-text-html\" lang=\"x-unicode\">\n<div><span style=\"font-size: small;\"><span style=\"color: #808080;\">3M5xNSV7g2NzVpHMqzYKhgoKJZ8CWa644m<\/span><\/span><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2576\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2018\/03\/bc_ldgr_qrcode.png\" alt=\"bc_ldgr_qrcode\" width=\"128\" height=\"128\" \/><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"text-decoration: underline;\"><strong>\/\/UPDATE 10.10.2017 &#8211; Initial VRay version<\/strong><\/span><\/h3>\n<p>I had\u00a0quite a few people requesting a VRay version for this one as well. VRay does things a little bit different but I think I hacked together a working version and updated the download link above.<br \/>\nAs a word of warning, I found OSL in VRay to not be that stable (might very likely be inefficiency on my side, too ;) ). Also I could not get live IPR updates working when changing parameters in the shader, but once you made all your tweaks it should render normally.<br \/>\nYou can load in the .oso file in a VRayTexOSL node. Instead of\u00a0specifying a file directly within the shader, you\u00a0have to load it separately (in the case of Maya a <em>File<\/em> node seems to work\u00a0nicely) and then plug it into the <em>Vray Input Tex<\/em>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-2468\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_vray.jpg\" alt=\"wbox_vray\" width=\"700\" height=\"344\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_vray.jpg 1405w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_vray-300x147.jpg 300w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/wbox_vray-1024x503.jpg 1024w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"text-decoration: underline;\"><strong>\/\/UPDATE 11.10.2017 &#8211; Usability in Applications that have Z as the Up-Axis<\/strong><\/span><\/h3>\n<p>The links have been updated again specifically for those requesting support for DCC apps which have Z as their Up-Axis (e.g. 3ds Max). There&#8217;s a new switch called <em>zUpAxis<\/em> for the VRay, Arnold and RenderMan versions now. OFF (which is the default) uses Y as the up-Axis, ON uses Z as the up-Axis.<br \/>\nMake sure you load the compiled .oso file, <span style=\"text-decoration: underline;\">not<\/span> the .osl file. I got compiler issues with when trying to use it directly, but the compiled .oso seems to work in Max.<br \/>\nHopefully that will do the trick.. :)<\/p>\n<p>As of 03.04.2017 Zap was gracious enough to add it to the <a title=\"3ds Max OSL github \" href=\"https:\/\/github.com\/ADN-DevTech\/3dsMax-OSL-Shaders\/tree\/master\/OSL\/ADN-User%20Submitted\/JuliusIhle\" target=\"_blank\">Max OSL Repo on github<\/a> as well!<\/p>\n<p><a href=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/maxannotated.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-2473\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/maxannotated.png\" alt=\"maxannotated\" width=\"800\" height=\"321\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/maxannotated.png 1621w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/maxannotated-300x120.png 300w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/maxannotated-1024x411.png 1024w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"text-decoration: underline;\"><strong>\/\/UPDATE 15.10.2017 &#8211; VRay fix to use multiple Textures<\/strong><\/span><\/h3>\n<p>I was made aware that with the VRay version trying to have multiple shaders\u00a0with different textures does not quite work as it&#8217;s only rendering one of the textures. At the time of writing, the current release of VRay 3.6 in both Max and Maya has a bug that prevents the use of multiple textures. Chaosgroup is aware of the issue and will port it into the next hotfix release. If you can&#8217;t wait to try it out, there&#8217;s a way around it&#8230;<\/p>\n<p>Luckily VRay does provide arbitrary user data options just like Arnold and PRMan and that actually seems to be working nicely.<\/p>\n<p>To get it working set up the material like before and assign it to all objects. In your texture node instead of having an absolute path to your texture file (e.g. <em>\/path\/to\/file.exr<\/em>) use a user data string encapsulated in &lt;&gt; (e.g. <em>\/path\/to\/&lt;tex&gt;<\/em>).<br \/>\nFor Max you will probably have to use a VRayHDRI node instead of a Bitmap node (I didn&#8217;t find a way to edit the filepath to something custom in the Bitmap node &#8211; D&#8217;oh..)<br \/>\n<a href=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmaya3File.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2476\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmaya3File.jpg\" alt=\"vrayuserattrmaya3File\" width=\"543\" height=\"274\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmaya3File.jpg 543w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmaya3File-300x151.jpg 300w\" sizes=\"auto, (max-width: 543px) 100vw, 543px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-2477 size-full\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayamax3crop.jpg\" alt=\"vrayuserattrmayamax3crop\" width=\"746\" height=\"279\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayamax3crop.jpg 746w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayamax3crop-300x112.jpg 300w\" sizes=\"auto, (max-width: 746px) 100vw, 746px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Next you have to add the part of the filename to replace &lt;tex&gt; with as an attribute on your geometry.<br \/>\nIn Maya you can add it to the Shape node in the Attribute Editor under <em>Attributes &#8211; VRay &#8211; User attributes<\/em>. You then have to set your user data (in this example <em>&lt;tex&gt;<\/em>) to your filename (<em>tex=file.exr<\/em>)<br \/>\n<a href=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayacrop.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2480\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayacrop.jpg\" alt=\"vrayuserattrmayacrop\" width=\"600\" height=\"464\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayacrop.jpg 600w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayacrop-300x232.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-2479 size-full\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmaya2.jpg\" alt=\"vrayuserattrmaya2\" width=\"422\" height=\"80\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmaya2.jpg 422w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmaya2-300x57.jpg 300w\" sizes=\"auto, (max-width: 422px) 100vw, 422px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>In 3ds Max right click on your geo and select <em>Object Properties&#8230;<\/em> . In the User Defined tab set the filename of your user data here (<em>tex=file.exr<\/em>).<br \/>\n<a href=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayamax1crop.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2482\" src=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayamax1crop.jpg\" alt=\"vrayuserattrmayamax1crop\" width=\"406\" height=\"185\" srcset=\"https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayamax1crop.jpg 406w, https:\/\/julius-ihle.de\/wp-content\/uploads\/2017\/10\/vrayuserattrmayamax1crop-300x137.jpg 300w\" sizes=\"auto, (max-width: 406px) 100vw, 406px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>The downside of using this method is that you cannot have individual setups for all the other shader parameters like roomdepth, etc. as they are not mappable.<\/p>\n<p>From what I heard\u00a0Chaosgroup is pretty quick at\u00a0handing out fixes for small things like this. They have been aware of the issue for a little while now, so hopefully a hotfix will be released soon\u00a0:) \u00a0 FWIW I heard it&#8217;s working with earlier VRay releases, too.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"text-decoration: underline;\"><strong>\/\/UPDATE\u00a014.07.2018 &#8211;\u00a0Octane \/ LightWave version<\/strong><\/span><\/h3>\n<p>A while ago I received an EMail by James Dean who kindly made slight modifications to the shader code to make it usable in Lightwave and Octane. I updated the zip above to contain his version which hopefully does the trick for those of you that are using either of the 2.<br \/>\nUnfortunately I don&#8217;t have access to Lightwave or Octane but I&#8217;d be happy to hear if these updates are working for everyone using those applications :)<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3><span style=\"text-decoration: underline;\"><strong>\/\/UPDATE 02.05.2021 &#8211; Now on github<br \/>\n<\/strong><\/span><\/h3>\n<p>It took way too much time, but I&#8217;m finally on github! All links are updated!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The latest addition on my journey to OSL is a WindowBox (sometimes also called Interior Mapping or Parallax Mapping) shader. I remember\u00a0one of our teachers in university telling us about how they rendered all the interiors of the buildings in Spiderman with just a simple plane with a shader attached to it that simulates the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2451","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3MXK6-Dx","jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/julius-ihle.de\/index.php?rest_route=\/wp\/v2\/posts\/2451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/julius-ihle.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/julius-ihle.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/julius-ihle.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/julius-ihle.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2451"}],"version-history":[{"count":35,"href":"https:\/\/julius-ihle.de\/index.php?rest_route=\/wp\/v2\/posts\/2451\/revisions"}],"predecessor-version":[{"id":2773,"href":"https:\/\/julius-ihle.de\/index.php?rest_route=\/wp\/v2\/posts\/2451\/revisions\/2773"}],"wp:attachment":[{"href":"https:\/\/julius-ihle.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/julius-ihle.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/julius-ihle.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}