Skip to content

Commit 2ce9e4e

Browse files
committed
Merge branch 'v4.0.0' into v4.0.0-probebug
# Conflicts: # editor/assets/default_renderpipeline/builtin-pipeline.ts
2 parents 3ac31a0 + 926bd5b commit 2ce9e4e

744 files changed

Lines changed: 4411 additions & 58063 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/eslint.ps1

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,14 @@ if ($env:GITHUB_BASE_REF) {
2020
# Push
2121
$gitHubEvent = Get-Content $env:GITHUB_EVENT_PATH | ConvertFrom-Json
2222
Write-Host "GitHub event: $gitHubEvent"
23-
git fetch origin $gitHubEvent.before --depth=1
24-
$diffFiles = git diff --name-only --diff-filter=$diffFilter $gitHubEvent.before $env:GITHUB_SHA
23+
$beforeSha = $gitHubEvent.before
24+
# On tag creation or initial push, before is all zeros - skip diff in that case
25+
if ($beforeSha -match '^0+$') {
26+
Write-Host "No previous commit (tag creation or initial push). Skipping diff."
27+
return
28+
}
29+
git fetch origin $beforeSha --depth=1
30+
$diffFiles = git diff --name-only --diff-filter=$diffFilter $beforeSha $env:GITHUB_SHA
2531
}
2632

2733
Write-Host "Diff files: $diffFiles"

.github/workflows/native-clang-format.yml

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,21 @@ jobs:
1818
with:
1919
token: ${{ github.token }}
2020
ref: ${{ github.head_sha }}
21+
fetch-depth: 0
2122

2223
- id: get_change_files
2324
uses: fish9167/file-changes-action@v1.2.3
2425
with:
2526
output: ' '
2627
fileOutput: ' '
2728

28-
- name: Echo change files
29-
run: |
30-
cat $HOME/files.txt
31-
mv $HOME/files.txt ${{github.workspace}}/files.txt
32-
33-
- uses: fish9167/clang-format-lint-action@master
29+
- uses: DoozyX/clang-format-lint-action@v0.18
3430
with:
3531
source: ./native
36-
exclude: ./native/cocos/bindings/auto
32+
exclude: ./native/cocos/bindings/auto ./native/cocos/base/std ./native/cocos/editor-support/spine-wasm ./native/cocos/editor-support/spine ./native/cocos/gi/light-probe/predicates.cpp ./native/cocos/gi/light-probe/tetgen.cpp ./native/cocos/gi/light-probe/tetgen.h ./native/cocos/platform/openharmony/napi ./native/tools ./native/vendor ./native/cocos/cocos-version.h
3733
extensions: 'c,h,hpp,cpp,cxx'
3834
style: file
39-
inplace: True
35+
inplace: true
4036
clangFormatVersion: 12
4137

4238
- name: Create Pull Request

