From ebf41d6d202f02dd3aa9264cfe9c10b72729efb1 Mon Sep 17 00:00:00 2001 From: GuoLei Date: Thu, 2 Sep 2021 15:13:30 +0800 Subject: [PATCH] Merge Dev/0.5 (#474) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: use new addChannel api * style: format code * feat: opt code * feat: merge gltf animation parser * feat: opt code * fix:opt code * refator: opt code * refactor: opt code * refactor: clear imports * refactor:fix bug * refactor: opt code * refactor: opt code * feat: fix tsc * feat: opt code * feat: opt crossfade performance * feat: opt crossfade performance * feat: opt crossfade * feat: opt crossfade * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * feat: opt mergedCurveIndexList * feat: opt mergedCurveIndexList * feat: add revert * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * feat: opt corssfade from pose * feat: resolve conflict from cm * refactor: opt code * feat: fix type * fix: fix additive * refactor: opt code * refactor: opt struct of Animation Node data * feat: fix comment * feat: clear import * refactor: add CM * refactor: opt code * refactor: opt crossFade code * refactor: opt code * refactor: opt code * refactor: opt Animator code * refactor: opt code * Delete package-lock.json delete package-lock * Merge main (#349) * refactor: opt code * refactor: opt code * refactor: improve play API * refactor: opt code * refactor: opt code * refactor: fix code * refactor: opt code * refactor: move internal class to internal folder * refactor: remove generic * refactor: save code * refactor: opt code * refactor: opt Layer update * refactor: opt code * refactor: reduce GC * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: remove playState * refactor: solve CM * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: add layer opt * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: opt interface design * refactor: opt code * refactor: opt code * refactor: clear imports * Animator (#337) * refactor: refactor animator #35 * refactor: sprite material add define USE_MODEL_MATRIX (#359) * refactor(2d): sprite material add define USE_MODEL_MATRIX * feat: add animator-event * feat: add animator-event * feat: opt event code * feat: add animator-event * feat: opt code * feat: merge oasis dev/0,5 * feat: opt code * refactor: opt code * refactor: opt code * refactor: opt code * refactor: clear imports * feat: add some commonly used methods for `Color`(#385) * test: add color test (#391) Co-authored-by: shensi.zxd * feat: opt code * feat: opt code * feat: opt code * feat: opt code * feat: opt code * feat: opt code * feat: opt code * feat: opt code * refactor: opt code * refactor: opt code * Animator event (#372) * feat: add AnimatorEvent system #35 * Dev/0.5 (#397) * fix: fix Animator bug * Dev/0.5 (#399) * fix: fix Animator bug * Blend shape animation (#374) * feat: add BlendShape Animation * feat: add ObjectKeyframe for AnimationCurve (#403) * Refactor physics Ray-cast and Collision detection (#404) * feat: add trigger methods into Script and rewrite CollisionDetection * Update README.md * Fix Typos (#409) * fix: typos fixed * Add sprite atlas region offset (#407) * feat: add ObjectKeyframe * refactor: opt code * refactor: opt code * refactor: improve comments * Fix Typos (#410) * fix: fix typos * feat:Support atlas #197 (#402) * feat:Support atlas #197 Co-authored-by: azhan Co-authored-by: GuoLei1990 * refactor: add tips for developers when use draco and BlendShape at the same time (#414) * refactor: new pbr interface (#418) * refactor: new pbr interface * Feat: support spherical harmonic (#392) * feat: support spherical harmonics * fix:opt atlas code. (#420) * fix:opt atlas code * fix: glTF vertexData parser error (#423) * fix: set interpolation with `linear` by default (#424) * fix: set interpolation with `linear` by default Co-authored-by: shensi.zxd * Fix material clone (#426) * fix: fix material clone bug * fix:atlas support rotation (#428) * fix:atlas support rotation * ci: compile error (#429) Co-authored-by: shensi.zxd * fix: `ModleMesh` destroy bug (#430) * Fix the comments of RenderState (#431) * fix: the comments of `RasterState` * feat: add sh in editor (#433) * Add Scene Background Texture (#427) * feat: add scene background texture * Background texture (#434) * refactor: opt code * Test/material (#422) * feat: add material test * v0.5.0-alpha.0 * Test: test for math (#437) * test: add test for math library * fix:Fixed sprite’s rect display error when packaged into an atlas and trimmed (#435) * fix:Fixed sprite’s rect display error when packaged into an atlas and trimmed * Fix BlendShape bug (#441) * fix: `ModleMesh` memory access bug * Add blendshape test (#442) * refactor: add `Blendshape` test * Fix blend shape add frame (#445) * refactor: fix addFrame() of BlendShape * Test for Background (#438) * test: test for background * Fix Background Texture Error (#446) * refactor: fix background texture bug * v0.5.1-alpha.0 * v0.5.2-alpha.0 * v0.5.3-alpha.0 * fix: temp fix type convert function (#449) * v0.5.3-0.5.0-alpha.1.0 * v0.5.3-alpha.0 * v0.5.3-alpha.1 * feat: support vertex color for Blinnphone (#450) * feat: support vertex color for Blinnphone * fix: BlendShape access bug (#451) * feat:Add the function of relative path loading. (#439) * feat:Add the function of relative path loading * fix: fix 2d renderer order error (#452) * fix: 2d renderer order error opt code * feat: adapt to editor * feat: adapt to editor * feat: adapt to editor * feat: adapt to editor * feat: adapt to editor * feat: adapt to editor * refactor: opt animator * v0.5.3-alpha.2 * refactor: opt code * feat: update * refactor: opt code * fix: gltf no animation bug * refactor: opt code * refactor: oopt code * refactor: opt code * refactor: opt code * feat: opt animator editor * feat: opt animator editor * fix: revert PHYSICALLY_CORRECT_LIGHTS * fix: revert PHYSICALLY_CORRECT_LIGHTS (#455) * v0.5.3-alpha.3 * refactor: revert gamma space * refactor: revert gamma space (#457) * v0.5.3-alpha.4 * Fix Caluculation Error in Background Size (#458) * refactor: fix background calculation * feat: opt animator editor * fix: bugfix * Animator editor (#454) * fix: bugfix * v0.5.3-alpha.5 * v0.5.3-alpha.6 * feat: remove log * feat: remove log * Animator editor (#463) * refactor: remove log * fix: check valid if sh is null (#464) Co-authored-by: shensi.zxd * v0.5.3-alpha.7 * feat: add more interface for raycast (#462) * feat: add more interface for raycast * feat:SpriteAtlas Adaptation Editor Workflow (#461) * feat:SpriteAtlas Adaptation Editor Workflow * feat: 上传编辑器clip数据改为引用 * fix: bugfix * v0.5.3-alpha.8 * fix: code err (#467) * fix: ccompile err * v0.5.3-y.0 * v0.5.3-alpha.8 * v0.5.3-alpha.9 * fix(2d): spine texture uniform (#468) * v0.5.3-alpha.10 * fix(2d): fix mask uniform (#471) * fix: bugfix (#470) * v0.5.3-alpha.11 * Merge main to dev/0.5 (#472) * fix: ModelMesh destroy bug (#473) * fix: `ModelMesh` destroy() bug * v0.5.3-alpha.12 * v0.5.0 Co-authored-by: luzhuang <364439895@qq.com> Co-authored-by: shensi.zxd Co-authored-by: singlecoder Co-authored-by: zhuxudong Co-authored-by: yangfengzzz Co-authored-by: AZhan Co-authored-by: azhan Co-authored-by: Hu Song Co-authored-by: Izzy Chen Co-authored-by: singlecoder --- README.md | 5 +- lerna.json | 2 +- packages/controls/package.json | 4 +- packages/controls/src/OrbitControl.ts | 4 +- packages/core/package.json | 6 +- packages/core/src/2d/atlas/SpriteAtlas.ts | 75 ++ packages/core/src/2d/atlas/types.ts | 37 + packages/core/src/2d/index.ts | 1 + packages/core/src/2d/sprite/Sprite.ts | 292 ++++--- packages/core/src/2d/sprite/SpriteMask.ts | 2 +- packages/core/src/2d/sprite/SpriteMaterial.ts | 41 - packages/core/src/2d/sprite/SpriteRenderer.ts | 18 +- packages/core/src/Background.ts | 84 ++ packages/core/src/Camera.ts | 22 +- packages/core/src/Component.ts | 10 +- packages/core/src/ComponentsDependencies.ts | 10 +- packages/core/src/ComponentsManager.ts | 18 +- packages/core/src/DisorderedArray.ts | 8 + packages/core/src/Engine.ts | 55 +- packages/core/src/Entity.ts | 31 +- packages/core/src/FeatureManager.ts | 4 +- packages/core/src/HitResult.ts | 16 + packages/core/src/PhysicsManager.ts | 135 +++ .../src/RenderPipeline/BasicRenderPipeline.ts | 28 +- .../core/src/RenderPipeline/RenderQueue.ts | 31 +- .../core/src/RenderPipeline/SpriteBatcher.ts | 10 +- .../src/RenderPipeline/SpriteMaskBatcher.ts | 13 +- packages/core/src/Renderer.ts | 4 + packages/core/src/Scene.ts | 16 +- packages/core/src/Script.ts | 62 +- packages/core/src/Transform.ts | 27 +- packages/core/src/UpdateFlagManager.ts | 19 + packages/core/src/animation/Animation.ts | 452 ----------- packages/core/src/animation/AnimationClip.ts | 350 +++----- .../animation/AnimationClipCurveBinding.ts | 19 + packages/core/src/animation/AnimationConst.ts | 35 - packages/core/src/animation/AnimationCurve.ts | 368 +++++++++ packages/core/src/animation/AnimationEvent.ts | 11 + packages/core/src/animation/AnimationLayer.ts | 507 ------------ packages/core/src/animation/Animator.ts | 767 ++++++++++++++++++ .../core/src/animation/AnimatorController.ts | 71 ++ .../src/animation/AnimatorControllerLayer.ts | 19 + packages/core/src/animation/AnimatorState.ts | 98 +++ .../src/animation/AnimatorStateMachine.ts | 68 ++ .../core/src/animation/AnimatorTransition.ts | 15 + packages/core/src/animation/AnimatorUtils.ts | 36 + packages/core/src/animation/KeyFrame.ts | 42 + packages/core/src/animation/Motion.ts | 4 + .../src/animation/enums/AnimationEventType.ts | 11 + .../src/animation/enums/AnimationProperty.ts | 6 + .../animation/enums/AnimatorConditionMode.ts | 8 + .../enums/AnimatorLayerBlendingMode.ts | 4 + .../animation/enums/InterpolableValueType.ts | 8 + .../src/animation/enums/InterpolationType.ts | 13 + .../core/src/animation/enums/LayerState.ts | 13 + .../core/src/animation/enums/PlayState.ts | 13 + packages/core/src/animation/enums/WrapMode.ts | 9 + packages/core/src/animation/index.ts | 18 +- .../animation/internal/AnimationCurveOwner.ts | 77 ++ .../internal/AnimationEventHandler.ts | 8 + .../animation/internal/AnimatorLayerData.ts | 24 + .../animation/internal/AnimatorStateData.ts | 10 + .../animation/internal/AnimatorStateInfo.ts | 9 + .../internal/AnimatorStatePlayData.ts | 38 + .../src/animation/internal/CrossCurveData.ts | 9 + packages/core/src/animation/types.ts | 51 -- packages/core/src/asset/AssetType.ts | 6 +- packages/core/src/asset/Loader.ts | 2 +- packages/core/src/asset/RefObject.ts | 2 +- packages/core/src/asset/ResourceManager.ts | 4 +- packages/core/src/base/Constant.ts | 1 + packages/core/src/clone/CloneManager.ts | 23 +- packages/core/src/clone/ComponentCloner.ts | 4 +- packages/core/src/collider/ABoxCollider.ts | 23 +- packages/core/src/collider/ASphereCollider.ts | 26 +- packages/core/src/collider/Collider.ts | 38 + packages/core/src/collider/PlaneCollider.ts | 24 +- .../core/src/collision/CollisionDetection.ts | 69 +- packages/core/src/enums/BackgroundMode.ts | 4 +- .../src/enums/BackgroundTextureFillMode.ts | 11 + packages/core/src/graphic/Buffer.ts | 2 +- packages/core/src/graphic/Mesh.ts | 19 +- packages/core/src/index.ts | 5 +- packages/core/src/lighting/AmbientLight.ts | 106 ++- packages/core/src/lighting/KHR_lights.ts | 2 +- .../core/src/lighting/enums/DiffuseMode.ts | 10 +- packages/core/src/material/BaseMaterial.ts | 39 +- .../core/src/material/BlinnPhongMaterial.ts | 96 +-- packages/core/src/material/PBRBaseMaterial.ts | 404 ++------- packages/core/src/material/PBRMaterial.ts | 87 +- .../core/src/material/PBRSpecularMaterial.ts | 45 +- packages/core/src/material/UnlitMaterial.ts | 32 +- packages/core/src/mesh/BlendShape.ts | 100 +++ packages/core/src/mesh/BlendShapeFrame.ts | 42 + packages/core/src/mesh/MeshRenderer.ts | 7 +- packages/core/src/mesh/ModelMesh.ts | 384 ++++++--- packages/core/src/mesh/PrimitiveMesh.ts | 6 +- packages/core/src/mesh/Skin.ts | 4 +- packages/core/src/mesh/SkinnedMeshRenderer.ts | 54 +- packages/core/src/mesh/index.ts | 2 + .../core/src/particle/ParticleRenderer.ts | 135 +-- packages/core/src/raycast/RaycastHit.ts | 23 - packages/core/src/raycast/index.ts | 146 ---- .../IPlatformTextureCubeMap.ts | 2 +- packages/core/src/shader/Shader.ts | 2 +- packages/core/src/shader/ShaderData.ts | 10 +- packages/core/src/shader/ShaderPool.ts | 3 + packages/core/src/shader/ShaderProgram.ts | 12 +- packages/core/src/shader/ShaderUniform.ts | 140 ++-- packages/core/src/shader/state/BlendState.ts | 2 +- packages/core/src/shader/state/RasterState.ts | 6 +- packages/core/src/shaderlib/ShaderLib.ts | 14 +- .../core/src/shaderlib/begin_mobile_frag.glsl | 6 + .../core/src/shaderlib/blendShape_input.glsl | 23 + .../core/src/shaderlib/blendShape_vert.glsl | 24 + .../extra/background-texture.fs.glsl | 7 + .../extra/background-texture.vs.glsl | 9 + .../src/shaderlib/extra/blinn-phong.fs.glsl | 1 + .../src/shaderlib/extra/blinn-phong.vs.glsl | 5 +- packages/core/src/shaderlib/extra/pbr.fs.glsl | 5 - packages/core/src/shaderlib/extra/pbr.vs.glsl | 3 +- .../src/shaderlib/extra/shadow-map.vs.glsl | 2 + .../src/shaderlib/extra/sprite-mask.fs.glsl | 4 +- .../core/src/shaderlib/extra/sprite.fs.glsl | 9 + .../core/src/shaderlib/extra/sprite.vs.glsl | 9 + .../core/src/shaderlib/extra/unlit.vs.glsl | 2 + packages/core/src/shaderlib/gamma_frag.glsl | 2 +- .../src/shaderlib/pbr/base_frag_define.glsl | 11 +- .../core/src/shaderlib/pbr/begin_frag.glsl | 88 +- .../pbr/envmap_light_frag_define.glsl | 4 +- .../src/shaderlib/pbr/ibl_diffuse_frag.glsl | 26 +- .../pbr/ibl_diffuse_frag_define.glsl | 19 + .../pbr/ibl_specular_frag_define.glsl | 28 +- .../shaderlib/pbr/texture_frag_define.glsl | 24 - .../src/shaderlib/pbr/util_frag_define.glsl | 21 +- .../core/src/shaderlib/perturbation_frag.glsl | 9 - .../src/shaderlib/perturbation_share.glsl | 5 - .../core/src/shaderlib/refraction_frag.glsl | 10 - .../core/src/shaderlib/refraction_share.glsl | 7 - packages/core/src/shadow/Extension.ts | 2 +- packages/core/src/shadow/ShadowFeature.ts | 6 +- packages/core/src/texture/Texture2DArray.ts | 105 +++ packages/core/src/texture/TextureCubeMap.ts | 2 +- .../texture/enums/RenderBufferColorFormat.ts | 4 +- .../src/texture/enums/TextureFilterMode.ts | 2 +- .../core/src/texture/enums/TextureWrapMode.ts | 2 +- packages/core/src/trail/TrailRenderer.ts | 24 +- packages/core/tests/AssetPromise.test.ts | 4 +- packages/core/tests/Background.test.ts | 70 ++ packages/core/tests/Camera.test.ts | 2 +- packages/core/tests/ModelMesh.test.ts | 33 +- packages/core/tests/Request.test.ts | 6 +- .../core/tests/material/BaseMaterial.test.ts | 79 ++ .../tests/material/BlinnPhongMaterial.test.ts | 87 ++ .../tests/material/PBRBaseMaterial.test.ts | 83 ++ .../core/tests/material/PBRMaterial.test.ts | 45 + .../material/PBRSpecularMaterial.test.ts | 46 ++ .../core/tests/material/UnlitMaterial.test.ts | 43 + packages/core/tests/script.test.ts | 2 +- .../{ => texture}/RenderColorTexture.test.ts | 4 +- .../{ => texture}/RenderDepthTexture.test.ts | 4 +- .../tests/{ => texture}/RenderTarget.test.ts | 4 +- .../tests/{ => texture}/Texture2D.test.ts | 4 +- .../{ => texture}/TextureCubeMap.test.ts | 4 +- packages/design/package.json | 2 +- packages/design/src/IClone.ts | 2 +- packages/draco/package.json | 4 +- packages/draco/tsconfig.json | 2 +- packages/framebuffer-picker/package.json | 4 +- packages/framebuffer-picker/src/color.vs.glsl | 3 +- packages/loader/package.json | 10 +- packages/loader/src/GLTFLoader.ts | 2 +- packages/loader/src/SpriteAtlasLoader.ts | 103 +++ packages/loader/src/gltf/GLTFResource.ts | 6 +- packages/loader/src/gltf/GLTFUtil.ts | 42 +- packages/loader/src/gltf/Schema.ts | 6 +- .../KHR_materials_pbrSpecularGlossiness.ts | 2 +- .../loader/src/gltf/parser/AnimationParser.ts | 176 ++-- .../loader/src/gltf/parser/MaterialParser.ts | 31 +- packages/loader/src/gltf/parser/MeshParser.ts | 191 +++-- .../loader/src/gltf/parser/SceneParser.ts | 52 +- packages/loader/src/index.ts | 1 + packages/loader/src/scene-loader/GLTFModel.ts | 152 +++- .../src/scene-loader/ResourceManager.ts | 11 +- .../loader/src/scene-loader/SceneManager.ts | 2 +- .../resources/AnimationClipResource.ts | 51 ++ .../resources/AnimatorControllerResource.ts | 212 +++++ .../scene-loader/resources/GLTFResource.ts | 80 +- .../resources/PBRMaterialResource.ts | 27 +- .../resources/PBRSpecularMaterialResource.ts | 23 +- .../resources/SpriteAtlasResource.ts | 61 ++ .../scene-loader/resources/SpriteResource.ts | 27 +- .../src/scene-loader/resources/index.ts | 2 + .../src/scene-loader/temp.compatible.ts | 13 +- packages/loader/tests/gltf/parser.test.ts | 13 +- packages/loader/tsconfig.json | 2 +- packages/math/package.json | 4 +- packages/math/src/BoundingBox.ts | 6 +- packages/math/src/Color.ts | 60 ++ packages/math/src/Matrix.ts | 6 +- packages/math/src/Quaternion.ts | 4 +- packages/math/src/SphericalHarmonics3.ts | 209 +++++ packages/math/src/Vector2.ts | 2 +- packages/math/src/Vector3.ts | 18 +- packages/math/src/index.ts | 1 + packages/math/tests/BoundingBox.test.ts | 65 +- packages/math/tests/BoundingFrustum.test.ts | 59 +- packages/math/tests/BoundingSphere.test.ts | 19 +- packages/math/tests/Color.test.ts | 39 +- packages/math/tests/Matrix.test.ts | 27 + packages/math/tests/Matrix3x3.test.ts | 26 +- packages/math/tests/Plane.test.ts | 12 +- packages/math/tests/Quaternion.test.ts | 40 + packages/math/tests/Rect.test.ts | 31 + .../math/tests/SphericalHarmonics3.test.ts | 146 ++++ packages/math/tests/Vector2.test.ts | 11 +- packages/math/tests/Vector3.test.ts | 42 +- packages/math/tests/Vector4.test.ts | 13 +- packages/oasis-engine/package.json | 10 +- packages/oasis-engine/src/index.ts | 4 +- packages/oasis-engine/tests/test.js | 4 +- packages/rhi-webgl/package.json | 8 +- packages/rhi-webgl/src/GLCapability.ts | 12 +- packages/rhi-webgl/src/GLPrimitive.ts | 9 +- packages/rhi-webgl/src/GLRenderStates.ts | 3 +- packages/rhi-webgl/src/GLTextureCubeMap.ts | 2 +- packages/rhi-webgl/src/WebGLRenderer.ts | 8 +- packages/rhi-webgl/tests/WebGLEngine.test.ts | 4 +- packages/stats/package.json | 4 +- packages/stats/src/Monitor.ts | 2 +- packages/stats/tests/Stats-test.js | 6 +- 231 files changed, 6493 insertions(+), 3227 deletions(-) create mode 100644 packages/core/src/2d/atlas/SpriteAtlas.ts create mode 100644 packages/core/src/2d/atlas/types.ts delete mode 100644 packages/core/src/2d/sprite/SpriteMaterial.ts create mode 100644 packages/core/src/HitResult.ts create mode 100644 packages/core/src/PhysicsManager.ts create mode 100644 packages/core/src/UpdateFlagManager.ts delete mode 100644 packages/core/src/animation/Animation.ts create mode 100644 packages/core/src/animation/AnimationClipCurveBinding.ts delete mode 100644 packages/core/src/animation/AnimationConst.ts create mode 100644 packages/core/src/animation/AnimationCurve.ts create mode 100644 packages/core/src/animation/AnimationEvent.ts delete mode 100644 packages/core/src/animation/AnimationLayer.ts create mode 100644 packages/core/src/animation/Animator.ts create mode 100644 packages/core/src/animation/AnimatorController.ts create mode 100644 packages/core/src/animation/AnimatorControllerLayer.ts create mode 100644 packages/core/src/animation/AnimatorState.ts create mode 100644 packages/core/src/animation/AnimatorStateMachine.ts create mode 100644 packages/core/src/animation/AnimatorTransition.ts create mode 100644 packages/core/src/animation/AnimatorUtils.ts create mode 100644 packages/core/src/animation/KeyFrame.ts create mode 100644 packages/core/src/animation/Motion.ts create mode 100644 packages/core/src/animation/enums/AnimationEventType.ts create mode 100644 packages/core/src/animation/enums/AnimationProperty.ts create mode 100644 packages/core/src/animation/enums/AnimatorConditionMode.ts create mode 100644 packages/core/src/animation/enums/AnimatorLayerBlendingMode.ts create mode 100644 packages/core/src/animation/enums/InterpolableValueType.ts create mode 100644 packages/core/src/animation/enums/InterpolationType.ts create mode 100644 packages/core/src/animation/enums/LayerState.ts create mode 100644 packages/core/src/animation/enums/PlayState.ts create mode 100644 packages/core/src/animation/enums/WrapMode.ts create mode 100644 packages/core/src/animation/internal/AnimationCurveOwner.ts create mode 100644 packages/core/src/animation/internal/AnimationEventHandler.ts create mode 100644 packages/core/src/animation/internal/AnimatorLayerData.ts create mode 100644 packages/core/src/animation/internal/AnimatorStateData.ts create mode 100644 packages/core/src/animation/internal/AnimatorStateInfo.ts create mode 100644 packages/core/src/animation/internal/AnimatorStatePlayData.ts create mode 100644 packages/core/src/animation/internal/CrossCurveData.ts delete mode 100644 packages/core/src/animation/types.ts create mode 100644 packages/core/src/enums/BackgroundTextureFillMode.ts create mode 100644 packages/core/src/mesh/BlendShape.ts create mode 100644 packages/core/src/mesh/BlendShapeFrame.ts delete mode 100644 packages/core/src/raycast/RaycastHit.ts delete mode 100644 packages/core/src/raycast/index.ts create mode 100644 packages/core/src/shaderlib/blendShape_input.glsl create mode 100644 packages/core/src/shaderlib/blendShape_vert.glsl create mode 100644 packages/core/src/shaderlib/extra/background-texture.fs.glsl create mode 100644 packages/core/src/shaderlib/extra/background-texture.vs.glsl delete mode 100644 packages/core/src/shaderlib/perturbation_frag.glsl delete mode 100644 packages/core/src/shaderlib/perturbation_share.glsl delete mode 100644 packages/core/src/shaderlib/refraction_frag.glsl delete mode 100644 packages/core/src/shaderlib/refraction_share.glsl create mode 100644 packages/core/src/texture/Texture2DArray.ts create mode 100644 packages/core/tests/Background.test.ts create mode 100644 packages/core/tests/material/BaseMaterial.test.ts create mode 100644 packages/core/tests/material/BlinnPhongMaterial.test.ts create mode 100644 packages/core/tests/material/PBRBaseMaterial.test.ts create mode 100644 packages/core/tests/material/PBRMaterial.test.ts create mode 100644 packages/core/tests/material/PBRSpecularMaterial.test.ts create mode 100644 packages/core/tests/material/UnlitMaterial.test.ts rename packages/core/tests/{ => texture}/RenderColorTexture.test.ts (96%) rename packages/core/tests/{ => texture}/RenderDepthTexture.test.ts (96%) rename packages/core/tests/{ => texture}/RenderTarget.test.ts (97%) rename packages/core/tests/{ => texture}/Texture2D.test.ts (96%) rename packages/core/tests/{ => texture}/TextureCubeMap.test.ts (98%) create mode 100644 packages/loader/src/SpriteAtlasLoader.ts create mode 100644 packages/loader/src/scene-loader/resources/AnimationClipResource.ts create mode 100644 packages/loader/src/scene-loader/resources/AnimatorControllerResource.ts create mode 100644 packages/loader/src/scene-loader/resources/SpriteAtlasResource.ts create mode 100644 packages/math/src/SphericalHarmonics3.ts create mode 100644 packages/math/tests/Rect.test.ts create mode 100644 packages/math/tests/SphericalHarmonics3.test.ts diff --git a/README.md b/README.md index a779ee4f29..c38c5fb4b3 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,9 @@ Oasis is a **web-first** and **mobile-first** high-performance real-time develop const engine = new WebGLEngine("canvas-id"); engine.canvas.resizeByClientSize(); -// Create root entity. -const rootEntity = engine.sceneManager.activeScene.createRootEntity("Root"); +// Get scene and create root entity. +const scene = engine.sceneManager.activeScene; +const rootEntity = scene.createRootEntity("Root"); // Create light. const lightEntity = rootEntity.createChild("Light"); diff --git a/lerna.json b/lerna.json index 9307adbbdb..58457337b2 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "npmClient": "npm", - "version": "0.4.12", + "version": "0.5.0", "bootstrap": { "hoist": true }, diff --git a/packages/controls/package.json b/packages/controls/package.json index 31fecc34b4..1a1118dd76 100644 --- a/packages/controls/package.json +++ b/packages/controls/package.json @@ -1,6 +1,6 @@ { "name": "@oasis-engine/controls", - "version": "0.4.12", + "version": "0.5.0", "license": "MIT", "scripts": { "b:types": "tsc", @@ -15,6 +15,6 @@ "types/**/*" ], "dependencies": { - "oasis-engine": "0.4.12" + "oasis-engine": "0.5.0" } } diff --git a/packages/controls/src/OrbitControl.ts b/packages/controls/src/OrbitControl.ts index 95224876c9..7522b26aba 100644 --- a/packages/controls/src/OrbitControl.ts +++ b/packages/controls/src/OrbitControl.ts @@ -350,7 +350,7 @@ export class OrbitControl extends Script { } /** - * Rotate to the left by a certain randian. + * Rotate to the left by a certain radian. * @param radian - Radian value of rotation */ rotateLeft(radian: number) { @@ -361,7 +361,7 @@ export class OrbitControl extends Script { } /** - * Rotate to the right by a certain randian. + * Rotate to the right by a certain radian. * @param radian - Radian value of rotation */ rotateUp(radian: number) { diff --git a/packages/core/package.json b/packages/core/package.json index 7ba5b3bdfa..bbba6bd691 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@oasis-engine/core", - "version": "0.4.12", + "version": "0.5.0", "license": "MIT", "main": "dist/main.js", "module": "dist/module.js", @@ -14,9 +14,9 @@ "types/**/*" ], "dependencies": { - "@oasis-engine/math": "0.4.12" + "@oasis-engine/math": "0.5.0" }, "devDependencies": { - "@oasis-engine/design": "0.4.12" + "@oasis-engine/design": "0.5.0" } } diff --git a/packages/core/src/2d/atlas/SpriteAtlas.ts b/packages/core/src/2d/atlas/SpriteAtlas.ts new file mode 100644 index 0000000000..6410da4126 --- /dev/null +++ b/packages/core/src/2d/atlas/SpriteAtlas.ts @@ -0,0 +1,75 @@ +import { RefObject } from "../../asset/RefObject"; +import { Engine } from "../../Engine"; +import { Sprite } from "../sprite/Sprite"; + +/** + * Sprite Atlas. + */ +export class SpriteAtlas extends RefObject { + private _sprites: Sprite[] = new Array(); + private _spriteNamesToIndex: Record = {}; + + /** + * All the sprites in the atlas. + */ + get sprites(): Readonly { + return this._sprites; + } + + /** + * Get the last sprite named 'name' from the atlas. + * @param name - The name of the sprite you want to find + * @returns The sprite you want to find + */ + getSprite(name: string): Sprite { + const sprite = this._sprites[this._spriteNamesToIndex[name]]; + if (!sprite) { + console.warn("There is no sprite named " + name + " in the atlas."); + } + return sprite; + } + + /** + * Get all the sprite named 'name' from the atlas. + * @param name - The name of the sprites you want to find + * @param outSprites - This array holds the sprites found + * @returns The sprites you want to find + */ + getSprites(name: string, outSprites: Sprite[]): Sprite[] { + outSprites.length = 0; + let i = this._spriteNamesToIndex[name]; + if (i !== undefined) { + const { _sprites } = this; + for (; i >= 0; i--) { + const sprite = _sprites[i]; + sprite.name === name && outSprites.push(sprite); + } + } else { + console.warn("The name of the sprite you want to find is not exit in SpriteAtlas."); + } + return outSprites; + } + + /** + * Constructor a SpriteAtlas. + * @param engine - Engine to which the SpriteAtlas belongs + */ + constructor(engine: Engine) { + super(engine); + } + + /** + * @internal + */ + _addSprite(sprite: Sprite): void { + this._spriteNamesToIndex[sprite.name] = this._sprites.push(sprite) - 1; + } + + /** + * @override + */ + _onDestroy(): void { + this._sprites = null; + this._spriteNamesToIndex = null; + } +} diff --git a/packages/core/src/2d/atlas/types.ts b/packages/core/src/2d/atlas/types.ts new file mode 100644 index 0000000000..7256efe2e9 --- /dev/null +++ b/packages/core/src/2d/atlas/types.ts @@ -0,0 +1,37 @@ +import { TextureFormat } from "../../texture"; + +/** + * The original data type of the atlas. + */ +export interface AtlasConfig { + /** Version of Atlas. */ + version: number; + /** Texture format. */ + format: TextureFormat; + /** The sub atlas array, each sub atlas contains multiple sprites. */ + atlasItems: { + /** The url of the sub atlas. */ + img: string; + /** Sprites contained in the sub atlas. */ + sprites: AtlasSprite[]; + }[]; +} + +/** + * The original data type of each sprite. + */ +export interface AtlasSprite { + /** Temp solution. */ + id: number; + /** The name the sprite. */ + name: string; + /** Whether to rotate 90 degrees clockwise. */ + atlasRotated: boolean; + /** The range of the sprites on the big picture. */ + atlasRegion: { x: number; y: number; w: number; h: number }; + /** If there is trimming, the size of the blank area on the four sides. */ + atlasRegionOffset: { x: number; y: number; z: number; w: number }; + region: { x: number; y: number; w: number; h: number }; + pivot: { x: number; y: number }; + pixelsPerUnit: number; +} diff --git a/packages/core/src/2d/index.ts b/packages/core/src/2d/index.ts index 4a704157ab..31ba3b30bd 100644 --- a/packages/core/src/2d/index.ts +++ b/packages/core/src/2d/index.ts @@ -1,3 +1,4 @@ export { SpriteMaskInteraction } from "./enums/SpriteMaskInteraction"; export { SpriteMaskLayer } from "./enums/SpriteMaskLayer"; +export { SpriteAtlas } from "./atlas/SpriteAtlas"; export * from "./sprite/index"; diff --git a/packages/core/src/2d/sprite/Sprite.ts b/packages/core/src/2d/sprite/Sprite.ts index 82d94536fb..caf8f87a9d 100644 --- a/packages/core/src/2d/sprite/Sprite.ts +++ b/packages/core/src/2d/sprite/Sprite.ts @@ -1,4 +1,4 @@ -import { BoundingBox, MathUtil, Rect, Vector2 } from "@oasis-engine/math"; +import { BoundingBox, MathUtil, Rect, Vector2, Vector4 } from "@oasis-engine/math"; import { RefObject } from "../../asset/RefObject"; import { Engine } from "../../Engine"; import { Texture2D } from "../../texture/Texture2D"; @@ -7,21 +7,30 @@ import { Texture2D } from "../../texture/Texture2D"; * 2D sprite. */ export class Sprite extends RefObject { - /** @internal */ - _triangles: number[] = []; + private static _rectangleTriangles: number[] = [0, 2, 1, 2, 0, 3]; + + /** The name of sprite. */ + name: string; + /** @internal */ _uv: Vector2[] = [new Vector2(), new Vector2(), new Vector2(), new Vector2()]; /** @internal */ _positions: Vector2[] = [new Vector2(), new Vector2(), new Vector2(), new Vector2()]; /** @internal */ _bounds: BoundingBox = new BoundingBox(); + /** @internal */ + _triangles: number[]; + /** @internal temp solution. */ + _assetID: number; + private _pixelsPerUnit: number; private _texture: Texture2D = null; - private _atlasRegion: Rect = new Rect(0, 0, 1, 1); + private _atlasRotated: boolean = false; private _region: Rect = new Rect(0, 0, 1, 1); private _pivot: Vector2 = new Vector2(0.5, 0.5); - private _pixelsPerUnit: number; - private _dirtyFlag: number = DirtyFlag.all; + private _atlasRegion: Rect = new Rect(0, 0, 1, 1); + private _atlasRegionOffset: Vector4 = new Vector4(0, 0, 0, 0); + private _dirtyFlag: DirtyFlag = DirtyFlag.all; /** * The reference to the used texture. @@ -42,44 +51,69 @@ export class Sprite extends RefObject { * @remarks The returned bounds should be considered deep-read-only. */ get bounds(): Readonly { - if (this._isContainDirtyFlag(DirtyFlag.positions)) { + if (this._isContainDirtyFlag(DirtyFlag.positions) && this._texture) { this._updatePositionsAndBounds(); - this._setDirtyFlagTrue(DirtyFlag.positions); + this._setDirtyFlagFalse(DirtyFlag.positions); } return this._bounds; } /** - * The rectangle region of the original texture on its atlas texture. + * Is it rotated 90 degrees clockwise when packing. + */ + get atlasRotated(): boolean { + return this._atlasRotated; + } + + set atlasRotated(value: boolean) { + if (this._atlasRotated != value) { + this._atlasRotated = value; + this._setDirtyFlagTrue(DirtyFlag.positions | DirtyFlag.uv); + } + } + + /** + * The rectangle region of the original texture on its atlas texture, specified in normalized. */ get atlasRegion(): Rect { return this._atlasRegion; } set atlasRegion(value: Rect) { - const atlasRegion = this._atlasRegion; - atlasRegion.x = MathUtil.clamp(value.x, 0, 1); - atlasRegion.y = MathUtil.clamp(value.y, 0, 1); - atlasRegion.width = MathUtil.clamp(value.width, 0, 1.0 - atlasRegion.x); - atlasRegion.height = MathUtil.clamp(value.height, 0, 1.0 - atlasRegion.y); + const x = MathUtil.clamp(value.x, 0, 1); + const y = MathUtil.clamp(value.y, 0, 1); + this._atlasRegion.setValue(x, y, MathUtil.clamp(value.width, 0, 1 - x), MathUtil.clamp(value.height, 0, 1 - y)); + this._setDirtyFlagTrue(DirtyFlag.positions | DirtyFlag.uv); } /** - * Location of the sprite's center point in the rectangle region on the original texture, specified in normalized. + * The rectangle region offset of the original texture on its atlas texture, specified in normalized. + */ + get atlasRegionOffset(): Vector4 { + return this._atlasRegionOffset; + } + + set atlasRegionOffset(value: Vector4) { + const x = MathUtil.clamp(value.x, 0, 1); + const y = MathUtil.clamp(value.y, 0, 1); + this._atlasRegionOffset.setValue(x, y, MathUtil.clamp(value.z, 0, 1 - x), MathUtil.clamp(value.w, 0, 1 - y)); + this._setDirtyFlagTrue(DirtyFlag.positions | DirtyFlag.uv); + } + + /** + * Location of the sprite's center point in the rectangle region, specified in normalized. */ get pivot(): Vector2 { return this._pivot; } set pivot(value: Vector2) { - const pivot = this._pivot; - pivot.x = MathUtil.clamp(value.x, 0, 1); - pivot.y = MathUtil.clamp(value.y, 0, 1); + this._pivot.setValue(MathUtil.clamp(value.x, 0, 1), MathUtil.clamp(value.y, 0, 1)); this._setDirtyFlagTrue(DirtyFlag.positions); } /** - * The rectangle region of the sprite on the original texture, specified in normalized. + * The rectangle region of the sprite, specified in normalized. */ get region(): Rect { return this._region; @@ -87,10 +121,9 @@ export class Sprite extends RefObject { set region(value: Rect) { const region = this._region; - region.x = MathUtil.clamp(value.x, 0, 1); - region.y = MathUtil.clamp(value.y, 0, 1); - region.width = MathUtil.clamp(value.width, 0, 1.0 - region.x); - region.height = MathUtil.clamp(value.height, 0, 1.0 - region.y); + const x = MathUtil.clamp(value.x, 0, 1); + const y = MathUtil.clamp(value.y, 0, 1); + region.setValue(x, y, MathUtil.clamp(value.width, 0, 1 - x), MathUtil.clamp(value.height, 0, 1 - y)); this._setDirtyFlagTrue(DirtyFlag.positions | DirtyFlag.uv); } @@ -109,36 +142,32 @@ export class Sprite extends RefObject { } /** - * Constructor a sprite. + * Constructor a Sprite. * @param engine - Engine to which the sprite belongs - * @param texture - Texture from which to obtain the sprite - * @param region - Rectangle region of the texture to use for the sprite, specified in normalized + * @param texture - Texture from which to obtain the Sprite + * @param region - Rectangle region of the texture to use for the Sprite, specified in normalized * @param pivot - Sprite's pivot point relative to its graphic rectangle, specified in normalized - * @param pixelsPerUnit - The number of pixels in the sprite that correspond to one unit in world space + * @param pixelsPerUnit - The number of pixels in the Sprite that correspond to one unit in world space + * @param name - The name of Sprite */ constructor( engine: Engine, texture: Texture2D = null, region: Rect = null, pivot: Vector2 = null, - pixelsPerUnit: number = 128 + pixelsPerUnit: number = 128, + name: string = null ) { super(engine); - if (texture) { - this.texture = texture; - } + this.name = name; + this._texture = texture; + this._pixelsPerUnit = pixelsPerUnit; - if (region) { - this.region = region; - this.atlasRegion = region; - } + region && region.cloneTo(this._region); + pivot && pivot.cloneTo(this._pivot); - if (pivot) { - this.pivot = pivot; - } - - this.pixelsPerUnit = pixelsPerUnit; + this._triangles = Sprite._rectangleTriangles; } /** @@ -154,44 +183,66 @@ export class Sprite extends RefObject { * Update positions and bounds. */ private _updatePositionsAndBounds(): void { - const { texture } = this; - let lx = 0; - let ty = 0; - let rx = 0; - let by = 0; - + const { _texture: texture, _bounds: bounds } = this; if (texture) { - const { width, height } = texture; - const { width: rWidth, height: rHeight } = this.region; - const pixelsPerUnitReciprocal = 1.0 / this._pixelsPerUnit; - - // Get the width and height in 3D space. - const unitWidth = rWidth * width * pixelsPerUnitReciprocal; - const unitHeight = rHeight * height * pixelsPerUnitReciprocal; - - // Get the distance between the anchor point and the four sides. - const { x: px, y: py } = this.pivot; - lx = -px * unitWidth; - ty = -py * unitHeight; - rx = (1 - px) * unitWidth; - by = (1 - py) * unitHeight; + const { _atlasRegion: atlasRegion, _pivot: pivot, _atlasRegionOffset: atlasRegionOffset } = this; + const { x: regionX, y: regionY, width: regionW, height: regionH } = this._region; + const pPUReciprocal = 1.0 / this._pixelsPerUnit; + // Coordinates of the four boundaries. + let lx: number, ty: number, rx: number, by: number; + // TextureSize + let textureW: number, textureH: number; + if (this._atlasRotated) { + textureW = texture.height * atlasRegion.height * pPUReciprocal; + textureH = texture.width * atlasRegion.width * pPUReciprocal; + } else { + textureW = texture.width * atlasRegion.width * pPUReciprocal; + textureH = texture.height * atlasRegion.height * pPUReciprocal; + } + // Determine whether it has been trimmed. + if ( + atlasRegionOffset.x == 0 && + atlasRegionOffset.y == 0 && + atlasRegionOffset.z == 0 && + atlasRegionOffset.w == 0 + ) { + // Real rendering size. + const realRenderW = textureW * regionW; + const realRenderH = textureH * regionH; + lx = -pivot.x * realRenderW; + by = -pivot.y * realRenderH; + rx = realRenderW + lx; + ty = realRenderH + by; + } else { + const { x: blankLeft, y: blankTop, z: blankRight, w: blankBottom } = atlasRegionOffset; + const oriWidth = textureW / (1 - blankRight - blankLeft); + const oriHeight = textureH / (1 - blankBottom - blankTop); + // The size of the real rendering. + lx = (-pivot.x * regionW + Math.max(blankLeft, regionX) - regionX) * oriWidth; + ty = (pivot.y * regionH - Math.max(blankTop, regionY) + regionY) * oriHeight; + rx = (-pivot.x * regionW + Math.min(1 - blankRight, regionX + regionW) - regionX) * oriWidth; + by = (pivot.y * regionH - Math.min(1 - blankBottom, regionY + regionH) + regionY) * oriHeight; + } + + // Assign values ​​to _positions + const positions = this._positions; + // Top-left. + positions[0].setValue(lx, ty); + // Top-right. + positions[1].setValue(rx, ty); + // Bottom-right. + positions[2].setValue(rx, by); + // Bottom-left. + positions[3].setValue(lx, by); + + // Update bounds. + bounds.min.setValue(lx, by, 0); + bounds.max.setValue(rx, ty, 0); + } else { + // Update bounds. + bounds.min.setValue(0, 0, 0); + bounds.max.setValue(0, 0, 0); } - - // Assign values ​​to _positions - const positions = this._positions; - // Top-left. - positions[0].setValue(lx, by); - // Top-right. - positions[1].setValue(rx, by); - // Bottom-right. - positions[2].setValue(rx, ty); - // Bottom-left. - positions[3].setValue(lx, ty); - - // Update bounds. - const { min, max } = this._bounds; - min.setValue(lx, ty, 0); - max.setValue(rx, by, 0); } /** @@ -203,29 +254,69 @@ export class Sprite extends RefObject { } if (this._isContainDirtyFlag(DirtyFlag.uv)) { - const uv = this._uv; - const { x, y, width, height } = this.region; - const rightX = x + width; - const bottomY = y + height; - - // Top-left. - uv[0].setValue(x, y); - // Top-right. - uv[1].setValue(rightX, y); - // Bottom-right. - uv[2].setValue(rightX, bottomY); - // Bottom-left. - uv[3].setValue(x, bottomY); - } - - if (this._isContainDirtyFlag(DirtyFlag.triangles)) { - const triangles = this._triangles; - triangles[0] = 0; - triangles[1] = 2; - triangles[2] = 1; - triangles[3] = 2; - triangles[4] = 0; - triangles[5] = 3; + const { _atlasRegion, _uv: uv, _region: region, _atlasRotated, _atlasRegionOffset: atlasRegionOffset } = this; + let left: number, top: number, right: number, bottom: number; + // Determine whether it has been trimmed. + if ( + atlasRegionOffset.x == 0 && + atlasRegionOffset.y == 0 && + atlasRegionOffset.z == 0 && + atlasRegionOffset.w == 0 + ) { + const { width: atlasRegionW, height: atlasRegionH } = _atlasRegion; + if (_atlasRotated) { + left = atlasRegionW * (1 - region.y - region.height) + _atlasRegion.x; + top = atlasRegionH * region.x + _atlasRegion.y; + right = atlasRegionW * region.height + left; + bottom = atlasRegionH * region.width + top; + } else { + left = atlasRegionW * region.x + _atlasRegion.x; + top = atlasRegionH * region.y + _atlasRegion.y; + right = atlasRegionW * region.width + left; + bottom = atlasRegionH * region.height + top; + } + } else { + const { x: regionX, y: regionY } = region; + const { x: atlasRegionX, y: atlasRegionY } = _atlasRegion; + const { x: blankLeft, y: blankTop, z: blankRight, w: blankBottom } = atlasRegionOffset; + // Proportion of the original sprite size in the atlas. + if (_atlasRotated) { + const textureW = _atlasRegion.width / (1 - blankBottom - blankTop); + const textureH = _atlasRegion.height / (1 - blankRight - blankLeft); + left = (Math.max(blankBottom, 1 - regionY - region.height) - blankBottom) * textureW + atlasRegionX; + top = (Math.max(blankLeft, regionX) - blankLeft) * textureH + atlasRegionY; + right = (Math.min(1 - blankTop, 1 - regionY) - blankBottom) * textureW + atlasRegionX; + bottom = (Math.min(1 - blankRight, regionX + region.width) - blankLeft) * textureH + atlasRegionY; + } else { + const textureW = _atlasRegion.width / (1 - blankRight - blankLeft); + const textureH = _atlasRegion.height / (1 - blankBottom - blankTop); + left = (Math.max(blankLeft, regionX) - blankLeft) * textureW + atlasRegionX; + top = (Math.max(blankTop, regionY) - blankTop) * textureH + atlasRegionY; + right = (Math.min(1 - blankRight, regionX + region.width) - blankLeft) * textureW + atlasRegionX; + bottom = (Math.min(1 - blankBottom, regionY + region.height) - blankTop) * textureH + atlasRegionY; + } + } + + if (_atlasRotated) { + // If it is rotated, we need to rotate the UV 90 degrees counterclockwise to correct it. + // Top-right. + uv[0].setValue(right, top); + // Bottom-right. + uv[1].setValue(right, bottom); + // Bottom-left. + uv[2].setValue(left, bottom); + // Top-left. + uv[3].setValue(left, top); + } else { + // Top-left. + uv[0].setValue(left, top); + // Top-right. + uv[1].setValue(right, top); + // Bottom-right. + uv[2].setValue(right, bottom); + // Bottom-left. + uv[3].setValue(left, bottom); + } } } @@ -259,6 +350,5 @@ export class Sprite extends RefObject { enum DirtyFlag { positions = 0x1, uv = 0x2, - triangles = 0x4, - all = 0x7 + all = 0x3 } diff --git a/packages/core/src/2d/sprite/SpriteMask.ts b/packages/core/src/2d/sprite/SpriteMask.ts index 851a4896e6..c7646265e0 100644 --- a/packages/core/src/2d/sprite/SpriteMask.ts +++ b/packages/core/src/2d/sprite/SpriteMask.ts @@ -17,7 +17,7 @@ export class SpriteMask extends Renderer { /** @internal */ static _textureProperty: ShaderProperty = Shader.getPropertyByName("u_maskTexture"); /** @internal */ - static _alphaCutoffProperty: ShaderProperty = Shader.getPropertyByName("u_alphaCutoff"); + static _alphaCutoffProperty: ShaderProperty = Shader.getPropertyByName("u_maskAlphaCutoff"); private static _tempVec3: Vector3 = new Vector3(); diff --git a/packages/core/src/2d/sprite/SpriteMaterial.ts b/packages/core/src/2d/sprite/SpriteMaterial.ts deleted file mode 100644 index 177aaca499..0000000000 --- a/packages/core/src/2d/sprite/SpriteMaterial.ts +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; - -import { Shader } from "../../shader"; - -const spriteVertShader = ` -precision highp float; - -uniform mat4 u_VPMat; - -attribute vec3 POSITION; -attribute vec2 TEXCOORD_0; -attribute vec4 COLOR_0; - -varying vec2 v_uv; -varying vec4 v_color; - -void main() -{ - gl_Position = u_VPMat * vec4(POSITION, 1.0); - v_uv = TEXCOORD_0; - v_color = COLOR_0; -} -`; - -const spriteFragmentShader = ` -precision mediump float; -precision mediump int; - -uniform sampler2D u_spriteTexture; -varying vec2 v_uv; -varying vec4 v_color; - -void main() -{ - // Only use the Alpha of the texture as a mask, so that the tint color can still be controlled to fade out. - vec4 baseColor = texture2D(u_spriteTexture, v_uv); - gl_FragColor = baseColor * v_color; -} -`; - -Shader.create("Sprite", spriteVertShader, spriteFragmentShader); diff --git a/packages/core/src/2d/sprite/SpriteRenderer.ts b/packages/core/src/2d/sprite/SpriteRenderer.ts index 52c691b01c..045c1672f1 100644 --- a/packages/core/src/2d/sprite/SpriteRenderer.ts +++ b/packages/core/src/2d/sprite/SpriteRenderer.ts @@ -18,6 +18,13 @@ export class SpriteRenderer extends Renderer { private static _textureProperty: ShaderProperty = Shader.getPropertyByName("u_spriteTexture"); private static _tempVec3: Vector3 = new Vector3(); + /** @internal temp solution. */ + @ignoreClone + _customLocalBounds: BoundingBox = null; + /** @internal temp solution. */ + @ignoreClone + _customRootEntity: Entity = null; + @deepClone private _positions: Vector3[] = [new Vector3(), new Vector3(), new Vector3(), new Vector3()]; @assignmentClone @@ -231,9 +238,14 @@ export class SpriteRenderer extends Renderer { protected _updateBounds(worldBounds: BoundingBox): void { const sprite = this._sprite; if (sprite) { - const localBounds = sprite.bounds; - const worldMatrix = this._entity.transform.worldMatrix; - BoundingBox.transform(localBounds, worldMatrix, worldBounds); + if (this._customLocalBounds && this._customRootEntity) { + const worldMatrix = this._customRootEntity.transform.worldMatrix; + BoundingBox.transform(this._customLocalBounds, worldMatrix, worldBounds); + } else { + const localBounds = sprite.bounds; + const worldMatrix = this._entity.transform.worldMatrix; + BoundingBox.transform(localBounds, worldMatrix, worldBounds); + } } else { worldBounds.min.setValue(0, 0, 0); worldBounds.max.setValue(0, 0, 0); diff --git a/packages/core/src/Background.ts b/packages/core/src/Background.ts index 943eab7acf..3927fac0be 100644 --- a/packages/core/src/Background.ts +++ b/packages/core/src/Background.ts @@ -1,6 +1,9 @@ import { Color } from "@oasis-engine/math"; +import { Engine } from "./Engine"; import { BackgroundMode } from "./enums/BackgroundMode"; +import { BackgroundTextureFillMode } from "./enums/BackgroundTextureFillMode"; import { Sky } from "./sky/Sky"; +import { Texture2D } from "./texture"; /** * Background of scene. @@ -25,4 +28,85 @@ export class Background { * @remarks When `mode` is `BackgroundMode.Sky`, the property will take effects. */ readonly sky: Sky = new Sky(); + + /** @internal */ + _textureFillMode: BackgroundTextureFillMode = BackgroundTextureFillMode.AspectFitHeight; + + private _texture: Texture2D = null; + + /** + * Background texture. + * @remarks When `mode` is `BackgroundMode.Texture`, the property will take effects. + */ + get texture(): Texture2D { + return this._texture; + } + + set texture(value: Texture2D) { + if (this._texture !== value) { + this._texture = value; + this._engine._backgroundTextureMaterial.shaderData.setTexture("u_baseTexture", value); + } + } + + /** + * @internal + * Background texture fill mode. + * @remarks When `mode` is `BackgroundMode.Texture`, the property will take effects. + * @defaultValue `BackgroundTextureFillMode.FitHeight` + */ + get textureFillMode(): BackgroundTextureFillMode { + return this._textureFillMode; + } + + set textureFillMode(value: BackgroundTextureFillMode) { + if (value !== this._textureFillMode) { + this._textureFillMode = value; + this._resizeBackgroundTexture(); + } + } + + /** + * Constructor of Background. + * @param _engine Engine Which the background belongs to. + */ + constructor(private _engine: Engine) {} + + /** + * @internal + */ + _resizeBackgroundTexture(): void { + if (!this._texture) { + return; + } + const { canvas } = this._engine; + const { width, height } = canvas; + const { _backgroundTextureMesh } = this._engine; + const positions = _backgroundTextureMesh.getPositions(); + + switch (this._textureFillMode) { + case BackgroundTextureFillMode.Fill: + positions[0].setValue(-1, -1, 1); + positions[1].setValue(1, -1, 1); + positions[2].setValue(-1, 1, 1); + positions[3].setValue(1, 1, 1); + break; + case BackgroundTextureFillMode.AspectFitWidth: + const fitWidthScale = (this._texture.height * width) / this.texture.width / height; + positions[0].setValue(-1, -fitWidthScale, 1); + positions[1].setValue(1, -fitWidthScale, 1); + positions[2].setValue(-1, fitWidthScale, 1); + positions[3].setValue(1, fitWidthScale, 1); + break; + case BackgroundTextureFillMode.AspectFitHeight: + const fitHeightScale = (this._texture.width * height) / this.texture.height / width; + positions[0].setValue(-fitHeightScale, -1, 1); + positions[1].setValue(fitHeightScale, -1, 1); + positions[2].setValue(-fitHeightScale, 1, 1); + positions[3].setValue(fitHeightScale, 1, 1); + break; + } + _backgroundTextureMesh.setPositions(positions); + _backgroundTextureMesh.uploadData(false); + } } diff --git a/packages/core/src/Camera.ts b/packages/core/src/Camera.ts index c3cef28680..5c159f16df 100644 --- a/packages/core/src/Camera.ts +++ b/packages/core/src/Camera.ts @@ -38,7 +38,7 @@ export class Camera extends Component { /** Shader data. */ readonly shaderData: ShaderData = new ShaderData(ShaderDataGroup.Camera); - /** Rendering priority - A Camera with higher priority will be rendererd on top of a camera with lower priority. */ + /** Rendering priority - A Camera with higher priority will be rendered on top of a camera with lower priority. */ priority: number = 0; /** Whether to enable frustum culling, it is enabled by default. */ @@ -52,7 +52,7 @@ export class Camera extends Component { /** * Culling mask - which layers the camera renders. - * @remarks Support bit manipulation, conresponding to Entity's layer. + * @remarks Support bit manipulation, corresponding to Entity's layer. */ cullingMask: Layer = Layer.Everything; @@ -99,7 +99,7 @@ export class Camera extends Component { private _invViewProjMat: Matrix = new Matrix(); /** - * Near clip plane - the cloest point to the camera when rendering occurs. + * Near clip plane - the closest point to the camera when rendering occurs. */ get nearClipPlane(): number { return this._nearClipPlane; @@ -123,7 +123,7 @@ export class Camera extends Component { } /** - * The camera's view angle. activing when camera use perspective projection. + * The camera's view angle. activating when camera use perspective projection. */ get fieldOfView(): number { return this._fieldOfView; @@ -135,7 +135,8 @@ export class Camera extends Component { } /** - * Aspect ratio. The default is automatically calculated by the viewport's aspect ratio. If it is manually set, the manual value will be kept. Call resetAspectRatio() to restore it. + * Aspect ratio. The default is automatically calculated by the viewport's aspect ratio. If it is manually set, + * the manual value will be kept. Call resetAspectRatio() to restore it. */ get aspectRatio(): number { const canvas = this._entity.engine.canvas; @@ -199,7 +200,8 @@ export class Camera extends Component { } /** - * The projection matrix is ​​calculated by the relevant parameters of the camera by default. If it is manually set, the manual value will be maintained. Call resetProjectionMatrix() to restore it. + * The projection matrix is ​​calculated by the relevant parameters of the camera by default. + * If it is manually set, the manual value will be maintained. Call resetProjectionMatrix() to restore it. */ set projectionMatrix(value: Matrix) { this._projectionMatrix = value; @@ -241,12 +243,12 @@ export class Camera extends Component { * @todo When render pipeline modification */ get enableHDR(): boolean { - console.log("not implemention"); + console.log("not implementation"); return false; } set enableHDR(value: boolean) { - console.log("not implemention"); + console.log("not implementation"); } /** @@ -318,7 +320,7 @@ export class Camera extends Component { /** * Transform a point from viewport space to world space. - * @param point - Point in viewport sapce, X and Y are the viewport space coordinates, Z is the viewport depth. The near clipping plane is 0, and the far clipping plane is 1 + * @param point - Point in viewport space, X and Y are the viewport space coordinates, Z is the viewport depth. The near clipping plane is 0, and the far clipping plane is 1 * @param out - Point in world space * @returns Point in world space */ @@ -414,7 +416,7 @@ export class Camera extends Component { * @param cubeFace - Cube rendering surface collection */ render(cubeFace?: TextureCubeFace): void { - // compute cull frustm. + // compute cull frustum. const context = this.engine._renderContext; context._setContext(this); if (this.enableFrustumCulling && (this._frustumViewChangeFlag.flag || this._isFrustumProjectDirty)) { diff --git a/packages/core/src/Component.ts b/packages/core/src/Component.ts index 3e43f1a889..e56ba632fc 100644 --- a/packages/core/src/Component.ts +++ b/packages/core/src/Component.ts @@ -18,7 +18,7 @@ export abstract class Component extends EngineObject { @assignmentClone private _enabled: boolean = true; @ignoreClone - private _awaked: boolean = false; + private _awoken: boolean = false; /** * Indicates whether the component is enabled. @@ -47,7 +47,7 @@ export abstract class Component extends EngineObject { } /** - * The entitiy which the component belongs to. + * The entity which the component belongs to. */ get entity(): Entity { return this._entity; @@ -66,7 +66,7 @@ export abstract class Component extends EngineObject { } /** - * Destory this instance. + * Destroy this instance. */ destroy(): void { if (this._destroyed) { @@ -116,8 +116,8 @@ export abstract class Component extends EngineObject { */ _setActive(value: boolean): void { if (value) { - if (!this._awaked) { - this._awaked = true; + if (!this._awoken) { + this._awoken = true; this._onAwake(); } // You can do isActive = false in onAwake function. diff --git a/packages/core/src/ComponentsDependencies.ts b/packages/core/src/ComponentsDependencies.ts index 5d0e216c0b..51ef0c0b35 100644 --- a/packages/core/src/ComponentsDependencies.ts +++ b/packages/core/src/ComponentsDependencies.ts @@ -42,11 +42,11 @@ export class ComponentsDependencies { * @internal */ static _removeCheck(entity: Entity, type: ComponentConstructor) { - const invDenpendencies = ComponentsDependencies._invDependenciesMap.get(type); - if (invDenpendencies) { - for (let i = 0, len = invDenpendencies.length; i < len; i++) { - if (entity.getComponent(invDenpendencies[i])) { - throw `you should remove ${invDenpendencies[i]} before adding ${type}`; + const invDependencies = ComponentsDependencies._invDependenciesMap.get(type); + if (invDependencies) { + for (let i = 0, len = invDependencies.length; i < len; i++) { + if (entity.getComponent(invDependencies[i])) { + throw `you should remove ${invDependencies[i]} before adding ${type}`; } } } diff --git a/packages/core/src/ComponentsManager.ts b/packages/core/src/ComponentsManager.ts index d8829ccecd..d62fe77a41 100644 --- a/packages/core/src/ComponentsManager.ts +++ b/packages/core/src/ComponentsManager.ts @@ -18,7 +18,7 @@ export class ComponentsManager { private _onStartScripts: DisorderedArray