public override void Initialize(AssetHelper assets) { if (isPartOfStaticBatch) { return; } filter = (MeshFilter)GetComponent(typeof(MeshFilter)); Material[] mats = materials; if (mats.HasElements()) { mats = mats.Where(m => m != null).ToArray(); } if (filter.meshToRender != null && mats.HasElements()) { bounds = filter.meshToRender.bounds; if (!ApplicationSettings.UseFallbackRendering) { // TODO: The thought is that this can actually be done at compile time so the initialization will occur at runtime renderItems = new RenderItem[mats.Length]; for (int i = 0; i < mats.Length; i++) { RenderItem item = RenderItem.Create(mats[i], filter.meshToRender, i, transform); item.Initialize(Camera.Device); renderItems[i] = item; } } } }
public override void Start() { base.Start(); filter = (MeshFilter)GetComponent(typeof(MeshFilter)); if (filter.meshToRender != null) { bounds = filter.meshToRender.bounds; if (material != null) { // Determine what vertex buffer to create Mesh m = filter.meshToRender; bool hasTexture = (material.mainTexture != null && material.shader.supportsTextures); bool hasVertexColor = (m.colors.HasElements() && material.shader.supportsVertexColor); bool hasLights = (Light.HasLights && m.normals.HasElements() && material.shader.supportsLights); if (hasTexture) { if (hasVertexColor) { // NOTE: Here, lights are not supported VertexPositionColorTexture[] data = new VertexPositionColorTexture[m.vertexCount]; for (int i = 0; i < m.vertexCount; i++) { data[i] = new VertexPositionColorTexture( m.vertices[i], m.colors[i], m.uv[i] ); } vBuffer = new VertexBuffer(Camera.Device, data.GetType().GetElementType(), data.Length, BufferUsage.WriteOnly); vBuffer.SetData(data); } else { if (hasLights) { VertexPositionNormalTexture[] data = new VertexPositionNormalTexture[m.vertexCount]; for (int i = 0; i < m.vertexCount; i++) { data[i] = new VertexPositionNormalTexture( m.vertices[i], m.normals[i], m.uv[i] ); } vBuffer = new VertexBuffer(Camera.Device, data.GetType().GetElementType(), data.Length, BufferUsage.WriteOnly); vBuffer.SetData(data); } else { VertexPositionTexture[] data = new VertexPositionTexture[m.vertexCount]; for (int i = 0; i < m.vertexCount; i++) { data[i] = new VertexPositionTexture( m.vertices[i], m.uv[i] ); } vBuffer = new VertexBuffer(Camera.Device, data.GetType().GetElementType(), data.Length, BufferUsage.WriteOnly); vBuffer.SetData(data); } } } else { if (hasVertexColor) { VertexPositionColor[] data = new VertexPositionColor[m.vertexCount]; for (int i = 0; i < m.vertexCount; i++) { data[i] = new VertexPositionColor( m.vertices[i], m.colors[i] ); } vBuffer = new VertexBuffer(Camera.Device, data.GetType().GetElementType(), data.Length, BufferUsage.WriteOnly); vBuffer.SetData(data); } else { // Not supported yet } } } } }