.github/workflows/native-compile-platforms.yml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,8 @@ jobs:
483483
echo "set(CC_USE_GLES3 OFF)" >> build-mac/proj/cfg.cmake
484484
echo "set(CC_USE_METAL ON)" >> build-mac/proj/cfg.cmake
485485
# Test JSVM v8 backend on macOS.
486-
echo "set(USE_SE_V8 OFF)" >> build-mac/proj/cfg.cmake
487-
echo "set(USE_SE_JSVM ON)" >> build-mac/proj/cfg.cmake
486+
echo "set(USE_SE_V8 ON)" >> build-mac/proj/cfg.cmake
487+
echo "set(USE_SE_JSVM OFF)" >> build-mac/proj/cfg.cmake
488488
echo "set(USE_WEBSOCKET_SERVER OFF)" >> build-mac/proj/cfg.cmake
489489
echo "set(CMAKE_CXX_STANDARD_REQUIRED ON)" >> build-mac/proj/cfg.cmake
490490
echo "set(CC_EXECUTABLE_NAME \"\")" >> build-mac/proj/cfg.cmake
@@ -493,7 +493,6 @@ jobs:
493493
RES_DIR=$GITHUB_WORKSPACE/templates/mac/build-mac
494494
cd build-mac
495495
cmake ../ -GXcode -DCMAKE_OSX_ARCHITECTURES=${{ matrix.config.arch }} -DRES_DIR=$RES_DIR -DCOCOS_X_PATH=$NATIVE_ROOT
496-
set +e
497496
cmake --build . --config Release -- -jobs $NUM_OF_CORES -arch ${{ matrix.config.arch }}
498497
echo "Compile MacOSX Release Done!"
499498
@@ -534,7 +533,7 @@ jobs:
534533
echo "set(CC_USE_VULKAN OFF)" >> build-ios/proj/cfg.cmake
535534
echo "set(CC_USE_GLES2 OFF)" >> build-ios/proj/cfg.cmake
536535
echo "set(CC_USE_METAL ON)" >> build-ios/proj/cfg.cmake
537-
echo "set(TARGET_IOS_VERSION 12.0)" >> build-ios/proj/cfg.cmake
536+
echo "set(TARGET_IOS_VERSION 13.0)" >> build-ios/proj/cfg.cmake
538537
echo "set(USE_WEBSOCKET_SERVER OFF)" >> build-ios/proj/cfg.cmake
539538
echo "set(USE_DRAGONBONES OFF)" >> build-ios/proj/cfg.cmake
540539
echo "set(CMAKE_CXX_STANDARD_REQUIRED OFF)" >> build-ios/proj/cfg.cmake
@@ -548,7 +547,6 @@ jobs:
548547
-DCMAKE_OSX_ARCHITECTURES=${{ matrix.config.arch }} \
549548
-DRES_DIR=$RES_DIR \
550549
-DCOCOS_X_PATH=$NATIVE_ROOT
551-
set +e
552550
#cmake --build . --config Debug -- -quiet -jobs $NUM_OF_CORES -allowProvisioningUpdates CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
553551
cmake --build . --config Debug -- -jobs $NUM_OF_CORES CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
554552
echo "Compile iOS Done!"

.github/workflows/native-ts-build.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ jobs:
2828
with:
2929
node-version: ${{ matrix.node-version }}
3030
- run: npm ci --ignore-scripts
31+
- run: node scripts/spread-pal.cjs
3132
- run: npm run build:debug-infos
3233
- name: Download external
3334
run: |

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,11 @@ platforms/runtime/platforms/vivo-mini-game/ral.min.js
4646
@types/consts.d.ts
4747

4848
__TS_ENGINE__/
49+
50+
# pal 由 @cocos/engine-pal 在 postinstall 挂载(软链/复制),不入库
51+
/pal
52+
53+
# platforms 源码已抽到 @cocos/engine-platforms;其预打包 adapter 由 postinstall 的
54+
# spread-adapter.cjs 复制到 bin/adapter(/bin 已忽略)。platforms 源码不再入库。
55+
/platforms
56+

EngineErrorMap.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3980,3 +3980,7 @@ Debug bones or slots is invalid in cached mode.
39803980
### 16419
39813981

39823982
Spine version not supported.
3983+
3984+
### 16420
3985+
3986+
Start time must bigger than end time.

