private void GetChannels(int[] version) { m_Channels = new ChannelInfo[6]; for (int i = 0; i < 6; i++) { m_Channels[i] = new ChannelInfo(); } for (var s = 0; s < m_Streams.Length; s++) { var m_Stream = m_Streams[s]; var channelMask = new BitArray(new[] { (int)m_Stream.channelMask }); byte offset = 0; for (int i = 0; i < 6; i++) { if (channelMask.Get(i)) { var m_Channel = m_Channels[i]; m_Channel.stream = (byte)s; m_Channel.offset = offset; switch (i) { case 0: //kShaderChannelVertex case 1: //kShaderChannelNormal m_Channel.format = 0; //kChannelFormatFloat m_Channel.dimension = 3; break; case 2: //kShaderChannelColor m_Channel.format = 2; //kChannelFormatColor m_Channel.dimension = 4; break; case 3: //kShaderChannelTexCoord0 case 4: //kShaderChannelTexCoord1 m_Channel.format = 0; //kChannelFormatFloat m_Channel.dimension = 2; break; case 5: //kShaderChannelTangent m_Channel.format = 0; //kChannelFormatFloat m_Channel.dimension = 4; break; } offset += (byte)(m_Channel.dimension * MeshHelper.GetFormatSize(version, m_Channel.format)); } } } }
private void GetStreams(int[] version) { var streamCount = m_Channels.Max(x => x.stream) + 1; m_Streams = new StreamInfo[streamCount]; uint offset = 0; for (int s = 0; s < streamCount; s++) { uint chnMask = 0; uint stride = 0; for (int chn = 0; chn < m_Channels.Length; chn++) { var m_Channel = m_Channels[chn]; if (m_Channel.stream == s) { if (m_Channel.dimension > 0) { chnMask |= 1u << chn; stride += m_Channel.dimension * MeshHelper.GetFormatSize(version, m_Channel.format); } } } m_Streams[s] = new StreamInfo { channelMask = chnMask, offset = offset, stride = stride, dividerOp = 0, frequency = 0 }; offset += m_VertexCount * stride; //static size_t AlignStreamSize (size_t size) { return (size + (kVertexStreamAlign-1)) & ~(kVertexStreamAlign-1); } offset = (offset + (16u - 1u)) & ~(16u - 1u); } }