Revision Difference
surface.DrawTexturedRectUV#512026
<function name="DrawTexturedRectUV" parent="surface" type="libraryfunc">⤶
<description>⤶
Draws a textured rectangle with a repeated or partial texture.⤶
⤶
u and v refer to texture coordinates.⤶
* (u, v) = (0, 0) is the top left⤶
* (u, v) = (1, 0) is the top right⤶
* (u, v) = (1, 1) is the bottom right⤶
* (u, v) = (0, 1) is the bottom left⤶
⤶
Using a start point of (1, 0) and an end point to (0, 1), you can draw an image flipped horizontally, same goes with other directions. Going above 1 will tile the texture. Negative values are allowed as well.⤶
⤶
Here's a helper image: http://i.imgur.com/SIKlpp4.png⤶
⤶
<note>If you are using a .png image, you need supply the "noclamp" flag as second parameter for <page>Global.Material</page> if you intend to use tiling.</note>⤶
⤶
<note>If you find that surface.DrawTexturedRectUV is getting your texture coordinates (u0, v0), (u1, v1) wrong and you're rendering with a material created with <page>Global.CreateMaterial</page>, try adjusting them with the following code:⤶
⤶
```⤶
local du = 0.5 / 32 -- half pixel anticorrection⤶
local dv = 0.5 / 32 -- half pixel anticorrection⤶
local u0, v0 = (u0 - du) / (1 - 2 * du), (v0 - dv) / (1 - 2 * dv)⤶
local u1, v1 = (u1 - du) / (1 - 2 * du), (v1 - dv) / (1 - 2 * dv)⤶
```⤶
⤶
⤶
**Explanation:**&lt;br&gt;⤶
surface.DrawTexturedRectUV tries to correct the texture coordinates by half a pixel (something to do with sampling) and computes the correction using IMaterial::GetMappingWidth()/GetMappingHeight(). If the material was created without a $basetexture, then GetMappingWidth()/GetMappingHeight() uses the width and height of the error material (which is 32x32).</note>⤶
⤶
<rendercontext hook="false" type="2D"/>⤶
⤶
<bug issue="3173">The UV offsets might require (sub-)pixel correction for accurate tiling results.</bug>⤶
</description>⤶
<realm>Client and Menu</realm>⤶
<args>⤶
<arg name="x" type="number">The X integer coordinate.</arg>⤶
<arg name="y" type="number">The Y integer coordinate.</arg>⤶
<arg name="width" type="number">The integer width of the rectangle.</arg>⤶
<arg name="height" type="number">The integer height of the rectangle.</arg>⤶
<arg name="startU" type="number">The U texture mapping of the rectangle origin.</arg>⤶
<arg name="startV" type="number">The V texture mapping of the rectangle origin.</arg>⤶
<arg name="endU" type="number">The U texture mapping of the rectangle end.</arg>⤶
<arg name="endV" type="number">The V texture mapping of the rectangle end.</arg>⤶
</args>⤶
</function>⤶
⤶
<example>⤶
<description>Demonstrates the function usage.</description>⤶
<code>⤶
local mat = Material( "gui/tool.png" )⤶
hook.Add( "HUDPaint", "DrawTexturedRectUV_example1", function()⤶
surface.SetDrawColor( color_white )⤶
surface.SetMaterial( mat )⤶
⤶
surface.DrawTexturedRect( 25, 25, 100, 100 )⤶
surface.DrawTexturedRectUV( 25, 130, 100, 100, 0, 0, 1, 1 ) -- Exactly same as above line⤶
⤶
-- Draws right half of the texture⤶
-- Note that we also change the width of the rectangle to avoid stetcing of the texture⤶
-- This is for demonstration purposes, you can do whatever it is you need⤶
surface.DrawTexturedRectUV( 130, 130, 50, 100, 0.5, 0, 1, 1 )⤶
end )⤶
</code>⤶
⤶
</example>⤶
⤶
⤶
<example>⤶
<description>Paints repeated texture over a panel</description>⤶
<code>⤶
function PANEL:Paint( w, h )⤶
-- Size of your texture, texW - width, texH - height⤶
local texW = 16⤶
local texH = 16⤶
⤶
surface.SetMaterial( Material( "icon16/box.png", "noclamp" ) )⤶
surface.SetDrawColor( color_white )⤶
surface.DrawTexturedRectUV( 0, 0, w, h, 0, 0, w / texW, h / texH )⤶
end⤶
</code>⤶
⤶
</example>