cc.config.json

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -382,70 +382,70 @@
382382
"test": "context.buildTimeConstants && context.buildTimeConstants.HTML5",
383383
"isVirtualModule": true,
384384
"overrides": {
385-
"pal/minigame": "pal/minigame/non-minigame.ts",
386-
"pal/audio": "pal/audio/web/player.ts",
387-
"pal/system-info": "pal/system-info/web/system-info.ts",
388-
"pal/screen-adapter": "pal/screen-adapter/web/screen-adapter.ts",
389-
"pal/input": "pal/input/web/index.ts",
390-
"pal/env": "pal/env/web/env.ts",
391-
"pal/pacer": "pal/pacer/pacer-web.ts",
392-
"pal/wasm": "pal/wasm/wasm-web.ts"
385+
"pal/minigame": "pal/minigame/non-minigame.js",
386+
"pal/audio": "pal/audio/web/player.js",
387+
"pal/system-info": "pal/system-info/web/system-info.js",
388+
"pal/screen-adapter": "pal/screen-adapter/web/screen-adapter.js",
389+
"pal/input": "pal/input/web/index.js",
390+
"pal/env": "pal/env/web/env.js",
391+
"pal/pacer": "pal/pacer/pacer-web.js",
392+
"pal/wasm": "pal/wasm/wasm-web.js"
393393
}
394394
},
395395
{
396396
"test": "context.buildTimeConstants && context.buildTimeConstants.NATIVE",
397397
"isVirtualModule": true,
398398
"overrides": {
399-
"pal/minigame": "pal/minigame/non-minigame.ts",
400-
"pal/audio": "pal/audio/native/player.ts",
401-
"pal/system-info": "pal/system-info/native/system-info.ts",
402-
"pal/screen-adapter": "pal/screen-adapter/native/screen-adapter.ts",
403-
"pal/input": "pal/input/native/index.ts",
404-
"pal/env": "pal/env/native/env.ts",
405-
"pal/pacer": "pal/pacer/pacer-native.ts",
406-
"pal/wasm": "pal/wasm/wasm-native.ts"
399+
"pal/minigame": "pal/minigame/non-minigame.js",
400+
"pal/audio": "pal/audio/native/player.js",
401+
"pal/system-info": "pal/system-info/native/system-info.js",
402+
"pal/screen-adapter": "pal/screen-adapter/native/screen-adapter.js",
403+
"pal/input": "pal/input/native/index.js",
404+
"pal/env": "pal/env/native/env.js",
405+
"pal/pacer": "pal/pacer/pacer-native.js",
406+
"pal/wasm": "pal/wasm/wasm-native.js"
407407
}
408408
},
409409
{
410410
"test": "context.buildTimeConstants && context.buildTimeConstants.MINIGAME",
411411
"isVirtualModule": true,
412412
"overrides": {
413-
"pal/minigame": "pal/minigame/{{context.platform.toLowerCase()}}.ts",
414-
"pal/audio": "pal/audio/minigame/player.ts",
415-
"pal/system-info": "pal/system-info/minigame/system-info.ts",
416-
"pal/screen-adapter": "pal/screen-adapter/minigame/screen-adapter.ts",
417-
"pal/input": "pal/input/minigame/index.ts",
418-
"pal/env": "pal/env/minigame/env.ts",
419-
"pal/pacer": "pal/pacer/pacer-minigame.ts",
420-
"pal/wasm": "pal/wasm/wasm-minigame.ts"
413+
"pal/minigame": "pal/minigame/{{context.platform.toLowerCase()}}.js",
414+
"pal/audio": "pal/audio/minigame/player.js",
415+
"pal/system-info": "pal/system-info/minigame/system-info.js",
416+
"pal/screen-adapter": "pal/screen-adapter/minigame/screen-adapter.js",
417+
"pal/input": "pal/input/minigame/index.js",
418+
"pal/env": "pal/env/minigame/env.js",
419+
"pal/pacer": "pal/pacer/pacer-minigame.js",
420+
"pal/wasm": "pal/wasm/wasm-minigame.js"
421421
}
422422
},
423423
{
424424
"test": "context.buildTimeConstants && context.buildTimeConstants.RUNTIME_BASED",
425425
"isVirtualModule": true,
426426
"overrides": {
427-
"pal/minigame": "pal/minigame/runtime.ts",
428-
"pal/audio": "pal/audio/minigame/player.ts",
429-
"pal/system-info": "pal/system-info/minigame/system-info.ts",
430-
"pal/screen-adapter": "pal/screen-adapter/minigame/screen-adapter.ts",
431-
"pal/input": "pal/input/minigame/index.ts",
432-
"pal/env": "pal/env/runtime/env.ts",
433-
"pal/pacer": "pal/pacer/pacer-minigame.ts",
434-
"pal/wasm": "pal/wasm/wasm-minigame.ts"
427+
"pal/minigame": "pal/minigame/runtime.js",
428+
"pal/audio": "pal/audio/minigame/player.js",
429+
"pal/system-info": "pal/system-info/minigame/system-info.js",
430+
"pal/screen-adapter": "pal/screen-adapter/minigame/screen-adapter.js",
431+
"pal/input": "pal/input/minigame/index.js",
432+
"pal/env": "pal/env/runtime/env.js",
433+
"pal/pacer": "pal/pacer/pacer-minigame.js",
434+
"pal/wasm": "pal/wasm/wasm-minigame.js"
435435
}
436436
},
437437
{
438438
"test": "context.buildTimeConstants && context.buildTimeConstants.NODEJS",
439439
"isVirtualModule": true,
440440
"overrides": {
441-
"pal/minigame": "pal/minigame/non-minigame.ts",
442-
"pal/audio": "pal/audio/nodejs/player.ts",
443-
"pal/system-info": "pal/system-info/nodejs/system-info.ts",
444-
"pal/screen-adapter": "pal/screen-adapter/nodejs/screen-adapter.ts",
445-
"pal/input": "pal/input/nodejs/index.ts",
446-
"pal/env": "pal/env/nodejs/env.ts",
447-
"pal/pacer": "pal/pacer/pacer-nodejs.ts",
448-
"pal/wasm": "pal/wasm/wasm-nodejs.ts"
441+
"pal/minigame": "pal/minigame/non-minigame.js",
442+
"pal/audio": "pal/audio/nodejs/player.js",
443+
"pal/system-info": "pal/system-info/nodejs/system-info.js",
444+
"pal/screen-adapter": "pal/screen-adapter/nodejs/screen-adapter.js",
445+
"pal/input": "pal/input/nodejs/index.js",
446+
"pal/env": "pal/env/nodejs/env.js",
447+
"pal/pacer": "pal/pacer/pacer-nodejs.js",
448+
"pal/wasm": "pal/wasm/wasm-nodejs.js"
449449
}
450450
},
451451
{
@@ -470,15 +470,23 @@
470470
}
471471
},
472472
{
473-
"test": "context.buildTimeConstants.SPINE_3_8",
473+
"test": "context.buildTimeConstants.SPINE_3_8 && context.buildTimeConstants.SPINE_4_2",
474+
"isVirtualModule": false,
475+
"overrides": {
476+
"cocos/spine/lib/spine-version.ts": "cocos/spine/lib/spine-version-dynamic.ts",
477+
"cocos/spine/lib/spine-instantiate.ts": "cocos/spine/lib/spine-instantiate-dynamic.ts"
478+
}
479+
},
480+
{
481+
"test": "context.buildTimeConstants.SPINE_3_8 && !context.buildTimeConstants.SPINE_4_2",
474482
"isVirtualModule": false,
475483
"overrides": {
476484
"cocos/spine/lib/spine-version.ts": "cocos/spine/lib/spine-version-3.8.ts",
477485
"cocos/spine/lib/spine-instantiate.ts": "cocos/spine/lib/spine-instantiate-3.8.ts"
478486
}
479487
},
480488
{
481-
"test": "context.buildTimeConstants.SPINE_4_2",
489+
"test": "context.buildTimeConstants.SPINE_4_2 && !context.buildTimeConstants.SPINE_3_8",
482490
"isVirtualModule": false,
483491
"overrides": {
484492
"cocos/spine/lib/spine-version.ts": "cocos/spine/lib/spine-version-4.2.ts",
@@ -877,10 +885,10 @@
877885
"cocos/asset/asset-manager/weak-cache.ts",
878886
"cocos/2d/framework/ui-skew-utils.ts",
879887
"cocos/spine/lib/spine-binary.ts",
880-
"pal/input/minigame/gamepad-input.ts",
881-
"pal/input/minigame/handheld-input.ts",
882-
"pal/input/minigame/handle-input.ts",
883-
"pal/input/minigame/hmd-input.ts"
888+
"pal/input/minigame/gamepad-input.js",
889+
"pal/input/minigame/handheld-input.js",
890+
"pal/input/minigame/handle-input.js",
891+
"pal/input/minigame/hmd-input.js"
884892
]
885893
}
886894
}

