S&box Wiki

Revision Difference

RenderEntity#551209

<cat>Code.Entity</cat> <title>RenderEntity</title> `RenderEntity` is a clientside-only entity class that lets you draw simple meshes. The API is pretty simple and lets you provide dynamic vertex data on a per-frame basis. ## Creating a basic sprite For most use cases it's sufficient to just derive from the `RenderEntity` class and override the `DoRender` method: ```csharp using Sandbox; // It's just a square with a material slapped onto it. public class Sprite : RenderEntity { public Material SpriteMaterial { get; set; } public float SpriteScale { get; set; } = 18f; public bool Enabled { get; set; } = true; public override void DoRender(SceneObject obj) { if (!Enabled) return; // Allow lights to affect the sprite Render.SetupLighting(obj); Graphics.SetupLighting(obj); // Create the vertex buffer for the sprite var vb = Render.GetDynamicVB(); var vb = new VertexBuffer(); vb.Init(true);⤶ // Vertex buffers are in local space, so we need the camera position in local space too var normal = Transform.PointToLocal(CurrentView.Position).Normal; var normal = Transform.PointToLocal(Camera.Position).Normal; var w = normal.Cross(Vector3.Down).Normal; var h = normal.Cross(w).Normal; float halfSpriteSize = SpriteScale / 2; // Add a single quad to our vertex buffer vb.AddQuad(new Ray(default, normal), w * halfSpriteSize, h * halfSpriteSize); // Draw the sprite vb.Draw(SpriteMaterial); } } ``` Then you can spawn them like this: ```csharp // Somewhere in client code... var sprite = new Sprite { SpriteMaterial = Material.Load("materials/goatse.vmat"), SpriteScale = 24f }; ``` Keep in mind that creating RenderEntities serverside does not work-- they simply won't spawn. ## Dynamic expressions If your materials have dynamic expressions, you can write to their variables by calling `Render.Attributes.Set` inside your `DoRender` method. The values you set will affect all subsequent draw calls in the method body. ```csharp Render.Attributes.Set("rendercolor", Color.Red); Graphics.Attributes.Set("rendercolor", Color.Red); ``` ## Limitations ⤶ Due to the large size of the `RenderEntity` vertex format, vertex buffers created with `Render.GetDynamicVB()` can only contain approximately 600 vertices. If you exceed this limit, you may experience crashes. ⤶ Each vertex buffer can only contain approximately 600 vertices. If you exceed this limit, you may experience crashes. If you need more vertices, you can either use multiple vertex buffers or use the `Mesh` class instead (which allows you to use a custom vertex format).