Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
Materials.cpp
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 #pragma once
4 
5 #include <assimp/scene.h>
6 #include "Extension.h"
7 
8 #pragma make_public(aiMaterial)
9 #pragma make_public(aiTextureType)
10 
11 using namespace SiliconStudio::Core::Mathematics;
12 using namespace SiliconStudio::Paradox::AssimpNet;
13 namespace SiliconStudio {
14  namespace Paradox {
15  namespace AssimpNet {
16  namespace NetTranslation {
17  /// <summary>
18 /// Class used to translate Assimp's cpp materials datas to c#.
19 /// </summary>
20 public ref class Materials {
21 public:
22  /// <summary>
23  /// Converts an Assimp's material stack operation From c++ to c#.
24  /// </summary>
25  static array<Material::Operation>^ convertAssimpStackOperationCppToCs = {
26  Material::Operation::Add, //aiStackOperation_Add
27  Material::Operation::Add3ds, //aiStackOperation_Add3ds
28  Material::Operation::AddMaya, //aiStackOperation_AddMaya
29  Material::Operation::Average, //aiStackOperation_Average
30  Material::Operation::Color, //aiStackOperation_Color
31  Material::Operation::ColorBurn, //aiStackOperation_ColorBurn
32  Material::Operation::ColorDodge, //aiStackOperation_ColorDodge
33  Material::Operation::Darken3ds, //aiStackOperation_Darken3ds
34  Material::Operation::DarkenMaya, //aiStackOperation_DarkenMaya
35  Material::Operation::Desaturate, //aiStackOperation_Desaturate
36  Material::Operation::Difference3ds, //aiStackOperation_Difference3ds
37  Material::Operation::DifferenceMaya,//aiStackOperation_DifferenceMaya
38  Material::Operation::Divide, //aiStackOperation_Divide
39  Material::Operation::Exclusion, //aiStackOperation_Exclusion
40  Material::Operation::HardLight, //aiStackOperation_HardLight
41  Material::Operation::HardMix, //aiStackOperation_HardMix
42  Material::Operation::Hue, //aiStackOperation_Hue
43  Material::Operation::Illuminate, //aiStackOperation_Illuminate
44  Material::Operation::In, //aiStackOperation_In
45  Material::Operation::Lighten3ds, //aiStackOperation_Lighten3ds
46  Material::Operation::LightenMaya, //aiStackOperation_LightenMaya
47  Material::Operation::LinearBurn, //aiStackOperation_LinearBurn
48  Material::Operation::LinearDodge, //aiStackOperation_LinearDodge
49  Material::Operation::Multiply3ds, //aiStackOperation_Multiply3ds
50  Material::Operation::MultiplyMaya, //aiStackOperation_MultiplyMaya
51  Material::Operation::None, //aiStackOperation_None
52  Material::Operation::Out, //aiStackOperation_Out
53  Material::Operation::Over3ds, //aiStackOperation_Over3ds
54  Material::Operation::Overlay3ds, //aiStackOperation_Overlay3ds
55  Material::Operation::OverMaya, //aiStackOperation_OverMaya
56  Material::Operation::PinLight, //aiStackOperation_PinLight
57  Material::Operation::Saturate, //aiStackOperation_Saturate
58  Material::Operation::Saturation, //aiStackOperation_Saturation
59  Material::Operation::Screen, //aiStackOperation_Screen
60  Material::Operation::SoftLight, //aiStackOperation_SoftLight
61  Material::Operation::Substract3ds, //aiStackOperation_Substract3ds
62  Material::Operation::SubstractMaya, //aiStackOperation_SubstractMaya
63  Material::Operation::Value, //aiStackOperation_Value
64  Material::Operation::Mask //aiStackOperation_Mask
65  };
66  /// <summary>
67  /// Converts an Assimp's material stack node type From c++ to c#.
68  /// </summary>
69  static array<Material::StackType>^ convertAssimpStackTypeCppToCs = {
70  Material::StackType::Color, // aiStackType_ColorType
71  Material::StackType::Texture, // aiStackType_TextureType
72  Material::StackType::Operation // aiStackType_BlemdOpType
73  };
74  static array<Material::MappingMode>^ convertAssimpMappingModeCppToCs = {
75  Material::MappingMode::Wrap, // aiTextureMapMode_Wrap
76  Material::MappingMode::Clamp, // aiTextureMapMode_Clamp
77  Material::MappingMode::Mirror, // aiTextureMapMode_Mirror
78  Material::MappingMode::Decal // aiTextureMapMode_Decal
79  };
80  /// <summary>
81  /// Converts an Assimp's material stack From c++ to c#.
82  /// </summary>
83  /// <param name="material">The material contaning the stack to convert.</param>
84  /// <param name="type">The type of the stack to convert.</param>
85  /// <returns></returns>
86  static Material::Stack^ convertAssimpStackCppToCs(aiMaterial *material, const aiTextureType type) {
87  Material::Stack^ ret = gcnew Material::Stack;
88  unsigned int count = material->GetTextureCount(type);
89  // As it is represented now, the base color is at the bottom of the stack
90 
91  /*aiString path;
92  aiTextureMapping mapping;
93  unsigned int index;
94  float blend;
95  aiTextureOp textureOp;
96  aiTextureMapMode mapMode;
97  material->GetTexture(type, 0, &path, &mapping, &index, &blend, &textureOp, &mapMode);*/
98 
99  /*
100  if (type == aiTextureType_AMBIENT) {
101  aiColor3D ambient;
102  material->Get(AI_MATKEY_COLOR_AMBIENT, ambient);
103  ret->Push(gcnew Material::StackColor(Color3(ambient.r, ambient.g, ambient.b), 1.f, 1.f, 0));
104  }
105  if (type == aiTextureType_DIFFUSE) {
106  aiColor3D diffuse;
107  material->Get(AI_MATKEY_COLOR_DIFFUSE, diffuse);
108  ret->Push(gcnew Material::StackColor(Color3(diffuse.r, diffuse.g, diffuse.b), 1.f, 1.f, 0));
109  }
110  if (type == aiTextureType_SPECULAR) {
111  aiColor3D specular;
112  material->Get(AI_MATKEY_COLOR_SPECULAR, specular);
113  ret->Push(gcnew Material::StackColor(Color3(specular.r, specular.g, specular.b), 1.f, 1.f, 0));
114  }
115  if (type == aiTextureType_EMISSIVE) {
116  aiColor3D emissive;
117  material->Get(AI_MATKEY_COLOR_EMISSIVE, emissive);
118  ret->Push(gcnew Material::StackColor(Color3(emissive.r, emissive.g, emissive.b), 1.f, 1.f, 0));
119  }
120  */
121  // Process the material stack
122  for (int iEl = count-1; iEl >= 0; --iEl) {
124  // Common properties
125  int elType, elFlags;
126  float elAlpha, elBlend;
127  // Operation-specific properties
128  int elOp;
129  // Color-specific properties
130  aiColor3D elColor;
131  // Texture-specific properties
132  aiString elTexPath;
133  int elTexChannel, elMappingModeU, elMappingModeV;
134  if (AI_SUCCESS != material->Get(AI_MATKEY_TEXALPHA(type, iEl), elAlpha))
135  elAlpha = 1.f; // default alpha
136  if (AI_SUCCESS != material->Get(AI_MATKEY_TEXBLEND(type, iEl), elBlend))
137  elBlend = 1.f; // default blend
138  if (AI_SUCCESS != material->Get(AI_MATKEY_TEXFLAGS(type, iEl), elFlags))
139  elFlags = 0; // default flags (no flags)
140  if (AI_SUCCESS != material->Get(AI_MATKEY_TEXTYPE(type, iEl), elType))
141  elType = aiStackType_TextureType; //continue; // error !
142  switch (elType) {
144  if (AI_SUCCESS != material->Get(AI_MATKEY_TEXOP(type, iEl), elOp))
145  continue; // error !
146  el = gcnew Material::StackOperation(convertAssimpStackOperationCppToCs[elOp], elAlpha, elBlend, elFlags);
147  break;
149  if (AI_SUCCESS != material->Get(AI_MATKEY_TEXCOLOR(type, iEl), elColor))
150  continue; // error !
151  el = gcnew Material::StackColor(Color3(elColor.r, elColor.g, elColor.b), elAlpha, elBlend, elFlags);
152  break;
154  if (AI_SUCCESS != material->Get(AI_MATKEY_TEXTURE(type, iEl), elTexPath))
155  continue; // error !
156  if (AI_SUCCESS != material->Get(AI_MATKEY_UVWSRC(type, iEl), elTexChannel))
157  elTexChannel = 0; // default channel
158  if (AI_SUCCESS != material->Get(AI_MATKEY_MAPPINGMODE_U(type, iEl), elMappingModeU))
159  elMappingModeU = aiTextureMapMode_Wrap; // default mapping mode
160  if (AI_SUCCESS != material->Get(AI_MATKEY_MAPPINGMODE_V(type, iEl), elMappingModeV))
161  elMappingModeV = aiTextureMapMode_Wrap; // default mapping mode
162  el = gcnew Material::StackTexture(gcnew System::String(elTexPath.C_Str()),
163  elTexChannel,
164  convertAssimpMappingModeCppToCs[elMappingModeU],
165  convertAssimpMappingModeCppToCs[elMappingModeV],
166  elAlpha,
167  elBlend,
168  elFlags);
169  }
170  ret->Push(el);
171  }
172  return ret;
173  }
174 };
175  }
176  }
177  }
178 }
Class representing a texture in the new Assimp's material stack.
Represents a color in the form of rgb.
Definition: Color3.cs:41
Class representing the new Assimp's material stack in c#.
#define AI_MATKEY_TEXCOLOR(type, N)
Definition: Extension.h:12
Class representing a color in the new Assimp's material stack.
_In_ size_t count
Definition: DirectXTexP.h:174
#define AI_MATKEY_TEXALPHA(type, N)
Definition: Extension.h:13
Class representing an operation in the new Assimp's material stack.
SiliconStudio.Core.Mathematics.Color Color
Definition: ColorPicker.cs:14
void Push(StackElement element)
Pushes the specified element.
Operation
Enumeration of the different operations in the new Assimp's material stack.
#define AI_MATKEY_TEXTYPE(type, N)
Definition: Extension.h:11
Class representing an element in the new Assimp's material stack.
static Material::Stack convertAssimpStackCppToCs(aiMaterial *material, const aiTextureType type)
Converts an Assimp's material stack From c++ to c#.
Definition: Materials.cpp:86