cocos/2d/components/graphics.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,15 @@ export class Graphics extends UIRenderer {
266266
this._updateMtlForGraphics();
267267
}
268268

269+
protected override get _keepRenderData (): boolean {
270+
// Graphics is a retained-mode renderer: its MeshRenderData is the result of the
271+
// user's previous fill()/stroke() calls. Destroying it here would leave Impl's
272+
// render-data list pointing at cleared geometry, so re-enabling the node on native
273+
// platforms would require the user to draw the paths again. Keep it attached to the
274+
// disabled RenderEntity; clear() and onDestroy() remain the owning release points.
275+
return true;
276+
}
277+
269278
public onDestroy (): void {
270279
this._sceneGetter = null;
271280
if (JSB) {
@@ -637,13 +646,13 @@ export class Graphics extends UIRenderer {
637646
const vertexBuffer = gfxDevice.createBuffer(new BufferInfo(
638647
BufferUsageBit.VERTEX | BufferUsageBit.TRANSFER_DST,
639648
MemoryUsageBit.DEVICE,
640-
65535 * stride,
649+
65536 * stride, // Uint16 can address 65536 vertices (indices 0–65535)
641650
stride,
642651
));
643652
const indexBuffer = gfxDevice.createBuffer(new BufferInfo(
644653
BufferUsageBit.INDEX | BufferUsageBit.TRANSFER_DST,
645654
MemoryUsageBit.DEVICE,
646-
65535 * Uint16Array.BYTES_PER_ELEMENT * 2,
655+
65536 * Uint16Array.BYTES_PER_ELEMENT * 2, // Uint16 can address 65536 vertices (indices 0–65535)
647656
Uint16Array.BYTES_PER_ELEMENT,
648657
));
649658

cocos/2d/framework/ui-renderer.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,12 +398,23 @@ export class UIRenderer extends Renderer {
398398
this.node.off(NodeEventType.ANCHOR_CHANGED, this._nodeStateChange, this);
399399
this.node.off(NodeEventType.SIZE_CHANGED, this._nodeStateChange, this);
400400
this.node.off(NodeEventType.PARENT_CHANGED, this._colorDirty, this);
401-
this.destroyRenderData();
401+
if (!this._keepRenderData) {
402+
this.destroyRenderData();
403+
}
402404
uiRendererManager.removeRenderer(this);
403405
this._renderFlag = false;
404406
this._renderEntity.enabled = false;
405407
}
406408

409+
/**
410+
* Whether to keep render data when the component leaves the active hierarchy.
411+
* Retained-mode renderers may override this policy and keep their render data until
412+
* the content is explicitly cleared or the component is destroyed.
413+
*/
414+
protected get _keepRenderData (): boolean {
415+
return false;
416+
}
417+
407418
public onDestroy (): void {
408419
this._renderEntity.setNode(null);
409420
if (this.node._uiProps.uiComp === this) {

cocos/2d/renderer/mesh-buffer.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
*/
2424

2525
import { JSB } from 'internal:constants';
26-
import { Device, BufferUsageBit, MemoryUsageBit, Attribute, Buffer, BufferInfo, InputAssembler, InputAssemblerInfo, Feature, API } from '../../gfx';
26+
import { Device, BufferUsageBit, MemoryUsageBit, Attribute, Buffer, BufferInfo, InputAssembler, InputAssemblerInfo, Feature } from '../../gfx';
2727
import { getAttributeStride } from './vertex-format';
2828
import { sys, getError, warnID, assertIsTrue } from '../../core';
2929
import { NativeUIMeshBuffer } from './native-2d';
@@ -251,11 +251,10 @@ export class MeshBuffer {
251251

252252
this.floatsPerVertex = getAttributeStride(attrs) >> 2;
253253

254-
var vDataCountLimit = 65536; // 2^16 - 1
255-
const glApi = device.gfxAPI;
256-
if (glApi === API.WEBGPU || glApi === API.WEBGL2 || glApi === API.WEBGL && device.hasFeature(Feature.ELEMENT_INDEX_UINT)) {
257-
vDataCountLimit = 4294967295; // 2^32 - 1
258-
}
254+
// Use the GPU's actual reported capability to determine max addressable vertex count.
255+
// Feature.ELEMENT_INDEX_UINT is set to true in: WebGL2, WebGPU, Vulkan, Metal, GLES3, GLES2+ext.
256+
// vDataCountLimit is a vertex COUNT limit (max index value + 1), not the max index value itself.
257+
const vDataCountLimit = device.hasFeature(Feature.ELEMENT_INDEX_UINT) ? 4294967296 : 65536; // Uint32 or Uint16 can address 2^32 or 2^16 vertices (indices 0–2^32-1 or 0–2^16-1)
259258
assertIsTrue(this._initVDataCount / this._floatsPerVertex < vDataCountLimit, getError(9005));
260259

261260
if (!this.vData || !this.iData) {

0 commit comments

Comments
 (0)