Created
August 25, 2023 15:33
-
-
Save michaliskambi/f491067233ffa86b5682cfd7c82fa6fc to your computer and use it in GitHub Desktop.
Attaching 2 THighlightBehavior instances to 2 scenes, for https://forum.castle-engine.io/t/convenient-way-to-determine-exact-point-under-mouse/791/23
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
unit GameViewMain; | |
interface | |
uses Classes, | |
CastleVectors, CastleComponentSerialize, | |
CastleUIControls, CastleControls, CastleKeysMouse, CastleScene, CastleTransform, CastleViewport, X3DNodes, X3DFields; | |
type | |
THighlightBehavior = class(TCastleBehavior) | |
EffectColorField: TSFVec3f; | |
end; | |
type | |
{ Main view, where most of the application logic takes place. } | |
TViewMain = class(TCastleView) | |
published | |
{ Components designed using CGE editor. | |
These fields will be automatically initialized at Start. } | |
Viewport: TCastleViewport; | |
Scene1, Scene2: TCastleScene; | |
Label1: TCastleLabel; | |
private | |
CurrentHighlight: THighlightBehavior; | |
public | |
constructor Create(AOwner: TComponent); override; | |
procedure Start; override; | |
procedure Update(const SecondsPassed: Single; var HandleInput: Boolean); override; | |
function Press(const Event: TInputPressRelease): Boolean; override; | |
end; | |
var | |
ViewMain: TViewMain; | |
implementation | |
uses SysUtils, CastleRenderOptions; | |
{ TViewMain ----------------------------------------------------------------- } | |
constructor TViewMain.Create(AOwner: TComponent); | |
begin | |
inherited; | |
DesignUrl := 'castle-data:/gameviewmain.castle-user-interface'; | |
end; | |
procedure TViewMain.Start; | |
procedure AddColorEffect(const Scene: TCastleScene); | |
var | |
Effect: TEffectNode; | |
EffectPart: TEffectPartNode; | |
EffectColorField: TSFVec3f; | |
HighLightBehavior: THighlightBehavior; | |
begin | |
Effect := TEffectNode.Create; | |
Effect.Language := slGLSL; | |
EffectColorField := TSFVec3f.Create(Effect, true, 'color', Vector3(1, 1, 1)); | |
Effect.AddCustomField(EffectColorField); | |
EffectPart := TEffectPartNode.Create; | |
EffectPart.ShaderType := stFragment; | |
EffectPart.SetUrl(['castle-data:/shaders/color_effect.fs']); | |
Effect.SetParts([EffectPart]); | |
Scene.RootNode.AddChildren([Effect]); | |
HighlightBehavior := THighlightBehavior.Create(Self); | |
HighlightBehavior.EffectColorField := EffectColorField; | |
Scene.AddBehavior(HighlightBehavior); | |
end; | |
begin | |
inherited; | |
Scene1.PlayAnimation('jackfacesw', true); | |
Scene2.PlayAnimation('heatherfaceeast', true); | |
AddColorEffect(Scene1); | |
AddColorEffect(Scene2); | |
// CreateColorEffect(Scene1); | |
// CreateColorEffect(Scene2); | |
end; | |
procedure TViewMain.Update(const SecondsPassed: Single; var HandleInput: Boolean); | |
var NewHighlight: THighlightBehavior; | |
begin | |
inherited; | |
if Viewport.TransformUnderMouse <> nil then | |
begin | |
NewHighlight := Viewport.TransformUnderMouse.FindBehavior(THighlightBehavior) as THighlightBehavior; | |
if NewHighlight <> CurrentHighlight then | |
begin | |
if CurrentHighlight <> nil then | |
CurrentHighlight.EffectColorField.Send(Vector3(1, 1, 1)); | |
if NewHighlight <> nil then | |
NewHighlight.EffectColorField.Send(Vector3(1.3, 1.3, 1.3)); | |
CurrentHighlight := NewHighlight; | |
end; | |
end; | |
if Viewport.TransformUnderMouse <> nil then | |
Label1.Caption := Viewport.TransformUnderMouse.Name | |
else | |
Label1.Caption := ' '; | |
end; | |
function TViewMain.Press(const Event: TInputPressRelease): Boolean; | |
begin | |
Result := inherited; | |
if Result then Exit; | |
end; | |
end. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment