Skip to content

Commit

Permalink
#154 maskプロパティーを実装
Browse files Browse the repository at this point in the history
  • Loading branch information
ienaga committed Dec 2, 2024
1 parent 4629c6f commit 76c37c9
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 105 deletions.
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
// // textFiled.wordWrap = true;
// textFiled.text = "Hello Next2D\nTest Mode On Test Mode On Test Mode On Test Mode On Test Mode On Test Mode On Test Mode On\nText Field\nText Field\n\n\n\nText Field\nTest Mode On Test Mode On Test Mode On Test Mode On Test Mode On";

const maskShape = sprite.addChild(new Shape());
const maskShape = new Shape(); //sprite.addChild(new Shape());
const viewShape = sprite.addChild(new Shape());
viewShape.x = 100;
viewShape.y = 100;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,11 @@ export const execute = <P extends DisplayObjectContainer>(
}

// mask
const maskInstance = display_object_container.mask;
if (maskInstance) {
const maskDisplayObject = display_object_container.mask;
if (maskDisplayObject) {

const bounds = displayObjectIsMaskReflectedInDisplayUseCase(
maskInstance,
maskDisplayObject,
tMatrix,
renderer_width,
renderer_height,
Expand All @@ -123,7 +123,7 @@ export const execute = <P extends DisplayObjectContainer>(
);

if (!bounds) {
maskInstance.changed = false;
maskDisplayObject.changed = false;
render_queue.push(0);
} else {

Expand All @@ -134,21 +134,21 @@ export const execute = <P extends DisplayObjectContainer>(

switch (true) {

case maskInstance.isContainerEnabled: // 0x00
case maskDisplayObject.isContainerEnabled: // 0x00
break;

case maskInstance.isShape: // 0x01
case maskDisplayObject.isShape: // 0x01
shapeGenerateClipQueueUseCase(
maskInstance as Shape,
maskDisplayObject as Shape,
render_queue,
tMatrix
);
break;

case maskInstance.isText: // 0x02
case maskDisplayObject.isText: // 0x02
break;

case maskInstance.isVideo: // 0x03
case maskDisplayObject.isVideo: // 0x03
break;

default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,14 @@ import type { TextField } from "@next2d/text";
import type { Video } from "@next2d/media";
import { Matrix } from "@next2d/geom";
import { execute as displayObjectGetRawMatrixUseCase } from "../../DisplayObject/usecase/DisplayObjectGetRawMatrixUseCase";
import { execute as displayObjectConcatenatedMatrixUseCase } from "../../DisplayObject/usecase/DisplayObjectConcatenatedMatrixUseCase";
import { execute as shapeHitTestUseCase } from "../../Shape/usecase/ShapeHitTestUseCase";
import { execute as textFieldHitTestUseCase } from "../../TextField/usecase/TextFieldHitTestUseCase";
import { execute as videoHitTestUseCase } from "../../Video/usecase/VideoHitTestUseCase";
import {
$getArray,
$poolArray,
$getMap,
$poolMap,
$MATRIX_ARRAY_IDENTITY
$poolMap
} from "../../DisplayObjectUtil";

/**
Expand Down Expand Up @@ -98,6 +96,50 @@ export const execute = <P extends DisplayObjectContainer, D extends DisplayObjec
const mouseChildren = display_object_container.mouseChildren && mouse_children;

let hit = false;

const maskDisplayObject = display_object_container.mask as D;
if (maskDisplayObject) {
let hitTest = false;
switch (true) {

case maskDisplayObject.isContainerEnabled:
hitTest = execute(
maskDisplayObject as unknown as DisplayObjectContainer,
hit_context, tMatrix, hit_object, mouseChildren
);
break;

case maskDisplayObject.isShape:
hitTest = shapeHitTestUseCase(
maskDisplayObject as unknown as Shape,
hit_context, tMatrix, hit_object
);
break;

case maskDisplayObject.isText:
hitTest = textFieldHitTestUseCase(
maskDisplayObject as unknown as TextField,
hit_context, tMatrix, hit_object
);
break;

case maskDisplayObject.isVideo:
hitTest = videoHitTestUseCase(
maskDisplayObject as unknown as Video,
hit_context, tMatrix, hit_object
);
break;

default:
break;

}

if (!hitTest) {
return false;
}
}

while (targets.length) {

const instance = targets.pop();
Expand Down Expand Up @@ -164,96 +206,39 @@ export const execute = <P extends DisplayObjectContainer, D extends DisplayObjec
}

let hitTest = false;
switch (true) {

case instance.isContainerEnabled:
hitTest = execute(
instance as unknown as DisplayObjectContainer,
hit_context, tMatrix, hit_object, mouseChildren
);
break;

case instance.isShape:
hitTest = shapeHitTestUseCase(
instance as unknown as Shape,
hit_context, tMatrix, hit_object
);
break;

case instance.isText:
hitTest = textFieldHitTestUseCase(
instance as unknown as TextField,
hit_context, tMatrix, hit_object
);
break;

case instance.isVideo:
hitTest = videoHitTestUseCase(
instance as unknown as Video,
hit_context, tMatrix, hit_object
);
break;

default:
break;

// mask hit test
const maskInstance = instance.mask as D | null;
if (maskInstance) {

let maskMatrix = $MATRIX_ARRAY_IDENTITY;
if (maskInstance.parent) {
const matrix = displayObjectConcatenatedMatrixUseCase(maskInstance.parent);
maskMatrix = matrix.rawData;
}

switch (true) {

case maskInstance.isContainerEnabled:
hitTest = execute(
maskInstance as unknown as DisplayObjectContainer,
hit_context, maskMatrix, hit_object, mouseChildren
);
break;

case maskInstance.isShape:
hitTest = shapeHitTestUseCase(
maskInstance as unknown as Shape,
hit_context, maskMatrix, hit_object
);
break;

case maskInstance.isText:
hitTest = textFieldHitTestUseCase(
maskInstance as unknown as TextField,
hit_context, maskMatrix, hit_object
);
break;

case maskInstance.isVideo:
hitTest = videoHitTestUseCase(
maskInstance as unknown as Video,
hit_context, maskMatrix, hit_object
);
break;

default:
break;

}

if (maskInstance.parent) {
Matrix.release(maskMatrix);
}

if (!hitTest) {
continue;
}

} else {

switch (true) {

case instance.isContainerEnabled:
hitTest = execute(
instance as unknown as DisplayObjectContainer,
hit_context, tMatrix, hit_object, mouseChildren
);
break;

case instance.isShape:
hitTest = shapeHitTestUseCase(
instance as unknown as Shape,
hit_context, tMatrix, hit_object
);
break;

case instance.isText:
hitTest = textFieldHitTestUseCase(
instance as unknown as TextField,
hit_context, tMatrix, hit_object
);
break;

case instance.isVideo:
hitTest = videoHitTestUseCase(
instance as unknown as Video,
hit_context, tMatrix, hit_object
);
break;

default:
break;

}
}

if (!hitTest) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ export const execute = (
image_bitmaps: ImageBitmap[] | null
): number => {

const useMask = render_queue[index++];
if (useMask) {
const useMaskDisplayObject = render_queue[index++];
if (useMaskDisplayObject) {

// これまでの描画データを描画して初期化
$context.drawArraysInstanced();
Expand Down Expand Up @@ -162,7 +162,7 @@ export const execute = (
}

// end mask
if (endClipDepth || useMask) {
if (endClipDepth || useMaskDisplayObject) {
$context.restore();
$context.leaveMask();
}
Expand Down

0 comments on commit 76c37c9

Please sign in to comment.