/* * Copyright (c) 2006-2016, openmetaverse.co * Copyright (c) 2024, Sjofn LLC. * All rights reserved. * * - Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * - Neither the name of the openmetaverse.co nor the names * of its contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ using System.Collections.Generic; using SkiaSharp; namespace OpenMetaverse.Rendering { [RendererName("Simple Cube Renderer")] public class SimpleRenderer : IRendering { public SimpleMesh GenerateSimpleMesh(Primitive prim, DetailLevel lod) { Path path = GeneratePath(); Profile profile = GenerateProfile(); SimpleMesh mesh = new SimpleMesh(); mesh.Prim = prim; mesh.Path = path; mesh.Profile = profile; mesh.Vertices = GenerateVertices(); mesh.Indices = GenerateIndices(); return mesh; } public SimpleMesh GenerateSimpleSculptMesh(Primitive prim, SKBitmap sculptTexture, DetailLevel lod) { return GenerateSimpleMesh(prim, lod); } public FacetedMesh GenerateFacetedMesh(Primitive prim, DetailLevel lod) { Path path = GeneratePath(); Profile profile = GenerateProfile(); FacetedMesh mesh = new FacetedMesh(); mesh.Prim = prim; mesh.Path = path; mesh.Profile = profile; mesh.Faces = GenerateFaces(prim.Textures); return mesh; } public FacetedMesh GenerateFacetedSculptMesh(Primitive prim, SKBitmap sculptTexture, DetailLevel lod) { return GenerateFacetedMesh(prim, lod); } public void TransformTexCoords(List vertices, Vector3 center, Primitive.TextureEntryFace teFace, Vector3 primScale) { // Lalala... } private Path GeneratePath() { Path path = new Path(); path.Points = new List(); return path; } private Profile GenerateProfile() { Profile profile = new Profile(); profile.Faces = new List(); profile.Positions = new List(); return profile; } private List GenerateVertices() { List vertices = new List(8); Vertex v = new Vertex(); // FIXME: Implement these v.Normal = Vector3.Zero; v.TexCoord = Vector2.Zero; v.Position = new Vector3(0.5f, 0.5f, -0.5f); vertices.Add(v); v.Position = new Vector3(0.5f, -0.5f, -0.5f); vertices.Add(v); v.Position = new Vector3(-0.5f, -0.5f, -0.5f); vertices.Add(v); v.Position = new Vector3(-0.5f, 0.5f, -0.5f); vertices.Add(v); v.Position = new Vector3(0.5f, 0.5f, 0.5f); vertices.Add(v); v.Position = new Vector3(0.5f, -0.5f, 0.5f); vertices.Add(v); v.Position = new Vector3(-0.5f, -0.5f, 0.5f); vertices.Add(v); v.Position = new Vector3(-0.5f, 0.5f, 0.5f); vertices.Add(v); return vertices; } private List GenerateIndices() { ushort[] indices = new ushort[] { 0, 1, 2, 0, 2, 3, 4, 7, 6, 4, 6, 5, 0, 4, 5, 0, 5, 1, 1, 5, 6, 1, 6, 2, 2, 6, 7, 2, 7, 3, 4, 0, 3, 4, 3, 7, }; return new List(indices); } private List GenerateFaces(Primitive.TextureEntry te) { Face face = new Face(); face.Edge = new List(); face.TextureFace = te.DefaultTexture; face.Vertices = GenerateVertices(); face.Indices = GenerateIndices(); List faces = new List(1); faces.Add(face); return faces; } } }