using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Toolbox.Library.Rendering; using GL_EditorFramework.GL_Core; using GL_EditorFramework.Interfaces; using OpenTK; using OpenTK.Graphics.OpenGL; using Toolbox.Library; using Grezzo.CmbEnums; namespace FirstPlugin { //Rendering methods based on noclip //https://github.com/magcius/noclip.website/blob/master/src/oot3d/render.ts public class CMB_Renderer : GenericModelRenderer { public override float PreviewScale { get; set; } = 0.01f; public List TextureList = new List(); private string FragmentShader() { string frag = ""; return frag; } private string GenerateAlphaTestCompare(AlphaFunction compare, int reference) { float refSingle = (float)reference; switch (compare) { case AlphaFunction.Never: return "false"; case AlphaFunction.Less: return $"t_CmbOut.a < {refSingle}"; case AlphaFunction.Lequal: return $"t_CmbOut.a <= {refSingle}"; case AlphaFunction.Equal: return $"t_CmbOut.a == {refSingle}"; case AlphaFunction.Notequal: return $"t_CmbOut.a != {refSingle}"; case AlphaFunction.Greater: return $"t_CmbOut.a > ${refSingle}"; case AlphaFunction.Gequal: return $"t_CmbOut.a >= ${refSingle}"; case AlphaFunction.Always: return "true"; default: throw new Exception("Unsupported alpha function"); } } private string GenerateTextureEnvironment() { string vale = $""; return vale; } public override void OnRender(GLControl control) { GL.Enable(EnableCap.AlphaTest); GL.AlphaFunc(AlphaFunction.Gequal, 0.1f); GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); } public override void DrawModels(ShaderProgram shader, GL_ControlModern control) { shader.EnableVertexAttributes(); List opaque = new List(); List transparent = new List(); for (int m = 0; m < Meshes.Count; m++) { if (((CMB.CMBMaterialWrapper)Meshes[m].GetMaterial()).CMBMaterial.IsTransparent) transparent.Add(Meshes[m]); else opaque.Add(Meshes[m]); } for (int m = 0; m < transparent.Count; m++) { DrawModel(control, Skeleton, transparent[m].GetMaterial(), transparent[m], shader); } for (int m = 0; m < opaque.Count; m++) { DrawModel(control, Skeleton, opaque[m].GetMaterial(), opaque[m], shader); } shader.DisableVertexAttributes(); } public override void SetRenderData(STGenericMaterial mat, ShaderProgram shader, STGenericObject m) { var cmbMaterial = ((CMB.CMBMaterialWrapper)mat).CMBMaterial; var cmbMesh = ((CMB.CmbMeshWrapper)m); bool HasNoNormals = cmbMesh.Shape.Normal.VertexData == null || cmbMesh.Shape.Normal.VertexData.Length == 0; shader.SetBoolToInt("HasNoNormals", HasNoNormals); shader.SetBoolToInt("isTransparent", cmbMaterial.BlendEnaled); SetGLCullMode(cmbMaterial.CullMode); GL.Enable(EnableCap.Blend); GL.BlendFunc(cmbMaterial.BlendingFactorSrcAlpha, cmbMaterial.BlendingFactorDestAlpha); GL.BlendColor(1.0f, 1.0f, 1.0f, cmbMaterial.BlendColorA); if (cmbMaterial.AlphaTestEnable) GL.Enable(EnableCap.AlphaTest); else GL.Disable(EnableCap.AlphaTest); GL.AlphaFunc(cmbMaterial.AlphaTestFunction, cmbMaterial.AlphaTestReference); } private void SetGLCullMode(CullMode CullMode) { GL.Enable(EnableCap.CullFace); if (CullMode == CullMode.BACK) GL.CullFace(CullFaceMode.Back); if (CullMode == CullMode.FRONT) GL.CullFace(CullFaceMode.Front); if (CullMode == CullMode.FRONT_AND_BACK) GL.CullFace(CullFaceMode.FrontAndBack); if (CullMode == CullMode.NONE) GL.Disable(EnableCap.CullFace); } public override int BindTexture(STGenericMatTexture tex, ShaderProgram shader) { GL.ActiveTexture(TextureUnit.Texture0 + tex.textureUnit + 1); GL.BindTexture(TextureTarget.Texture2D, RenderTools.defaultTex.RenderableTex.TexID); string activeTex = tex.Name; foreach (var texture in TextureList) { if (TextureList.IndexOf(texture) == ((CMB.CMBTextureMapWrapper)tex).TextureIndex) { BindGLTexture(tex, shader, TextureList[((CMB.CMBTextureMapWrapper)tex).TextureIndex]); return tex.textureUnit + 1; } } return tex.textureUnit + 1; } } }