public void GenerateFields(CodeGenerator.Context context, string parent = null) { if (m_Template == null) { return; } if (!context.typeCodeGenCache.TryGetValue(m_Template.TemplatePath + m_Template.TemplateOverridePath, out var generator)) { generator = new GhostCodeGen(m_Template.TemplatePath); if (!string.IsNullOrEmpty(m_Template.TemplateOverridePath)) { generator.AddTemplateOverrides(m_Template.TemplateOverridePath); } context.typeCodeGenCache.Add(m_Template.TemplatePath + m_Template.TemplateOverridePath, generator); } var fieldName = string.IsNullOrEmpty(parent) ? m_TypeInformation.FieldName : $"{parent}.{m_TypeInformation.FieldName}"; generator = generator.Clone(); generator.Replacements.Add("COMMAND_FIELD_NAME", fieldName); generator.Replacements.Add("COMMAND_FIELD_TYPE_NAME", m_TypeInformation.Type.GetFieldTypeName()); generator.GenerateFragment("COMMAND_READ", generator.Replacements, m_CommandGenerator); generator.GenerateFragment("COMMAND_WRITE", generator.Replacements, m_CommandGenerator); if (CommandType != CommandGenerator.Type.Rpc) { generator.GenerateFragment("COMMAND_READ_PACKED", generator.Replacements, m_CommandGenerator); generator.GenerateFragment("COMMAND_WRITE_PACKED", generator.Replacements, m_CommandGenerator); } if (m_TypeInformation.Type.Scope != null) { context.collectionAssemblies.Add(m_TypeInformation.Type.Scope.Name); } }
public void GenerateFields(CodeGenerator.Context context, string parent = null, Dictionary <string, GhostCodeGen.FragmentData> overrides = null) { if (m_Template == null) { return; } var quantization = m_TypeInformation.Attribute.quantization; var interpolate = m_TypeInformation.Attribute.interpolate; if (!context.typeCodeGenCache.TryGetValue(m_Template.TemplatePath + m_Template.TemplateOverridePath, out var generator)) { generator = new GhostCodeGen(m_Template.TemplatePath); if (!string.IsNullOrEmpty(m_Template.TemplateOverridePath)) { generator.AddTemplateOverrides(m_Template.TemplateOverridePath); } context.typeCodeGenCache.Add(m_Template.TemplatePath + m_Template.TemplateOverridePath, generator); } generator = generator.Clone(); // Prefix and Variable Replacements var reference = string.IsNullOrEmpty(parent) ? m_TypeInformation.FieldInfo.Name : $"{parent}.{m_TypeInformation.FieldInfo.Name}"; var name = reference.Replace('.', '_'); generator.Replacements.Add("GHOST_FIELD_NAME", $"{name}"); generator.Replacements.Add("GHOST_FIELD_REFERENCE", $"{reference}"); generator.Replacements.Add("GHOST_FIELD_TYPE_NAME", m_TypeInformation.Type.GetFieldTypeName()); if (quantization > 0) { generator.Replacements.Add("GHOST_QUANTIZE_SCALE", quantization.ToString()); generator.Replacements.Add("GHOST_DEQUANTIZE_SCALE", $"{(1.0f / quantization).ToString(CultureInfo.InvariantCulture)}f"); } // Skip fragments which have been overridden already for (int i = 0; i < k_OverridableFragments.GetLength(0); i++) { if (overrides == null || !overrides.ContainsKey(k_OverridableFragments[i, 0])) { var fragment = k_OverridableFragments[i, 1]; var targetFragment = k_OverridableFragments[i, 0]; if (targetFragment == "GHOST_COPY_FROM_SNAPSHOT" && !interpolate) { fragment = "GHOST_COPY_FROM_SNAPSHOT"; } generator.GenerateFragment(fragment, generator.Replacements, m_TargetGenerator, targetFragment); } } // Imports var imports = generator.GetFragmentTemplate("GHOST_IMPORTS"); if (!string.IsNullOrEmpty(imports)) { foreach (var import in imports.Split('\n')) { if (string.IsNullOrEmpty(import)) { continue; } var matches = m_usingRegex.Matches(import); if (matches.Count == 1) { context.imports.Add(matches[0].Value); } } } ulong fieldHash = 0; fieldHash = Entities.TypeHash.CombineFNV1A64(fieldHash, Entities.TypeHash.FNV1A64(m_TypeInformation.Attribute.composite?1:0)); fieldHash = Entities.TypeHash.CombineFNV1A64(fieldHash, Entities.TypeHash.FNV1A64(m_TypeInformation.Attribute.interpolate?1:0)); fieldHash = Entities.TypeHash.CombineFNV1A64(fieldHash, (ulong)m_TypeInformation.Attribute.subtype); fieldHash = Entities.TypeHash.CombineFNV1A64(fieldHash, (ulong)m_TypeInformation.Attribute.quantization); context.FieldState.ghostfieldHash = Entities.TypeHash.CombineFNV1A64(context.FieldState.ghostfieldHash, fieldHash); if (m_TypeInformation.Type.Scope != null) { context.collectionAssemblies.Add(m_TypeInformation.Type.Scope.Name); } m_ActiveGenerator = generator; }
public void GenerateFields(CodeGenerator.Context context, string parent = null, Dictionary <string, GhostCodeGen.FragmentData> overrides = null) { if (m_Template == null) { return; } var quantization = m_TypeInformation.Attribute.quantization; var interpolate = m_TypeInformation.Attribute.smoothing > 0; if (!context.typeCodeGenCache.TryGetValue(m_Template.TemplatePath + m_Template.TemplateOverridePath, out var generator)) { generator = new GhostCodeGen(m_Template.TemplatePath); if (!string.IsNullOrEmpty(m_Template.TemplateOverridePath)) { generator.AddTemplateOverrides(m_Template.TemplateOverridePath); } context.typeCodeGenCache.Add(m_Template.TemplatePath + m_Template.TemplateOverridePath, generator); } generator = generator.Clone(); // Prefix and Variable Replacements var reference = string.IsNullOrEmpty(parent) ? m_TypeInformation.FieldName : $"{parent}.{m_TypeInformation.FieldName}"; var name = reference.Replace('.', '_'); generator.Replacements.Add("GHOST_FIELD_NAME", $"{name}"); generator.Replacements.Add("GHOST_FIELD_REFERENCE", $"{reference}"); generator.Replacements.Add("GHOST_FIELD_TYPE_NAME", m_TypeInformation.Type.GetFieldTypeName()); if (quantization > 0) { generator.Replacements.Add("GHOST_QUANTIZE_SCALE", quantization.ToString()); generator.Replacements.Add("GHOST_DEQUANTIZE_SCALE", $"{(1.0f / quantization).ToString(CultureInfo.InvariantCulture)}f"); } float maxSmoothingDistSq = m_TypeInformation.Attribute.maxSmoothingDist * m_TypeInformation.Attribute.maxSmoothingDist; bool enableExtrapolation = m_TypeInformation.Attribute.smoothing == (uint)TypeAttribute.AttributeFlags.InterpolatedAndExtrapolated; generator.Replacements.Add("GHOST_MAX_INTERPOLATION_DISTSQ", maxSmoothingDistSq.ToString(CultureInfo.InvariantCulture)); // Skip fragments which have been overridden already for (int i = 0; i < k_OverridableFragments.GetLength(0); i++) { if (overrides == null || !overrides.ContainsKey(k_OverridableFragments[i, 0])) { var fragment = k_OverridableFragments[i, 1]; var targetFragment = k_OverridableFragments[i, 0]; if (targetFragment == "GHOST_COPY_FROM_SNAPSHOT") { if (interpolate) { m_TargetGenerator.GenerateFragment(enableExtrapolation ? "GHOST_COPY_FROM_SNAPSHOT_ENABLE_EXTRAPOLATION" : "GHOST_COPY_FROM_SNAPSHOT_DISABLE_EXTRAPOLATION", generator.Replacements, m_TargetGenerator, "GHOST_COPY_FROM_SNAPSHOT"); // The setup section is optional, so do not generate error if it is not present generator.GenerateFragment("GHOST_COPY_FROM_SNAPSHOT_INTERPOLATE_SETUP", generator.Replacements, m_TargetGenerator, "GHOST_COPY_FROM_SNAPSHOT", null, true); // only generate max distance checks if clamp is enabled if (maxSmoothingDistSq > 0) { generator.GenerateFragment("GHOST_COPY_FROM_SNAPSHOT_INTERPOLATE_DISTSQ", generator.Replacements, m_TargetGenerator, "GHOST_COPY_FROM_SNAPSHOT"); m_TargetGenerator.GenerateFragment("GHOST_COPY_FROM_SNAPSHOT_INTERPOLATE_CLAMP_MAX", generator.Replacements, m_TargetGenerator, "GHOST_COPY_FROM_SNAPSHOT"); } } else { fragment = "GHOST_COPY_FROM_SNAPSHOT"; } } generator.GenerateFragment(fragment, generator.Replacements, m_TargetGenerator, targetFragment); } } // Imports var imports = generator.GetFragmentTemplate("GHOST_IMPORTS"); if (!string.IsNullOrEmpty(imports)) { foreach (var import in imports.Split('\n')) { if (string.IsNullOrEmpty(import)) { continue; } var matches = m_usingRegex.Matches(import); if (matches.Count == 1) { context.imports.Add(matches[0].Value); } } } ulong fieldHash = 0; fieldHash = Entities.TypeHash.CombineFNV1A64(fieldHash, Entities.TypeHash.FNV1A64(m_TypeInformation.Attribute.composite?1:0)); fieldHash = Entities.TypeHash.CombineFNV1A64(fieldHash, Entities.TypeHash.FNV1A64(m_TypeInformation.Attribute.smoothing > 0 ? 1 : 0)); fieldHash = Entities.TypeHash.CombineFNV1A64(fieldHash, (ulong)m_TypeInformation.Attribute.subtype); fieldHash = Entities.TypeHash.CombineFNV1A64(fieldHash, (ulong)m_TypeInformation.Attribute.quantization); context.FieldState.ghostfieldHash = Entities.TypeHash.CombineFNV1A64(context.FieldState.ghostfieldHash, fieldHash); if (m_TypeInformation.Type.Scope != null) { context.collectionAssemblies.Add(m_TypeInformation.Type.Scope.Name); } m_ActiveGenerator = generator; }