Items/Television.cs
using System;
using Clover.Interactable;
using Clover.Player;
namespace Clover.Items;
[Category( "Clover/Items" )]
public class Television : Component, IInteract
{
[Property] public ModelRenderer Model { get; set; }
[Property] public string ScreenMaterialAttribute { get; set; } = "tv_screen";
[Property] public SpotLight SpotLight { get; set; }
[Property] public Sandbox.Light Light { get; set; }
private Material _screenMaterial;
// private Texture _renderTexture;
private VideoPlayer _videoPlayer;
protected override void OnStart()
{
base.OnStart();
_videoPlayer = new VideoPlayer();
_screenMaterial = Material.Create( Random.Shared.Next( 1000, 5000 ).ToString(), "shaders/simple.shader" );
// _screenMaterial = Material.Load( "items/furniture/electronics/tv_crt/tv_screen.vmat" );
// _screenMaterial.Set( "Color", _renderTexture );
// _screenMaterial.Set( "Normal", Color.White );
// _screenMaterial.Set( "Roughness", Color.White );
_screenMaterial.Set( "Color", _videoPlayer.Texture );
_screenMaterial.Set( "Normal", Texture.Load( FileSystem.Mounted, "materials/default/default_normal.tga" ) );
_screenMaterial.Set( "Roughness", Texture.Load( FileSystem.Mounted, "materials/default/default_rough.tga" ) );
if ( Model.IsValid() )
{
// Model.SetMaterial( _screenMaterial );
// Model.MaterialOverride = _screenMaterial;
Model.SetMaterialOverride( _screenMaterial, ScreenMaterialAttribute );
}
if ( Light.IsValid() )
{
Light.Enabled = false;
}
// PlayVideo( "videos/test.mp4" );
}
protected override void OnDestroy()
{
base.OnDestroy();
_videoPlayer?.Stop();
_videoPlayer?.Dispose();
}
[Rpc.Broadcast]
public void PlayVideo( string url )
{
_videoPlayer.Play( FileSystem.Data, url );
_screenMaterial.Set( "Color", _videoPlayer.Texture );
// _screenMaterial.Set( "Normal", Texture.Load( FileSystem.Mounted, "materials/default/default_normal.tga" ) );
// _screenMaterial.Set( "Roughness", Texture.Load( FileSystem.Mounted, "materials/default/default_rough.tga" ) );
if ( SpotLight.IsValid() )
{
SpotLight.Cookie = _videoPlayer.Texture;
}
if ( Light.IsValid() )
{
Light.Enabled = true;
}
_videoPlayer.OnLoaded += () =>
{
Log.Info( "Video loaded" );
};
_videoPlayer.OnAudioReady += () =>
{
Log.Info( "Audio ready" );
};
Log.Info( "Playing video" );
}
protected override void OnFixedUpdate()
{
base.OnFixedUpdate();
// Log.Info( $"{_videoPlayer?.PlaybackTime}/{_videoPlayer?.Duration}" );
if ( _videoPlayer != null )
{
_videoPlayer.Present();
_screenMaterial.Set( "Color", _videoPlayer.Texture );
}
if ( Light.IsValid() )
{
Light.LightColor = _videoPlayer.Texture.GetPixel( 4, 4, 3 );
}
// _screenMaterial.Set( "Color", _videoPlayer.Texture );
}
void IInteract.StartInteract( PlayerCharacter player )
{
PlayVideo( "videos/mono.mp4" );
}
/*void IInteract.StartInteractHost( PlayerCharacter player )
{
PlayVideo( "videos/mono.mp4" );
}*/
public string GetInteractName()
{
return "Watch";
}
}