public static ShaderParameter[] ShaderParameters(ObjectInstance input) { List <ShaderParameter> output = new List <ShaderParameter>(); foreach (var value in input.Properties) { ShaderUniformDataType type = ShaderUniformDataType.SHADER_UNIFORM_FLOAT; object property = value.Value; switch (value.Value) { case double _: type = ShaderUniformDataType.SHADER_UNIFORM_FLOAT; property = (float)((double)property); break; case int _: type = ShaderUniformDataType.SHADER_UNIFORM_FLOAT; property = (float)((int)property); break; case ObjectInstance _: type = ShaderUniformDataType.SHADER_UNIFORM_VEC4; var vec4 = Vector4((ObjectInstance)property); var floatsize = Marshal.SizeOf(typeof(float)); var ptr = Marshal.AllocHGlobal(floatsize * 4); Marshal.StructureToPtr(vec4, ptr, false); property = ptr; break; case string _: type = ShaderUniformDataType.SHADER_UNIFORM_SAMPLER2D; property = Assets.PixelBuffer((string)property).texture; break; } output.Add(new ShaderParameter( (string)value.Key, property, type )); } return(output.ToArray()); }
//public unsafe static ObjectInstance Object(Model model) //{ //var mesh = ((Mesh*)model.meshes)[0]; //var output = JS.instance.engine.Object.Construct(); //output.SetPropertyValue("position", Object(model.position), true); //output.SetPropertyValue("direction", Object(model.direction), true); //return output; //} public static Model Model(ObjectInstance input) { Mesh output = new Mesh(); // necessary stuff var vertices = Vector3Array((ObjectInstance)input.GetPropertyValue("vertices")); output.vertexCount = vertices.Length; output.vertices = ArrayPointer(vertices); // optionals if (input.HasProperty("indices")) { var indices = ShortArray((ObjectInstance)input.GetPropertyValue("indices")); output.triangleCount = indices.Length / 3; output.indices = ArrayPointer(indices); } if (input.TryGetPropertyValue("uvs", out object uvs)) { output.texcoords = ArrayPointer(Vector2Array((ObjectInstance)uvs)); } if (input.TryGetPropertyValue("uv2s", out object uv2s)) { output.texcoords2 = ArrayPointer(Vector2Array((ObjectInstance)uv2s)); } if (input.TryGetPropertyValue("normals", out object normals)) { output.normals = ArrayPointer(Vector3Array((ObjectInstance)normals)); } if (input.TryGetPropertyValue("tangents", out object tangents)) { output.tangents = ArrayPointer(Vector3Array((ObjectInstance)tangents)); } if (input.TryGetPropertyValue("colors", out object colors)) { output.colors = ArrayPointer(Color32Array((ObjectInstance)colors)); } Raylib.UploadMesh(ref output, false); Model model = Raylib.LoadModelFromMesh(output); if (input.TryGetPropertyValue("texture", out object texturePath)) { Texture2D texture; if (!Assets.LoadPath((string)texturePath, out _)) { texture = PixelBuffer.missing.texture; } else { texture = Assets.PixelBuffer((string)texturePath).texture; } SetMaterialTexture(ref model, 0, MaterialMapIndex.MATERIAL_MAP_DIFFUSE, ref texture); } else { var texture = PixelBuffer.missing.texture; SetMaterialTexture(ref model, 0, MaterialMapIndex.MATERIAL_MAP_DIFFUSE, ref texture); } return(model); }