mat.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package comm
  2. import (
  3. "math"
  4. "time"
  5. "go.mongodb.org/mongo-driver/bson/primitive"
  6. )
  7. type MaterailUv struct {
  8. Scale float32 `bson:"scale" json:"scale"`
  9. Rotate float32 `bson:"rotate" json:"rotate"`
  10. OffsetX float32 `bson:"offsetX" json:"offsetX"`
  11. OffsetY float32 `bson:"offsetY" json:"offsetY"`
  12. }
  13. type MaterialConf struct {
  14. MatId primitive.ObjectID `bson:"matId,omitempty" json:"matId"` //材质球Id
  15. Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
  16. Name string `bson:"name,omitempty" json:"name"`
  17. CusNum string `bson:"cusNum,omitempty" json:"cusNum"` //编号
  18. NormalMap *OssType `bson:"normalMap,omitempty" json:"normalMap"`
  19. DisplaceMap *OssType `bson:"displaceMap,omitempty" json:"displaceMap"` //置换贴图
  20. DisplaceFactor *float64 `bson:"displaceFactor,omitempty" json:"displaceFactor"`
  21. BaseMap *OssType `bson:"baseMap,omitempty" json:"baseMap"`
  22. BaseColor *Vect3 `bson:"baseColor,omitempty" json:"baseColor"`
  23. RoughMap *OssType `bson:"roughMap,omitempty" json:"roughMap"`
  24. RoughFactor *float64 `bson:"roughFactor,omitempty" json:"roughFactor"`
  25. MetalMap *OssType `bson:"metalMap,omitempty" json:"metalMap"`
  26. MetalFactor *float64 `bson:"metalFactor,omitempty" json:"metalFactor"`
  27. DiffuseMap *OssType `bson:"diffuseMap,omitempty" json:"diffuseMap"`
  28. DiffuseColor *Vect3 `bson:"diffuseColor,omitempty" json:"diffuseColor"`
  29. GlossMap *OssType `bson:"glossMap,omitempty" json:"glossMap"` //光泽贴图
  30. GlossFactor *float64 `bson:"glossFactor,omitempty" json:"glossFactor"`
  31. SpecMap *OssType `bson:"specMap,omitempty" json:"specMap"` //高光贴图
  32. SpecColor *Vect3 `bson:"specColor,omitempty" json:"specColor"` //高光贴图
  33. OpacMap *OssType `bson:"opacMap,omitempty" json:"opacMap"` //透明度
  34. OpacFactor *float64 `bson:"opacFactor,omitempty" json:"opacFactor"` //透明度贴图
  35. Type string `bson:"type,omitempty" json:"type"` //spec meta //高光流 金属流(默认)
  36. Uvtransform *MaterailUv `bson:"uv,omitempty" json:"uv"`
  37. CusUvTransform *MaterailUv `bson:"cusUv,omitempty" json:"cusUv"` //用户定义的uv
  38. LogicType string `bson:"logicType,omitempty" json:"logicType"` //fabric3d fabric2d color //3d面料 2d图片面料 color //特殊材质球
  39. UserData interface{} `bson:"userData,omitempty" json:"userData"` //指定要数据放置的字段
  40. }
  41. type SpecialMat struct {
  42. Id primitive.ObjectID `bson:"_id,omitempty" json:"_id"` //材质球Id
  43. Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
  44. Name string `bson:"name,omitempty" json:"name"`
  45. NormalMap *OssType `bson:"normalMap,omitempty" json:"normalMap"`
  46. DisplaceMap *OssType `bson:"displaceMap,omitempty" json:"displaceMap"` //置换贴图
  47. DisplaceFactor *float64 `bson:"displaceFactor,omitempty" json:"displaceFactor"`
  48. BaseMap *OssType `bson:"baseMap,omitempty" json:"baseMap"`
  49. BaseColor *Vect3 `bson:"baseColor,omitempty" json:"baseColor"`
  50. RoughMap *OssType `bson:"roughMap,omitempty" json:"roughMap"`
  51. RoughFactor *float64 `bson:"roughFactor,omitempty" json:"roughFactor"`
  52. MetalMap *OssType `bson:"metalMap,omitempty" json:"metalMap"`
  53. MetalFactor *float64 `bson:"metalFactor,omitempty" json:"metalFactor"`
  54. DiffuseMap *OssType `bson:"diffuseMap,omitempty" json:"diffuseMap"`
  55. DiffuseColor *Vect3 `bson:"diffuseColor,omitempty" json:"diffuseColor"`
  56. GlossMap *OssType `bson:"glossMap,omitempty" json:"glossMap"` //光泽贴图
  57. GlossFactor *float64 `bson:"glossFactor,omitempty" json:"glossFactor"`
  58. SpecMap *OssType `bson:"specMap,omitempty" json:"specMap"` //高光贴图
  59. SpecColor *Vect3 `bson:"specColor,omitempty" json:"specColor"` //高光贴图
  60. OpacMap *OssType `bson:"opacMap,omitempty" json:"opacMap"` //透明度
  61. OpacFactor *float64 `bson:"OpacFactor,omitempty" json:"OpacFactor"` //透明度贴图
  62. Type string `bson:"type,omitempty" json:"type"` //spec meta //高光流 金属流(默认)
  63. Category string `bson:"category,omitempty" json:"category"`
  64. Uvtransform *MaterailUv `bson:"uv,omitempty" json:"uv"`
  65. CreateTime time.Time `bson:"createTime,omitempty" json:"createTime"`
  66. }
  67. type LineMat struct {
  68. Id primitive.ObjectID `bson:"_id,omitempty" json:"_id"` //材质球Id
  69. Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
  70. Name string `bson:"name,omitempty" json:"name"`
  71. NormalMap *OssType `bson:"normalMap,omitempty" json:"normalMap"`
  72. DisplaceMap *OssType `bson:"displaceMap,omitempty" json:"displaceMap"` //置换贴图
  73. DisplaceFactor *float64 `bson:"displaceFactor,omitempty" json:"displaceFactor"`
  74. BaseMap *OssType `bson:"baseMap,omitempty" json:"baseMap"`
  75. BaseColor *Vect3 `bson:"baseColor,omitempty" json:"baseColor"`
  76. RoughMap *OssType `bson:"roughMap,omitempty" json:"roughMap"`
  77. RoughFactor *float64 `bson:"roughFactor,omitempty" json:"roughFactor"`
  78. MetalMap *OssType `bson:"metalMap,omitempty" json:"metalMap"`
  79. MetalFactor *float64 `bson:"metalFactor,omitempty" json:"metalFactor"`
  80. DiffuseMap *OssType `bson:"diffuseMap,omitempty" json:"diffuseMap"`
  81. DiffuseColor *Vect3 `bson:"diffuseColor,omitempty" json:"diffuseColor"`
  82. GlossMap *OssType `bson:"glossMap,omitempty" json:"glossMap"` //光泽贴图
  83. GlossFactor *float64 `bson:"glossFactor,omitempty" json:"glossFactor"`
  84. SpecMap *OssType `bson:"specMap,omitempty" json:"specMap"` //高光贴图
  85. SpecColor *Vect3 `bson:"specColor,omitempty" json:"specColor"` //高光贴图
  86. OpacMap *OssType `bson:"opacMap,omitempty" json:"opacMap"` //透明度
  87. OpacFactor *float64 `bson:"OpacFactor,omitempty" json:"OpacFactor"` //透明度贴图
  88. Type string `bson:"type,omitempty" json:"type"` //spec meta //高光流 金属流(默认)
  89. Category string `bson:"category,omitempty" json:"category"`
  90. Uvtransform *MaterailUv `bson:"uv,omitempty" json:"uv"`
  91. CreateTime time.Time `bson:"createTime,omitempty" json:"createTime"`
  92. }
  93. func (m *SpecialMat) Copy2MaterialConf() *MaterialConf {
  94. return &MaterialConf{
  95. MatId: m.Id,
  96. Thumbnail: m.Thumbnail,
  97. Name: m.Name,
  98. NormalMap: m.NormalMap,
  99. DisplaceMap: m.DiffuseMap,
  100. DisplaceFactor: m.DisplaceFactor,
  101. BaseMap: m.BaseMap,
  102. BaseColor: m.BaseColor,
  103. RoughMap: m.RoughMap,
  104. RoughFactor: m.RoughFactor,
  105. MetalMap: m.MetalMap,
  106. MetalFactor: m.MetalFactor,
  107. DiffuseMap: m.DiffuseMap,
  108. DiffuseColor: m.DiffuseColor,
  109. GlossMap: m.GlossMap,
  110. GlossFactor: m.GlossFactor,
  111. SpecMap: m.SpecMap,
  112. SpecColor: m.SpecColor,
  113. OpacMap: m.OpacMap,
  114. OpacFactor: m.OpacFactor,
  115. Type: m.Type,
  116. Uvtransform: m.Uvtransform,
  117. }
  118. }
  119. const MIN = 0.0001
  120. // MIN 为用户自定义的比较精度
  121. func IsEqualFloat32(f1, f2 float32) bool {
  122. return math.Dim(float64(f1), float64(f2)) < MIN
  123. }
  124. func IsEqualFloat64(f1, f2 float64) bool {
  125. return math.Dim(f1, f2) < MIN
  126. }
  127. func IsEqualboolp(b1p, b2p *bool) bool {
  128. b1 := false
  129. b2 := false
  130. if b1p != nil {
  131. b1 = *b1p
  132. }
  133. if b2p != nil {
  134. b2 = *b2p
  135. }
  136. return b1 == b2
  137. }
  138. func IsEqualFloat64p(f1p, f2p *float64) bool {
  139. f1 := 0.0
  140. f2 := 0.0
  141. if f1p != nil {
  142. f1 = *f1p
  143. }
  144. if f2p != nil {
  145. f2 = *f2p
  146. }
  147. return math.Dim(f1, f2) < MIN
  148. }
  149. func (mat *MaterialConf) IsEqual(mat2 *MaterialConf) bool {
  150. changed := false
  151. if mat.BaseMap == nil || mat2.BaseMap == nil {
  152. changed = changed || mat.BaseMap != mat2.BaseMap
  153. } else {
  154. changed = changed || (*mat.BaseMap).Url != (*mat2.BaseMap).Url
  155. }
  156. if mat.NormalMap == nil || mat2.NormalMap == nil {
  157. changed = changed || mat.NormalMap != mat2.NormalMap
  158. } else {
  159. changed = changed || (*mat.NormalMap).Url != (*mat2.NormalMap).Url
  160. }
  161. if mat.RoughMap == nil || mat2.RoughMap == nil {
  162. changed = changed || mat.RoughMap != mat2.RoughMap
  163. } else {
  164. changed = changed || (*mat.RoughMap).Url != (*mat2.RoughMap).Url
  165. }
  166. if mat.SpecMap == nil || mat2.SpecMap == nil {
  167. changed = changed || mat.SpecMap != mat2.SpecMap
  168. } else {
  169. changed = changed || (*mat.SpecMap).Url != (*mat2.SpecMap).Url
  170. }
  171. changed = changed || !IsEqualFloat64p(mat.RoughFactor, mat2.RoughFactor)
  172. changed = changed || !IsEqualFloat64p(mat.MetalFactor, mat2.MetalFactor)
  173. if mat.MetalMap == nil || mat2.MetalMap == nil {
  174. changed = changed || mat.MetalMap != mat2.MetalMap
  175. } else {
  176. changed = changed || (*mat.MetalMap).Url != (*mat2.MetalMap).Url
  177. }
  178. if changed {
  179. return false
  180. }
  181. if mat.Uvtransform == nil || mat2.Uvtransform == nil {
  182. changed = mat2.Uvtransform == nil
  183. } else {
  184. changed = changed || !IsEqualFloat32(mat.Uvtransform.OffsetX, mat2.Uvtransform.OffsetX) ||
  185. !IsEqualFloat32(mat.Uvtransform.Scale, mat2.Uvtransform.Scale) ||
  186. !IsEqualFloat32(mat.Uvtransform.Rotate, mat2.Uvtransform.Rotate)
  187. }
  188. return !changed
  189. }