Search Unity

UBER - Standard Shader Ultra

Discussion in 'Assets and Asset Store' started by tomaszek, Jun 23, 2015.

  1. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    This thread is drifting towards RTP4... :) Yes, I'm taking care about all feedback collected past few years of maintaining RTP. You're not the first person who's in need to create things dynamically. So, in general now everything I'd like to make dynamic. Like input terrain can lead to quick application of RTP basing on exposed runtime RTP API. Resources needed by shader are still prepared, but it's done by the runtime (not editor) - TextureArrays can be saved as assets though. At first glance material based solution is right path, but materials don't serialize parameter arrays (array of floats for example), so we need to store them in script anyway. Shared parameters are simplier to manage via scripting objects.

    I will elaborate it more in-depth as soon as beta is available.

    Tom
     
  2. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    I looked into UBER vs Unity5.5. On beta6 tested UBER1.1c (Unity5.4 package version) I was able to update project w/o errors (only obsolete warnings). So it should work.

    Considering U5.5 dedicated package version:

    - I inspected Unity 5.5 core files changes and synced UBER. Then removed 3 UBER overwritten cginc files as less files makes it more easy to analyse in case user want to tweak some features.

    - Moved one feature from keyword handling to static branching, then and moved snow variants back to keyword. Although this doesn't "optimize" shader variant count nor RAM consumption, but we've got 2x less shader files which is also plus (you don't need to select separately "Snow" verions as they are genuinely managed in single shader.

    Named this minor update UBER1.2 and pushed to AssetStore. Should be available in a few days.

    Tom

    P.S.
    As U5.5 doubled keyword limit (to 256) I believe this problem should be solved for most projects managed now (unless user install gazzilion of 3rd party plugins with their example scenes/materials consisting of custom keywords).
     
    Lex4art, hippocoder and hopeful like this.
  3. irwit

    irwit

    Joined:
    Sep 30, 2014
    Posts:
    55
    Hi

    I've just bought Uber shader system.

    Firstly, I don't get any tabs in the shader, everything just free for all. SO its very difficult to create a shader. Secondly, when I create a specular shader everything goes black.

    I have unity 5.4.1 downloaded, double clicks package one, the package two. create a material and go uber, specular setup.

    I can open the example scenes and they work ok. there's one in the middle that doesn't look like its working properly.

    A bit disappointed really as it was a lot of money for the plugin and so far I cant really do anything with it. Hoping to get something working soon.

    Any help much appreciated.

    Thanks

    Will
     

    Attached Files:

    • uber.JPG
      uber.JPG
      File size:
      127.4 KB
      Views:
      886
  4. irwit

    irwit

    Joined:
    Sep 30, 2014
    Posts:
    55
    Im also not able to press play, something abouta compliling error. In the bootm of unity it says.

    Attached screenshot
     

    Attached Files:

  5. hippocoder

    hippocoder

    Digital Ape

    Joined:
    Apr 11, 2010
    Posts:
    29,723
    It will happen and they will ask for 512....1024....2048 :) Thanks for the update will get it asap.
     
  6. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    Looks like Unity doesn't see editor inspector class. I haven't yet installed U5.4.1 (submitted package from U5.4.0f3 for now). I can instell this Unity version though and check. Will let you know.

    Meantime you could contact me via private message with your UBER order number/purchase date for verification. We could look into yout problem via skype screenshare quickly.

    Tom
     
  7. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    Couldn't reproduce your issue. Imported UBER from AssetStore into fresh Unity 5.4.1.f1 project and it works fine. The warning you've got is about UBER material inspector not found. It's suypposed to be in UBER_StandardShaderGUI.cs placed in Editor subfolder of UBER. Is this file in place ? You could reimport it to recompile.

    Tom
     
  8. hippocoder

    hippocoder

    Digital Ape

    Joined:
    Apr 11, 2010
    Posts:
    29,723
    Hi Tom,

    I saw you implemented LOD crossfading but I would like to (for effect purposes) control the amount the object is faded with dither, I don't know how to do it without Lodgroup component. I think it might be I need to send a float to the shader, could you please show a small example where I could achieve this or advice, thanks :) I want to use it to fade in items which render correctly without using transparency, so I can't use the lodgroup component for this purpose.

    Thanks again :)
     
  9. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    I'd imagine you want to feed material with custom fade value instead of Unity ones ?

    It's implemented for all lighting passes exactly the way Unity does it. Look into UBER_StandardCore.cginc.
    Ctrl+F for LOD_FADE_CROSSFADE. You will find places for non transparent handling (calculate value and clip) and for transparent variants (we can simply multiply output alpha by fade value). You would need to introduce additional parameter in material, define it in shader (you can place it in UBER_StandardInput.cginc where I placed all shader variable declaration) and use it to your needs in code found as said.

    Tom
     
    hippocoder likes this.
  10. pixelsteam

    pixelsteam

    Joined:
    May 1, 2009
    Posts:
    924
    Has this also been tested in Mobile? I noticed that there was some work done on OpenGL but was unsure if it had survived the transition to mobile. Any advice and info appreciated.
     
    Last edited: Oct 25, 2016
  11. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    Haven't tested this on real hardware, but it practically work on gles3 hardware. GLES2 is excluded by default.

    Tom
     
  12. Unityaware

    Unityaware

    Joined:
    Feb 14, 2014
    Posts:
    101
    Hi Tom,
    I just installed "Uber". It only installed six items, but no scene samples and under the Material no option to chose Uber parameters. How do I get to it? What am I missing please? Thanks. (see picture after install) uberfolder.png
     
  13. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    It's all explained in info txt files. Import first package from UBER folder, then next.

    Tom
     
  14. Unityaware

    Unityaware

    Joined:
    Feb 14, 2014
    Posts:
    101
    When I double click on "UBER_ContentExamples" I expected a sample scene to open, but nothing happens. I have deleted the folder, re-imported - still nothing. I created a new project, the same six files appear after importing and no scene files with the examples. All I am getting is what you see on my screen grab above.
     
  15. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    Oh, I see what happened. It also happened to me before. Unity refuses to recognize .unitypackage extension and and it's not associated with Unity. You need to manually choose Import Assets (custom) from Unity menu and then select 2 subsequent packages from file browse dialog window. Remember to import 01_UBER first !

    Tom
     
  16. Deleted User

    Deleted User

    Guest

    Hi Tom,

    two questions:

    1) Is there a way to enable the Unity Blob Shadow Projector to cast its shadow onto the POM displaced geometry? As of now, it's projecting the shadow onto the original geometry.

    2) Is there a way to make the The Uber DX11 Tesselation shader receive the Unity Blob Shadow Projector? Currently, it doesn't receive any of the projected shadow whatsoever.

    Thank you!

    Sean
     
  17. Errorjack

    Errorjack

    Joined:
    Nov 14, 2013
    Posts:
    38
    I'm currently getting an error with UBER when compiling to a platform, would love some help:

    Shader error in 'UBER - Specular Setup/ POM Distance Map': invalid subscript 'xyw' at Assets/UBER/Shaders/Includes/UBER_StandardShadow_Tessellation.cginc(655) (on d3d9)

    Compiling Vertex program with SHADOWS_DEPTH LOD_FADE_CROSSFADE _POM_DISTANCE_MAP
    Platform defines: UNITY_ENABLE_REFLECTION_BUFFERS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING
     
  18. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    Do you work on or target dx9 platform ? Seems like it's related to dx9 HLSL compiler difference where it's not an issue on dx11. Glease give me your Unity version, UBER version (verinfo.txt file included in package) and maybe a few simple steps to reproduce your issue. I'll look into it.

    Your projector material would need shader that follows surface modifications done by UBER shader. POM and tessellation affect depths which projector uses to determine the surface to project. Projectors redraw again objects with projector material/shader. POM will extude surface and projector (with default material) will try to project on unaffected original surface.

    It's not that hard to write own projector shader - copy code from selected Tessellation UBER shader and introduce passing projected uvs. An example of projector shader (we need to multiply _Projector matrix provided to shader by Unity by vertex position that's modified):

    http://answers.unity3d.com/questions/1126686/add-color-to-projection-shader.html

    For POM it's more complex - you need to go from worldPos of parallaxed pixel to local space and multiply it by _Projector to get right projection UVs. A bit messy solution but would work.

    What do you try to do with it ? Projected shadows, are there any particular needs to use them instead of built in realtime shadows ?

    Tom

    P.S. Maybe deferred decals technique available in an example project for command buffers (dig into google for this Unity resolurce) would be enough for you ? It's shader independent, however it doesn't provide method to put fake realtime shadows, rather quickly darken albedo for all realtime lights).
     
    Last edited: Oct 27, 2016
  19. Deleted User

    Deleted User

    Guest

    Thank you Tom for you explanations. Unfortunately, I am no shader writer. I might be able to get the Tessellation variant working with projected shadows, but I doubt I will be able to pull off the POM variant.

    I can't use realtime shadows, because I am working with a 8 mio. vertices CAD model for a Vive VR application and realtime shadows cause the amount of vertices sent to the GPU to be tripled thereby making the frame rate drop from 110 FPS to about 50 FPS.
     
  20. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    I've read that Unity reuses shadow maps for VR, # of vertices should be then doubled (real geom+shadowmap). If you're dealing with directional lights it take as many passes as needed (4 cascades can take 1-4 passes depending on camera position).

    I hope Unity will expose more control to us on this (with RenderLoops announced) so we could cache shadowmaps.

    Tom
     
  21. hippocoder

    hippocoder

    Digital Ape

    Joined:
    Apr 11, 2010
    Posts:
    29,723
    That reminds me Tom, what's the best way to go about having decals with UBER Pom/Tess ? does it just work if deferred, or need new shader? How about mesh based decals, I haven't tried them out but I figure in the later stages, artist would want them.
     
  22. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    Mesh decals on POM (wheter writing or non writting to z-buffer) or tessellation will fail (or you find solution that's supersmart - I'm not aware about any available). Deferred projected decals would work.

    Tom

    P.S. I've done effective solution for deferred decals for incoming game (lighting, lightmapping, batching, culling, dancing, whistling, and more...), but the story is the same as for new SpeedTree shading. I won't even post screenshots here to not tease people too much :).
     
    hopeful likes this.
  23. hippocoder

    hippocoder

    Digital Ape

    Joined:
    Apr 11, 2010
    Posts:
    29,723
    Well if it's a separate product, then expect my purchase, otherwise nice work :)
    What tune does it whistle?
     
  24. Errorjack

    Errorjack

    Joined:
    Nov 14, 2013
    Posts:
    38
    I'm currently on Unity3D 5.4.1f1 and I am currently on Unity's DX11 mode.

    I just go to compile > Windows 86x64 and build. Once the building is done, it shows that error. I have both DX9 and DX11 GPU APIs on the compilation, could that be the issue? I'll try to remove DX9 from there and see if the problem persists

    EDIT: Yes this was the problem, it is fine now!
     
    Last edited: Oct 27, 2016
    hopeful likes this.
  25. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    If you care your game need to be available for dx9 users too, you would need such tweaks to be done in UBER_StandardShadow_Tessellation.cginc

    Find this:
    Code (csharp):
    1.  
    2. #if defined(LOD_FADE_CROSSFADE) && defined(LOD_CROSSFADE_AVAILABLE)
    3. half3 ditherScreenPos = vpos.xyw;
    4. ditherScreenPos.xy *= _ScreenParams.xy * 0.25;
    5. half2 projUV = ditherScreenPos.xy / ditherScreenPos.z;
    6. projUV.y = frac(projUV.y) * 0.0625 /* 1/16 */ + unity_LODFade.y; // quantized lod fade by 16 levels
    7. clip(tex2D(_DitherMaskLOD2D, projUV).a - 0.5);
    8. #endif
    9.  
    change to this:
    Code (csharp):
    1.  
    2. #if defined(LOD_FADE_CROSSFADE) && defined(LOD_CROSSFADE_AVAILABLE)
    3. #if defined(SHADER_API_D3D9)
    4. half3 ditherScreenPos = half3(vpos.xy, i.vpos_w);
    5. #else
    6. half3 ditherScreenPos = vpos.xyw;
    7. #endif
    8. ditherScreenPos.xy *= _ScreenParams.xy * 0.25;
    9. half2 projUV = ditherScreenPos.xy / ditherScreenPos.z;
    10. projUV.y = frac(projUV.y) * 0.0625 /* 1/16 */ + unity_LODFade.y; // quantized lod fade by 16 levels
    11. clip(tex2D(_DitherMaskLOD2D, projUV).a - 0.5);
    12. #endif
    13.  
    find this:
    Code (csharp):
    1.  
    2. #if defined(_SNOW) || defined(_WETNESS) || defined(_TWO_LAYERS) || defined(VERTEX_COLOR_CHANNEL_POMZ) || defined(TRIPLANAR_SELECTIVE)
    3. fixed4 vertex_color : COLOR0; // used for snow/wet coverage and 2 layers mode, volume initial position is also used
    4. #endif
    5.  
    change/add this:
    Code (csharp):
    1.  
    2. #if defined(_SNOW) || defined(_WETNESS) || defined(_TWO_LAYERS) || defined(VERTEX_COLOR_CHANNEL_POMZ) || defined(TRIPLANAR_SELECTIVE)
    3. fixed4 vertex_color : COLOR0; // used for snow/wet coverage and 2 layers mode, volume initial position is also used
    4. #endif
    5. #if defined(SHADER_API_D3D9)
    6. float vpos_w:TEXCOORD8;
    7. #endif
    8.  
    find this:
    Code (csharp):
    1.  
    2. TRANSFER_SHADOW_CASTER_NOPOS(o, opos)
    3.  
    change/add this:
    Code (csharp):
    1.  
    2. TRANSFER_SHADOW_CASTER_NOPOS(o, opos)
    3. #if defined(SHADER_API_D3D9)
    4. o.vpos_w = opos.w; // missing component on d3d9
    5. #endif
    6.  
    recompile shaders.

    ATB, Tom
     
  26. Crossway

    Crossway

    Joined:
    May 24, 2016
    Posts:
    509
    Is that possible to add gloss map too? I have two specular maps and a nice gloss map for my skin shader but seems we can't set map for glossiness. or maybe I'm wrong!
     
  27. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    You mean smoothness map ? Give me exact shader where you can't do it.

    Tom
     
  28. Crossway

    Crossway

    Joined:
    May 24, 2016
    Posts:
    509
    Yes, I need smoothness only on the specified area not on whole specular map.

    Here I have a specular map and a glossiness (smoothness) map.
     
  29. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    As the skin is not metallic it has specular color constant - dark (dielectric constant for Unity is 0.04). So - You need to use spec map with gloss on alpha channel. You can also go for metallic setup and provide texture with constant metalness). If you've got only smoothness map - simply if this is grayscale w/o alpha - make it "grayscale from alpha in advanced texture import settings). Then select Alpha8 as texture format. RGB channels will be considered to be black then, alpha will store smoothness which is the channel Standard shader expects to have this data on.

    Tom
     
    Crossway likes this.
  30. Crossway

    Crossway

    Joined:
    May 24, 2016
    Posts:
    509
    Thanks, for skin I have another map ... "Subdermal map" like below pic. but don't know where to place it with Uber.
    Also decal map would be really nice with Uber.


     
  31. hippocoder

    hippocoder

    Digital Ape

    Joined:
    Apr 11, 2010
    Posts:
    29,723
    http://www.stobierski.pl/unity/UBER.pdf - docs say one of the occlusion map channels?
     
    Crossway likes this.
  32. monark

    monark

    Joined:
    May 2, 2008
    Posts:
    1,598
    How many of Uber features also work in WebGL
    Some or all?

    Is it possible to post a WebGL demo?
     
  33. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    Name of your maps are related to some quite specific custom skin shader. It doesn't fit to GGX "standard shading" which UBER is extension to (generaly to better texture standard shader + some more options).

    Subdermal sounds like translucency color seen at hard angles (fresnel) when we've got light again the skin - behind the object. Epidermal ? Got no idea how it's interpreted, the same for weightmap. You definitely need to know details of this skin shader approach to be able to implement it with UBER (custom changes - yeah...)

    Generally UBER shader, like standard shader excludes gles platform (GLES2 standard) which WebGL is based on. I saw somewhere on Unity roadmap they will upgrde to WebGL2 which will be GLES3 - then most features should work. Otherwise, yes - you can try to remove #pragma exclude_platform gles in shaders code and see. WebGL is not exactly gles (gles2) and specific features are based on hardware. For example WebGL ran on mobile will differ with features on WebGL ran on PC desktop. POM with z-write won't work (I would be very surprised it does), not sure about other features. So - WebGL+StandardShader (which UBER is extension to), don't expect too much.

    Tom
     
    Crossway likes this.
  34. monark

    monark

    Joined:
    May 2, 2008
    Posts:
    1,598
    I could try that, but that would involve purchasing first without knowing if it was any use ;)

    WebGL 2.0 is available as a graphics API choice in Unity 5.5

    I guess if you fancy selling more copies you could add a WebGL demo and promote the features that do work?
     
    Last edited: Nov 11, 2016
  35. SgtLame

    SgtLame

    Joined:
    Nov 26, 2015
    Posts:
    129
    Hi everyone,

    I am considering buying this great asset, but just to be sure, here is an example of what I am working on:

    stonewall.jpg
    Will Uber allow me to apply a shader that will give relief to the edges of this wall (like in the "Corners solved" webplayer example)? This may be a dumb question but I'm a "shader noob" so...
     
  36. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    Your question is actually very important. POM techniques are pretty to manage when it comes to silhouettes of objects. If you can uv map your wall continous way there is a chance, but still it's up to you to have smooth uvs at corners. It's actually not much possible to have one click solution for "input = cube, output = perfectly rounded thing like on on AssetStore we can see allegorithmic substances).

    It's pretty much easier to solve silhouettes thru tessellation. Still you need to keep "rounded", continuous UVs around corners and normals that are shared (smooth interpolated normals) to not introduce tearing. As far as I know there is no solution to solve generic walls at level of single bricks that they fit at geometry edges.

    Tom
     
  37. botumys

    botumys

    Joined:
    Apr 16, 2009
    Posts:
    707
    Fun trick to add moss on rocks : I use uber shader and tweak the snow fx to obtain something similar as moss. Now, I can rotate my rocks as I want and moss is always correctly placed :) val21.jpg
     
    Danirey, ftejada, drmanhattan and 4 others like this.
  38. Crossway

    Crossway

    Joined:
    May 24, 2016
    Posts:
    509
    Hi, sorry to ask I don't know if it was asked before or not but is there any shader for speed tree in Uber?
     
  39. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    Nope. Might be released as separate pacakge in some next months though.

    Creative thinking :).

    P.S. I'm eager to give RTP4 alpha in your hands for tests...
     
    Crossway likes this.
  40. botumys

    botumys

    Joined:
    Apr 16, 2009
    Posts:
    707
    :)
    Shame on me, but I didn't follow what's planned for RTP 4.0. There is a list already in the forum ?
     
  41. SgtLame

    SgtLame

    Joined:
    Nov 26, 2015
    Posts:
    129
    Thanks for your thorough answer!
    So, if I got it, I need to have continuous UV, which won't be a problem, but I also must have more or less rounded corners, e.g. no sharp edges, so there will be several normals interpolating between two perpendicular faces normals??
     
  42. Deckard_89

    Deckard_89

    Joined:
    Feb 4, 2016
    Posts:
    316
    Hi, I switched to DX11 and I get this error and the "pink" texture-less material:

    Shader error in 'UBER - Specular Setup/ Core': undeclared identifier 'samplerunity_SpecCube1' at Assets/UBER/Shaders/Includes/UBER_GlobalIllumination.cginc(191) (on d3d11)

    Compiling Vertex program with LIGHTMAP_OFF DYNAMICLIGHTMAP_OFF UNITY_HDR_ON _OCCLUSION_FROM_ALBEDO_ALPHA _WETNESS_NONE DIRLIGHTMAP_OFF
    Platform defines: UNITY_ENABLE_REFLECTION_BUFFERS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING

    Unity 5.4.1

    It appears to only happen if I use UBER specular setup. With metallic there is no problem.
     
    Last edited: Nov 14, 2016
  43. davide445

    davide445

    Joined:
    Mar 25, 2015
    Posts:
    138
    Sorry for the noob question, maybe asked elsewhere. What's the difference btw RTP and UBER.
    I'm interested into TC2 and reading about RTP I find many elements also available on UBER as triplanar shading, dynamic snow, PBR.
     
  44. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    In current state of UBER displacement in tesselaltion is realized along normals. For cube which has "flat" shading - normals are perpendicular and _not_ shared at edges it would lead to tearing (google for "tessellation tearing" to see what I mean). If you set walls with additional triangles near the corner and such tringles would have continuous UVs and normals - yes tessellation displacement has chance to work then.

    Looks like UBER version doesn't match Unity. In verinfo.txt file you can see UBEr version. I'd recommend to download newest UBER from AssetStore though.

    RTP is about terrain shading. UBER is meant to be general usage shader for your meshes. RTP has dynamic snow, wetness, triplanar and works in PBR (with uniform metalness value per layer).

    Tom
     
  45. davide445

    davide445

    Joined:
    Mar 25, 2015
    Posts:
    138
    Thanks @tomaszek , what I mean is both RTP and UBER share many features. Might I use UBER to achieve the same results as RTP? Or does RTP have some specific feature for terrain or to say foliage?
     
  46. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    For larghe scale obejcts like terrain UBER can't do:
    1. Global colormap
    2. Global normalmap
    3. UV blending
    4. multiple (4 or 8) texture layers

    Tom
     
    davide445 likes this.
  47. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    UBER is on Birthday Bonanza sale for next 9 days. You can get it for $30. Goes fine with RTP upgrade. You can get RTP+UBER for as low as $65 now (instead of $85 in sum).
     
  48. Deleted User

    Deleted User

    Guest

    Hi Tom,

    can you make the "2 Layers" variant work with POM Advanced? Seems like it only supports Tessellation, but not POM.

    Thanks!
     
  49. tomaszek

    tomaszek

    Joined:
    Jun 18, 2009
    Posts:
    3,862
    Nope - would mean we traverse texture space (POM is like raymarching algorithm) on2 layers independently. Makes things pretty complex .

    Tom
     
  50. buronix

    buronix

    Joined:
    Dec 11, 2013
    Posts:
    111
    Hey,
    I just think maybe my petition is silly, cause I know its pretty easy to implement (I made it myself, and I have almost no idea about shaders) but I think it would be awesome to implement in Uber a outline option in the shader , it would avoid me to have additional materials and I think it would be useful also to other people (or at least I think so).

    something like :
    http://wiki.unity3d.com/index.php/Silhouette-Outlined_Diffuse

    Thanks in advance, even if its not possible!!

    Ruben.