Skip to content

Instantly share code, notes, and snippets.

@michaliskambi
Created August 25, 2023 15:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save michaliskambi/f491067233ffa86b5682cfd7c82fa6fc to your computer and use it in GitHub Desktop.
Save michaliskambi/f491067233ffa86b5682cfd7c82fa6fc to your computer and use it in GitHub Desktop.
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