package.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. package comm
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "net/url"
  8. "strings"
  9. "time"
  10. "go.mongodb.org/mongo-driver/bson/primitive"
  11. )
  12. type DesignProduct struct { //设计单品信息
  13. Id primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
  14. ProjectId primitive.ObjectID `bson:"projectId,omitempty" json:"projectId"`
  15. FromDbConfId string `bson:"fromDbConfId,omitempty" json:"fromDbConfId"` //数据库定义Id
  16. FromAssetConfId string `bson:"fromAssetConfId,omitempty" json:"fromAssetConfId"`
  17. FromId string `bson:"fromId,omitempty" json:"fromId"`
  18. Name string `bson:"name,omitempty" json:"name"`
  19. Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
  20. StaticMesh *StaticMeshSource `bson:"staticMesh,omitempty" json:"staticMesh"` //静态模型资产
  21. UpdateTime time.Time `bson:"updateTime,omitempty" json:"updateTime"`
  22. }
  23. type ProductHeader struct {
  24. Id string `bson:"id,omitempty" json:"id"`
  25. FromDbConfId string `bson:"fromDbConfId,omitempty" json:"fromDbConfId"` //数据库定义Id
  26. FromAssetConfId string `bson:"fromAssetConfId,omitempty" json:"fromAssetConfId"` //数据包
  27. FromId string `bson:"fromId,omitempty" json:"fromId"`
  28. Name string `bson:"name,omitempty" json:"name"`
  29. Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
  30. CreateTime time.Time `bson:"createTime,omitempty" json:"createTime"`
  31. }
  32. type PackageProductCompMat struct {
  33. Id string `bson:"id" json:"id"`
  34. UvMap *OssType `bson:"uvmap" json:"uvmap"`
  35. UvSize *UvSize `bson:"uvsize" json:"uvsize"`
  36. Name string `bson:"name" json:"name"`
  37. MatId string `bson:"matId" json:"matId"`
  38. GroupId string `bson:"groupId" json:"groupId"` //部件分组Id
  39. Index int `bson:"index" json:"index"`
  40. Visible *bool `bson:"visible" json:"visible"`
  41. Locked *bool `bson:"locked" json:"locked"` //是否锁定
  42. Images []*ComponentImage `bson:"images" json:"images"`
  43. PaperMatId string `bson:"paperMatId" json:"paperMatId"` //纸张id
  44. UserData interface{} `bson:"userData,omitempty" json:"userData,omitempty"` //自定义数据
  45. }
  46. type PackageProduct struct {
  47. Id string `bson:"id,omitempty" json:"id"`
  48. GeomId string `bson:"geomId,omitempty" json:"geomId"`
  49. Name string `bson:"name,omitempty" json:"name"`
  50. CusNum string `bson:"cusNum,omitempty" json:"cusNum,omitempty"`
  51. Type string `bson:"type,omitempty" json:"type,omitempty"` //类型
  52. Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
  53. Components []*PackageProductCompMat `bson:"components,omitempty" json:"components"`
  54. UserData interface{} `bson:"userData,omitempty" json:"userData,omitempty"` //自定义数据
  55. }
  56. func (p *PackageProduct) UpdateSourceUrl(handler UpdateUrlHandler) {
  57. if p.Thumbnail != nil {
  58. p.Thumbnail.UpdateSourceUrl(handler)
  59. }
  60. for _, c := range p.Components {
  61. if c.UvMap != nil {
  62. c.UvMap.UpdateSourceUrl(handler)
  63. }
  64. }
  65. }
  66. type PackageGeom struct {
  67. Id string `bson:"id,omitempty" json:"id"`
  68. Name string `bson:"name,omitempty" json:"name"`
  69. Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
  70. Osgjs *OssType `bson:"osgjs,omitempty" json:"osgjs"`
  71. File *OssType `bson:"file,omitempty" json:"file"` //hdr or fbx
  72. Glb *OssType `bson:"glb,omitempty" json:"glb"` //hdr or fbx
  73. Shadow *OssType `bson:"shadow,omitempty" json:"shadow,omitempty"`
  74. BoundingBox *Obb `bson:"boundingBox,omitempty" json:"boundingBox,omitempty"`
  75. GenType string `bson:"genType,omitempty" json:"genType,omitempty"` //生成方式构建类型staticMesh, paramBox //默认staticMesh类型
  76. GenConf interface{} `bson:"genConf,omitempty" json:"genConf,omitempty"` //构建配置
  77. }
  78. func (g *PackageGeom) UpdateSourceUrl(handler UpdateUrlHandler) {
  79. if g.Thumbnail != nil {
  80. g.Thumbnail.UpdateSourceUrl(handler)
  81. }
  82. if g.Osgjs != nil {
  83. g.Osgjs.UpdateSourceUrl(handler)
  84. }
  85. if g.File != nil {
  86. g.File.UpdateSourceUrl(handler)
  87. }
  88. if g.Glb != nil {
  89. g.Glb.UpdateSourceUrl(handler)
  90. }
  91. if g.Shadow != nil {
  92. g.Shadow.UpdateSourceUrl(handler)
  93. }
  94. }
  95. type PackageSceneProduct struct {
  96. Id string `bson:"id,omitempty" json:"id"`
  97. ProdId string `bson:"prodId,omitempty" json:"prodId"`
  98. Transform *ModelTransform `bson:"transform,omitempty" json:"transform,omitempty"`
  99. Visible *bool `bson:"visible,omitempty" json:"visible,omitempty"`
  100. NoShadow *bool `bson:"noShadow,omitempty" json:"noShadow,omitempty"` //是否不显示阴影
  101. UserData interface{} `bson:"userData,omitempty" json:"userData,omitempty"` //自定义数据
  102. }
  103. type PackageScene struct {
  104. Id string `bson:"id,omitempty" json:"id,omitempty"`
  105. Name string `bson:"name,omitempty" json:"name,omitempty"`
  106. Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail,omitempty"`
  107. EnvId string `bson:"envId,omitempty" json:"envId,omitempty"`
  108. Products []*PackageSceneProduct `bson:"products,omitempty" json:"products,omitempty"`
  109. Lights *SceneLight `bson:"lights,omitempty" json:"lights,omitempty"`
  110. Stickers []*PackSceneSticker `bson:"stickers,omitempty" json:"stickers,omitempty"`
  111. CreateTime time.Time `bson:"createTime,omitempty" json:"createTime"`
  112. UpdateTime time.Time `bson:"updateTime,omitempty" json:"updateTime"`
  113. Background *Evn3dBackground `bson:"background,omitempty" json:"background"` //添加背景配置
  114. UserData interface{} `bson:"userData,omitempty" json:"userData,omitempty"` //自定义数据
  115. }
  116. func (s *PackageScene) UpdateSourceUrl(handler UpdateUrlHandler) {
  117. if s.Thumbnail != nil {
  118. s.Thumbnail.UpdateSourceUrl(handler)
  119. }
  120. for _, tiker := range s.Stickers {
  121. if tiker.Img != nil {
  122. tiker.Img.UpdateSourceUrl(handler)
  123. }
  124. }
  125. if s.Background != nil && s.Background.Image != nil {
  126. s.Background.Image.UpdateSourceUrl(handler)
  127. }
  128. }
  129. type PositionObj2d struct {
  130. X int `bson:"x,omitempty" json:"x"`
  131. Y int `bson:"y,omitempty" json:"y"`
  132. }
  133. type PackSceneSticker struct {
  134. Id string `bson:"id,omitempty" json:"id"`
  135. Config interface{} `bson:"config,omitempty" json:"config"`
  136. Img *OssType `bson:"img,omitempty" json:"img"`
  137. Mirror []int `bson:"mirror,omitempty" json:"mirror"`
  138. Position PositionObj2d `bson:"position,omitempty" json:"position"`
  139. Rotation int `bson:"rotation,omitempty" json:"rotation"`
  140. Scale []float32 `bson:"scale,omitempty" json:"scale"`
  141. Visible *bool `bson:"visible,omitempty" json:"visible"`
  142. }
  143. type PackageEnv3d struct {
  144. Id string `bson:"id,omitempty" json:"id"`
  145. Name string `bson:"name,omitempty" json:"name"`
  146. CusNum string `bson:"cusNum,omitempty" json:"cusNum"` //自定义编号
  147. Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
  148. CreateTime time.Time `bson:"createTime,omitempty" json:"createTime"`
  149. HDR *OssType `bson:"hdr,omitempty" json:"hdr"`
  150. Config *Evn3dHdrConf `bson:"config,omitempty" json:"config"`
  151. Options *Env3dOption `bson:"options,omitempty" json:"options"`
  152. ToneMap *ToneMap `bson:"toneMap,omitempty" json:"toneMap"`
  153. Background *Evn3dBackground `bson:"background,omitempty" json:"background"`
  154. UserData interface{} `bson:"userData,omitempty" json:"userData"` //用户数据
  155. }
  156. func (e *PackageEnv3d) UpdateSourceUrl(handler UpdateUrlHandler) {
  157. if e.Thumbnail != nil {
  158. e.Thumbnail.UpdateSourceUrl(handler)
  159. }
  160. if e.HDR != nil {
  161. e.HDR.UpdateSourceUrl(handler)
  162. }
  163. if e.Config != nil {
  164. e.Config.UpdateSourceUrl(handler)
  165. }
  166. if e.Background != nil && e.Background.Image != nil {
  167. e.Background.Image.UpdateSourceUrl(handler)
  168. }
  169. }
  170. type PackageMaterial struct {
  171. Id string `bson:"id,omitempty" json:"id"`
  172. Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
  173. Name string `bson:"name,omitempty" json:"name"`
  174. CusNum string `bson:"cusNum,omitempty" json:"cusNum"` //编号
  175. NormalMap *OssType `bson:"normalMap,omitempty" json:"normalMap"`
  176. DisplaceMap *OssType `bson:"displaceMap,omitempty" json:"displaceMap"` //置换贴图
  177. DisplaceFactor *float64 `bson:"displaceFactor,omitempty" json:"displaceFactor"`
  178. BaseMap *OssType `bson:"baseMap,omitempty" json:"baseMap"`
  179. BaseColor *Vect3 `bson:"baseColor,omitempty" json:"baseColor"`
  180. RoughMap *OssType `bson:"roughMap,omitempty" json:"roughMap"`
  181. RoughFactor *float64 `bson:"roughFactor,omitempty" json:"roughFactor"`
  182. MetalMap *OssType `bson:"metalMap,omitempty" json:"metalMap"`
  183. MetalFactor *float64 `bson:"metalFactor,omitempty" json:"metalFactor"`
  184. DiffuseMap *OssType `bson:"diffuseMap,omitempty" json:"diffuseMap"`
  185. DiffuseColor *Vect3 `bson:"diffuseColor,omitempty" json:"diffuseColor"`
  186. GlossMap *OssType `bson:"glossMap,omitempty" json:"glossMap"` //光泽贴图
  187. GlossFactor *float64 `bson:"glossFactor,omitempty" json:"glossFactor"`
  188. SpecMap *OssType `bson:"specMap,omitempty" json:"specMap"` //高光贴图
  189. SpecColor *Vect3 `bson:"specColor,omitempty" json:"specColor"` //高光贴图
  190. //工艺相关材质球
  191. TechMaterial *TechMatConfig `bson:"techMaterial" json:"techMaterial"`
  192. Images []*ComponentImage `bson:"images" json:"images"`
  193. OpacMap *OssType `bson:"opacMap,omitempty" json:"opacMap"` //透明度
  194. OpacFactor *float64 `bson:"opacFactor,omitempty" json:"opacFactor"` //透明度贴图
  195. Type string `bson:"type,omitempty" json:"type"` //spec meta //高光流 金属流(默认)
  196. Uvtransform *MaterailUv `bson:"uv,omitempty" json:"uv"`
  197. CusUvTransform *MaterailUv `bson:"cusUv,omitempty" json:"cusUv"` //用户定义的uv
  198. //LogicType string `bson:"logicType,omitempty" json:"logicType"` //fabric3d fabric2d color //3d面料 2d图片面料 color //特殊材质球
  199. UvMap string `bson:"uvMap,omitempty" json:"uvMap"` //uv的映射方式 box 或 uv 默认box
  200. UserData interface{} `bson:"userData,omitempty" json:"userData"` //指定要数据放置的字段
  201. }
  202. func (m *PackageMaterial) CopyFromMatConf(c *MaterialConf) {
  203. m.Thumbnail = c.Thumbnail
  204. m.BaseColor = c.BaseColor
  205. m.BaseMap = c.BaseMap
  206. m.MetalFactor = c.MetalFactor
  207. m.MetalMap = c.MetalMap
  208. m.RoughFactor = c.RoughFactor
  209. m.RoughMap = c.RoughMap
  210. m.NormalMap = c.NormalMap
  211. m.Name = c.Name
  212. if len(c.Type) > 0 {
  213. m.Type = c.Type
  214. }
  215. m.OpacFactor = c.OpacFactor
  216. m.OpacMap = c.OpacMap
  217. m.Uvtransform = c.Uvtransform
  218. m.CusNum = c.CusNum
  219. m.DiffuseColor = c.DiffuseColor
  220. m.DiffuseMap = c.DiffuseMap
  221. m.DisplaceFactor = c.DisplaceFactor
  222. m.DisplaceMap = c.DisplaceMap
  223. m.GlossFactor = c.GlossFactor
  224. m.GlossMap = c.GlossMap
  225. m.SpecColor = c.SpecColor
  226. m.SpecMap = c.SpecMap
  227. }
  228. type Queen3dPackageSource struct {
  229. Version string `bson:"version,omitempty" json:"version"`
  230. ViewMode string `bson:"viewMode,omitempty" json:"viewMode"` //prod or scene //单品或场景
  231. //材质球
  232. Mats []*MatConfigSource `bson:"mats,omitempty" json:"mats"`
  233. //几何体
  234. Geoms []*PackageGeom `bson:"geoms,omitempty" json:"geoms"`
  235. //环境
  236. Env3ds []*PackageEnv3d `bson:"env3ds,omitempty" json:"env3ds"`
  237. //使用的单品
  238. Products []*PackageProduct `bson:"products,omitempty" json:"products"`
  239. //场景
  240. Scenes []*PackageScene `bson:"scenes,omitempty" json:"scenes"`
  241. UserData interface{} `bson:"userData,omitempty" json:"userData"` //指定要数据放置的字段
  242. }
  243. // 根据url获取路径和文件名
  244. func ParseUrl(ourl string) (fullName string, err error) {
  245. parsedURL, err := url.Parse(ourl)
  246. if err != nil {
  247. fmt.Println("Error parsing URL:", err)
  248. return "", err
  249. }
  250. fullName = strings.TrimPrefix(parsedURL.Path, "/")
  251. // fileName = path[strings.LastIndex(path, "/")+1:]
  252. // fmt.Printf("source file => path:%s, fileName:%s", path, fileName)
  253. return fullName, nil
  254. }
  255. func DownloadToSource(url string) (*Queen3dPackageSource, error) {
  256. // 下载文件
  257. resp, err := http.Get(url)
  258. if err != nil {
  259. fmt.Println("Error downloading file:", err)
  260. return nil, err
  261. }
  262. defer resp.Body.Close()
  263. // 读取响应体内容
  264. body, err := io.ReadAll(resp.Body)
  265. if err != nil {
  266. fmt.Println("Error reading response body:", err)
  267. return nil, err
  268. }
  269. // 解析JSON
  270. source := &Queen3dPackageSource{}
  271. err = json.Unmarshal(body, source)
  272. if err != nil {
  273. fmt.Println("Error parsing JSON:", err)
  274. return nil, err
  275. }
  276. return source, nil
  277. }
  278. func DownloadToSourceHdr(url string) (*HdrSource, error) {
  279. // 下载文件
  280. resp, err := http.Get(url)
  281. if err != nil {
  282. fmt.Println("Error downloading file:", err)
  283. return nil, err
  284. }
  285. defer resp.Body.Close()
  286. // 读取响应体内容
  287. body, err := io.ReadAll(resp.Body)
  288. if err != nil {
  289. fmt.Println("Error reading response body:", err)
  290. return nil, err
  291. }
  292. // 解析JSON
  293. source := &HdrSource{}
  294. err = json.Unmarshal(body, source)
  295. if err != nil {
  296. fmt.Println("Error parsing JSON:", err)
  297. return nil, err
  298. }
  299. return source, nil
  300. }
  301. func DownloadToSourceHdrMap(url string) (map[string]interface{}, error) {
  302. // 下载文件
  303. resp, err := http.Get(url)
  304. if err != nil {
  305. fmt.Println("Error downloading file:", err)
  306. return nil, err
  307. }
  308. defer resp.Body.Close()
  309. // 读取响应体内容
  310. body, err := io.ReadAll(resp.Body)
  311. if err != nil {
  312. fmt.Println("Error reading response body:", err)
  313. return nil, err
  314. }
  315. // 解析JSON
  316. source := map[string]interface{}{}
  317. err = json.Unmarshal(body, &source)
  318. if err != nil {
  319. fmt.Println("Error parsing JSON:", err)
  320. return nil, err
  321. }
  322. return source, nil
  323. }