You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
663 lines
26 KiB
663 lines
26 KiB
using System; |
|
using System.Runtime.InteropServices; |
|
using UnityEngine; |
|
#if UNITY_EDITOR |
|
using UnityEditor; |
|
#endif |
|
|
|
namespace UTJ.FrameCapturer |
|
{ |
|
public static class fcAPI |
|
{ |
|
// ------------------------------------------------------------- |
|
// Foundation |
|
// ------------------------------------------------------------- |
|
|
|
public enum fcPixelFormat |
|
{ |
|
Unknown = 0, |
|
|
|
ChannelMask = 0xF, |
|
TypeMask = 0xF << 4, |
|
Type_f16 = 0x1 << 4, |
|
Type_f32 = 0x2 << 4, |
|
Type_u8 = 0x3 << 4, |
|
Type_i16 = 0x4 << 4, |
|
Type_i32 = 0x5 << 4, |
|
|
|
Rf16 = Type_f16 | 1, |
|
RGf16 = Type_f16 | 2, |
|
RGBf16 = Type_f16 | 3, |
|
RGBAf16 = Type_f16 | 4, |
|
Rf32 = Type_f32 | 1, |
|
RGf32 = Type_f32 | 2, |
|
RGBf32 = Type_f32 | 3, |
|
RGBAf32 = Type_f32 | 4, |
|
Ru8 = Type_u8 | 1, |
|
RGu8 = Type_u8 | 2, |
|
RGBu8 = Type_u8 | 3, |
|
RGBAu8 = Type_u8 | 4, |
|
Ri16 = Type_i16 | 1, |
|
RGi16 = Type_i16 | 2, |
|
RGBi16 = Type_i16 | 3, |
|
RGBAi16 = Type_i16 | 4, |
|
Ri32 = Type_i32 | 1, |
|
RGi32 = Type_i32 | 2, |
|
RGBi32 = Type_i32 | 3, |
|
RGBAi32 = Type_i32 | 4, |
|
}; |
|
|
|
public enum fcBitrateMode |
|
{ |
|
CBR, |
|
VBR, |
|
} |
|
|
|
public enum fcAudioBitsPerSample |
|
{ |
|
_8Bits = 8, |
|
_16Bits = 16, |
|
_24Bits = 24, |
|
} |
|
|
|
|
|
|
|
[DllImport ("fccore")] public static extern void fcSetModulePath(string path); |
|
[DllImport ("fccore")] public static extern double fcGetTime(); |
|
|
|
|
|
public struct fcDeferredCall |
|
{ |
|
public int handle; |
|
public void Release() { fcReleaseDeferredCall(this); handle = 0; } |
|
public static implicit operator int(fcDeferredCall v) { return v.handle; } |
|
} |
|
|
|
public struct fcStream |
|
{ |
|
public IntPtr ptr; |
|
public void Release() { fcReleaseStream(this); ptr = IntPtr.Zero; } |
|
public static implicit operator bool(fcStream v) { return v.ptr != IntPtr.Zero; } |
|
} |
|
[DllImport ("fccore")] public static extern fcStream fcCreateFileStream(string path); |
|
[DllImport ("fccore")] public static extern fcStream fcCreateMemoryStream(); |
|
[DllImport ("fccore")] private static extern void fcReleaseStream(fcStream s); |
|
[DllImport ("fccore")] public static extern ulong fcStreamGetWrittenSize(fcStream s); |
|
|
|
[DllImport ("fccore")] public static extern void fcGuardBegin(); |
|
[DllImport ("fccore")] public static extern void fcGuardEnd(); |
|
[DllImport ("fccore")] public static extern fcDeferredCall fcAllocateDeferredCall(); |
|
[DllImport ("fccore")] private static extern void fcReleaseDeferredCall(fcDeferredCall dc); |
|
[DllImport ("fccore")] public static extern IntPtr fcGetRenderEventFunc(); |
|
|
|
public static void fcGuard(Action body) |
|
{ |
|
fcGuardBegin(); |
|
body.Invoke(); |
|
fcGuardEnd(); |
|
} |
|
|
|
public static fcPixelFormat fcGetPixelFormat(RenderTextureFormat v) |
|
{ |
|
switch (v) |
|
{ |
|
case RenderTextureFormat.ARGB32: return fcPixelFormat.RGBAu8; |
|
case RenderTextureFormat.ARGBHalf: return fcPixelFormat.RGBAf16; |
|
case RenderTextureFormat.RGHalf: return fcPixelFormat.RGf16; |
|
case RenderTextureFormat.RHalf: return fcPixelFormat.Rf16; |
|
case RenderTextureFormat.ARGBFloat: return fcPixelFormat.RGBAf32; |
|
case RenderTextureFormat.RGFloat: return fcPixelFormat.RGf32; |
|
case RenderTextureFormat.RFloat: return fcPixelFormat.Rf32; |
|
case RenderTextureFormat.ARGBInt: return fcPixelFormat.RGBAi32; |
|
case RenderTextureFormat.RGInt: return fcPixelFormat.RGi32; |
|
case RenderTextureFormat.RInt: return fcPixelFormat.Ri32; |
|
} |
|
return fcPixelFormat.Unknown; |
|
} |
|
|
|
public static fcPixelFormat fcGetPixelFormat(TextureFormat v) |
|
{ |
|
switch (v) |
|
{ |
|
case TextureFormat.Alpha8: return fcPixelFormat.Ru8; |
|
case TextureFormat.RGB24: return fcPixelFormat.RGBu8; |
|
case TextureFormat.RGBA32: return fcPixelFormat.RGBAu8; |
|
case TextureFormat.ARGB32: return fcPixelFormat.RGBAu8; |
|
case TextureFormat.RGBAHalf: return fcPixelFormat.RGBAf16; |
|
case TextureFormat.RGHalf: return fcPixelFormat.RGf16; |
|
case TextureFormat.RHalf: return fcPixelFormat.Rf16; |
|
case TextureFormat.RGBAFloat: return fcPixelFormat.RGBAf32; |
|
case TextureFormat.RGFloat: return fcPixelFormat.RGf32; |
|
case TextureFormat.RFloat: return fcPixelFormat.Rf32; |
|
} |
|
return fcPixelFormat.Unknown; |
|
} |
|
|
|
public static int fcGetNumAudioChannels() |
|
{ |
|
switch (AudioSettings.speakerMode) |
|
{ |
|
case AudioSpeakerMode.Mono: return 1; |
|
case AudioSpeakerMode.Stereo: return 2; |
|
case AudioSpeakerMode.Quad: return 4; |
|
case AudioSpeakerMode.Surround: return 5; |
|
case AudioSpeakerMode.Mode5point1: return 6; |
|
case AudioSpeakerMode.Mode7point1: return 8; |
|
case AudioSpeakerMode.Prologic: return 6; |
|
} |
|
return 0; |
|
} |
|
|
|
|
|
[DllImport ("fccore")] public static extern void fcEnableAsyncReleaseContext(Bool v); |
|
[DllImport ("fccore")] public static extern void fcWaitAsyncDelete(); |
|
[DllImport ("fccore")] public static extern void fcReleaseContext(IntPtr ctx); |
|
|
|
|
|
// ------------------------------------------------------------- |
|
// PNG Exporter |
|
// ------------------------------------------------------------- |
|
|
|
public enum fcPngPixelFormat |
|
{ |
|
Adaptive, // select optimal one for input data |
|
UInt8, |
|
UInt16, |
|
}; |
|
|
|
[Serializable] |
|
public struct fcPngConfig |
|
{ |
|
public fcPngPixelFormat pixelFormat; |
|
[Range(1, 32)] public int maxTasks; |
|
// C# ext |
|
[HideInInspector] public int width; |
|
[HideInInspector] public int height; |
|
[HideInInspector] public int channels; |
|
|
|
public static fcPngConfig default_value |
|
{ |
|
get |
|
{ |
|
return new fcPngConfig |
|
{ |
|
pixelFormat = fcPngPixelFormat.Adaptive, |
|
maxTasks = 2, |
|
}; |
|
} |
|
} |
|
}; |
|
|
|
public struct fcPngContext |
|
{ |
|
public IntPtr ptr; |
|
public void Release() { fcReleaseContext(ptr); ptr = IntPtr.Zero; } |
|
public static implicit operator bool(fcPngContext v) { return v.ptr != IntPtr.Zero; } |
|
} |
|
|
|
[DllImport ("fccore")] public static extern Bool fcPngIsSupported(); |
|
[DllImport ("fccore")] public static extern fcPngContext fcPngCreateContext(ref fcPngConfig conf); |
|
[DllImport ("fccore")] public static extern Bool fcPngExportPixels(fcPngContext ctx, string path, byte[] pixels, int width, int height, fcPixelFormat fmt, int num_channels); |
|
|
|
|
|
// ------------------------------------------------------------- |
|
// EXR Exporter |
|
// ------------------------------------------------------------- |
|
|
|
public enum fcExrPixelFormat |
|
{ |
|
Adaptive, // select optimal one for input data |
|
Half, |
|
Float, |
|
Int, |
|
}; |
|
|
|
public enum fcExrCompression |
|
{ |
|
None, |
|
RLE, |
|
ZipS, // par-line |
|
Zip, // block |
|
PIZ, |
|
}; |
|
|
|
[Serializable] |
|
public struct fcExrConfig |
|
{ |
|
public fcExrPixelFormat pixelFormat; |
|
public fcExrCompression compression; |
|
[Range(1, 32)] public int maxTasks; |
|
// C# ext |
|
[HideInInspector] public int width; |
|
[HideInInspector] public int height; |
|
[HideInInspector] public int channels; |
|
|
|
public static fcExrConfig default_value |
|
{ |
|
get |
|
{ |
|
return new fcExrConfig |
|
{ |
|
pixelFormat = fcExrPixelFormat.Adaptive, |
|
compression = fcExrCompression.Zip, |
|
maxTasks = 2, |
|
}; |
|
} |
|
} |
|
}; |
|
|
|
public struct fcExrContext |
|
{ |
|
public IntPtr ptr; |
|
public void Release() { fcReleaseContext(ptr); ptr = IntPtr.Zero; } |
|
public static implicit operator bool(fcExrContext v) { return v.ptr != IntPtr.Zero; } |
|
} |
|
|
|
[DllImport ("fccore")] public static extern Bool fcExrIsSupported(); |
|
[DllImport ("fccore")] public static extern fcExrContext fcExrCreateContext(ref fcExrConfig conf); |
|
[DllImport ("fccore")] public static extern Bool fcExrBeginImage(fcExrContext ctx, string path, int width, int height); |
|
[DllImport ("fccore")] public static extern Bool fcExrAddLayerPixels(fcExrContext ctx, byte[] pixels, fcPixelFormat fmt, int ch, string name); |
|
[DllImport ("fccore")] public static extern Bool fcExrEndImage(fcExrContext ctx); |
|
|
|
|
|
// ------------------------------------------------------------- |
|
// GIF Exporter |
|
// ------------------------------------------------------------- |
|
|
|
[Serializable] |
|
public struct fcGifConfig |
|
{ |
|
[HideInInspector] public int width; |
|
[HideInInspector] public int height; |
|
[Range(1, 256)] public int numColors; |
|
[Range(1, 120)] public int keyframeInterval; |
|
[Range(1, 32)] public int maxTasks; |
|
|
|
public static fcGifConfig default_value |
|
{ |
|
get |
|
{ |
|
return new fcGifConfig |
|
{ |
|
numColors = 256, |
|
maxTasks = 8, |
|
keyframeInterval = 30, |
|
}; |
|
} |
|
} |
|
}; |
|
public struct fcGifContext |
|
{ |
|
public IntPtr ptr; |
|
public void Release() { fcReleaseContext(ptr); ptr = IntPtr.Zero; } |
|
public static implicit operator bool(fcGifContext v) { return v.ptr != IntPtr.Zero; } |
|
} |
|
|
|
[DllImport ("fccore")] public static extern Bool fcGifIsSupported(); |
|
[DllImport ("fccore")] public static extern fcGifContext fcGifCreateContext(ref fcGifConfig conf); |
|
[DllImport ("fccore")] public static extern void fcGifAddOutputStream(fcGifContext ctx, fcStream stream); |
|
[DllImport ("fccore")] public static extern Bool fcGifAddFramePixels(fcGifContext ctx, byte[] pixels, fcPixelFormat fmt, double timestamp = -1.0); |
|
|
|
|
|
// ------------------------------------------------------------- |
|
// MP4 Exporter |
|
// ------------------------------------------------------------- |
|
|
|
public enum fcMP4VideoFlags |
|
{ |
|
H264NVIDIA = 1 << 1, |
|
H264AMD = 1 << 2, |
|
H264IntelHW = 1 << 3, |
|
H264IntelSW = 1 << 4, |
|
H264OpenH264= 1 << 5, |
|
H264Mask = H264NVIDIA | H264AMD | H264IntelHW | H264IntelSW | H264OpenH264, |
|
}; |
|
|
|
public enum fcMP4AudioFlags |
|
{ |
|
AACIntel = 1 << 1, |
|
AACFAAC = 1 << 2, |
|
AACMask = AACIntel | AACFAAC, |
|
}; |
|
|
|
[Serializable] |
|
public struct fcMP4Config |
|
{ |
|
[HideInInspector] public Bool video; |
|
[HideInInspector] public int videoWidth; |
|
[HideInInspector] public int videoHeight; |
|
[HideInInspector] public int videoTargetFramerate; |
|
public fcBitrateMode videoBitrateMode; |
|
public int videoTargetBitrate; |
|
[HideInInspector] public int videoFlags; |
|
[Range(1, 32)] public int videoMaxTasks; |
|
|
|
[HideInInspector] public Bool audio; |
|
[HideInInspector] public int audioSampleRate; |
|
[HideInInspector] public int audioNumChannels; |
|
public fcBitrateMode audioBitrateMode; |
|
public int audioTargetBitrate; |
|
[HideInInspector] public int audioFlags; |
|
[Range(1, 32)] public int audioMaxTasks; |
|
|
|
public static fcMP4Config default_value |
|
{ |
|
get |
|
{ |
|
return new fcMP4Config |
|
{ |
|
video = true, |
|
videoBitrateMode = fcBitrateMode.VBR, |
|
videoTargetBitrate = 1024 * 1000, |
|
videoTargetFramerate = 30, |
|
videoFlags = (int)fcMP4VideoFlags.H264Mask, |
|
videoMaxTasks = 4, |
|
|
|
audio = true, |
|
audioSampleRate = 48000, |
|
audioNumChannels = 2, |
|
audioBitrateMode = fcBitrateMode.VBR, |
|
audioTargetBitrate = 128 * 1000, |
|
audioFlags = (int)fcMP4AudioFlags.AACMask, |
|
audioMaxTasks = 4, |
|
}; |
|
} |
|
} |
|
}; |
|
public struct fcMP4Context |
|
{ |
|
public IntPtr ptr; |
|
public void Release() { fcReleaseContext(ptr); ptr = IntPtr.Zero; } |
|
public static implicit operator bool(fcMP4Context v) { return v.ptr != IntPtr.Zero; } |
|
} |
|
|
|
[DllImport ("fccore")] public static extern Bool fcMP4IsSupported(); |
|
[DllImport ("fccore")] public static extern Bool fcMP4OSIsSupported(); |
|
[DllImport ("fccore")] public static extern fcMP4Context fcMP4CreateContext(ref fcMP4Config conf); |
|
[DllImport ("fccore")] public static extern fcMP4Context fcMP4OSCreateContext(ref fcMP4Config conf, string path); |
|
[DllImport ("fccore")] public static extern void fcMP4AddOutputStream(fcMP4Context ctx, fcStream s); |
|
[DllImport ("fccore")] private static extern IntPtr fcMP4GetAudioEncoderInfo(fcMP4Context ctx); |
|
[DllImport ("fccore")] private static extern IntPtr fcMP4GetVideoEncoderInfo(fcMP4Context ctx); |
|
[DllImport ("fccore")] public static extern Bool fcMP4AddVideoFramePixels(fcMP4Context ctx, byte[] pixels, fcPixelFormat fmt, double timestamp = -1.0); |
|
[DllImport ("fccore")] public static extern Bool fcMP4AddAudioSamples(fcMP4Context ctx, float[] samples, int num_samples); |
|
|
|
public static string fcMP4GetAudioEncoderInfoS(fcMP4Context ctx) |
|
{ |
|
return Marshal.PtrToStringAnsi(fcMP4GetAudioEncoderInfo(ctx)); |
|
} |
|
|
|
public static string fcMP4GetVideoEncoderInfoS(fcMP4Context ctx) |
|
{ |
|
return Marshal.PtrToStringAnsi(fcMP4GetVideoEncoderInfo(ctx)); |
|
} |
|
|
|
|
|
// ------------------------------------------------------------- |
|
// WebM Exporter |
|
// ------------------------------------------------------------- |
|
|
|
public struct fcWebMContext |
|
{ |
|
public IntPtr ptr; |
|
public void Release() { fcReleaseContext(ptr); ptr = IntPtr.Zero; } |
|
public static implicit operator bool(fcWebMContext v) { return v.ptr != IntPtr.Zero; } |
|
} |
|
|
|
public enum fcWebMVideoEncoder |
|
{ |
|
VP8, |
|
VP9, |
|
VP9LossLess, |
|
}; |
|
public enum fcWebMAudioEncoder |
|
{ |
|
Vorbis, |
|
Opus, |
|
}; |
|
|
|
[Serializable] |
|
public struct fcWebMConfig |
|
{ |
|
[HideInInspector] public Bool video; |
|
public fcWebMVideoEncoder videoEncoder; |
|
[HideInInspector] public int videoWidth; |
|
[HideInInspector] public int videoHeight; |
|
[HideInInspector] public int videoTargetFramerate; |
|
public fcBitrateMode videoBitrateMode; |
|
public int videoTargetBitrate; |
|
[Range(1, 32)] public int videoMaxTasks; |
|
|
|
[HideInInspector] public Bool audio; |
|
public fcWebMAudioEncoder audioEncoder; |
|
[HideInInspector] public int audioSampleRate; |
|
[HideInInspector] public int audioNumChannels; |
|
public fcBitrateMode audioBitrateMode; |
|
public int audioTargetBitrate; |
|
[Range(1, 32)] public int audioMaxTasks; |
|
|
|
public static fcWebMConfig default_value |
|
{ |
|
get |
|
{ |
|
return new fcWebMConfig |
|
{ |
|
video = true, |
|
videoEncoder = fcWebMVideoEncoder.VP8, |
|
videoTargetFramerate = 60, |
|
videoBitrateMode = fcBitrateMode.VBR, |
|
videoTargetBitrate = 1024 * 1000, |
|
videoMaxTasks = 4, |
|
|
|
audio = true, |
|
audioEncoder = fcWebMAudioEncoder.Vorbis, |
|
audioSampleRate = 48000, |
|
audioNumChannels = 2, |
|
audioBitrateMode = fcBitrateMode.VBR, |
|
audioTargetBitrate = 128 * 1000, |
|
audioMaxTasks = 4, |
|
}; |
|
} |
|
} |
|
} |
|
|
|
[DllImport ("fccore")] public static extern Bool fcWebMIsSupported(); |
|
[DllImport ("fccore")] public static extern fcWebMContext fcWebMCreateContext(ref fcWebMConfig conf); |
|
[DllImport ("fccore")] public static extern void fcWebMAddOutputStream(fcWebMContext ctx, fcStream stream); |
|
// timestamp=-1 is treated as current time. |
|
[DllImport ("fccore")] public static extern Bool fcWebMAddVideoFramePixels(fcWebMContext ctx, byte[] pixels, fcPixelFormat fmt, double timestamp = -1.0); |
|
// timestamp=-1 is treated as current time. |
|
[DllImport ("fccore")] public static extern Bool fcWebMAddAudioSamples(fcWebMContext ctx, float[] samples, int num_samples); |
|
|
|
|
|
// ------------------------------------------------------------- |
|
// Wave Exporter |
|
// ------------------------------------------------------------- |
|
public struct fcWaveContext |
|
{ |
|
public IntPtr ptr; |
|
public void Release() { fcReleaseContext(ptr); ptr = IntPtr.Zero; } |
|
public static implicit operator bool(fcWaveContext v) { return v.ptr != IntPtr.Zero; } |
|
} |
|
|
|
[Serializable] |
|
public struct fcWaveConfig |
|
{ |
|
[HideInInspector] public int sampleRate; |
|
[HideInInspector] public int numChannels; |
|
public fcAudioBitsPerSample bitsPerSample; |
|
[Range(1, 32)] public int maxTasks; |
|
|
|
public static fcWaveConfig default_value |
|
{ |
|
get |
|
{ |
|
return new fcWaveConfig |
|
{ |
|
sampleRate = 48000, |
|
numChannels = 2, |
|
bitsPerSample = fcAudioBitsPerSample._16Bits, |
|
maxTasks = 2, |
|
}; |
|
} |
|
} |
|
} |
|
|
|
[DllImport ("fccore")] public static extern Bool fcWaveIsSupported(); |
|
[DllImport ("fccore")] public static extern fcWaveContext fcWaveCreateContext(ref fcWaveConfig conf); |
|
[DllImport ("fccore")] public static extern void fcWaveAddOutputStream(fcWaveContext ctx, fcStream stream); |
|
[DllImport ("fccore")] public static extern Bool fcWaveAddAudioSamples(fcWaveContext ctx, float[] samples, int num_samples); |
|
|
|
|
|
|
|
// ------------------------------------------------------------- |
|
// Ogg Exporter |
|
// ------------------------------------------------------------- |
|
public struct fcOggContext |
|
{ |
|
public IntPtr ptr; |
|
public void Release() { fcReleaseContext(ptr); ptr = IntPtr.Zero; } |
|
public static implicit operator bool(fcOggContext v) { return v.ptr != IntPtr.Zero; } |
|
} |
|
|
|
[Serializable] |
|
public struct fcOggConfig |
|
{ |
|
[HideInInspector] public int sampleRate; |
|
[HideInInspector] public int numChannels; |
|
public fcBitrateMode bitrateMode; |
|
public int targetBitrate; |
|
[Range(1, 32)] public int maxTasks; |
|
|
|
public static fcOggConfig default_value |
|
{ |
|
get |
|
{ |
|
return new fcOggConfig |
|
{ |
|
sampleRate = 48000, |
|
numChannels = 2, |
|
bitrateMode = fcBitrateMode.VBR, |
|
targetBitrate = 128 * 1000, |
|
maxTasks = 2, |
|
}; |
|
} |
|
} |
|
} |
|
|
|
[DllImport ("fccore")] public static extern Bool fcOggIsSupported(); |
|
[DllImport ("fccore")] public static extern fcOggContext fcOggCreateContext(ref fcOggConfig conf); |
|
[DllImport ("fccore")] public static extern void fcOggAddOutputStream(fcOggContext ctx, fcStream stream); |
|
[DllImport ("fccore")] public static extern Bool fcOggAddAudioSamples(fcOggContext ctx, float[] samples, int num_samples); |
|
|
|
|
|
// ------------------------------------------------------------- |
|
// Flac Exporter |
|
// ------------------------------------------------------------- |
|
public struct fcFlacContext |
|
{ |
|
public IntPtr ptr; |
|
public void Release() { fcReleaseContext(ptr); ptr = IntPtr.Zero; } |
|
public static implicit operator bool(fcFlacContext v) { return v.ptr != IntPtr.Zero; } |
|
} |
|
|
|
[Serializable] |
|
public struct fcFlacConfig |
|
{ |
|
[HideInInspector] public int sampleRate; |
|
[HideInInspector] public int numChannels; |
|
public fcAudioBitsPerSample bitsPerSample; |
|
[Range(0,9)] public int compressionLevel; |
|
public int blockSize; |
|
[HideInInspector] public Bool verify; |
|
[Range(1, 32)] public int maxTasks; |
|
|
|
public static fcFlacConfig default_value |
|
{ |
|
get |
|
{ |
|
return new fcFlacConfig |
|
{ |
|
sampleRate = 48000, |
|
numChannels = 2, |
|
bitsPerSample = fcAudioBitsPerSample._16Bits, |
|
compressionLevel = 5, |
|
blockSize = 0, |
|
verify = false, |
|
maxTasks = 2, |
|
}; |
|
} |
|
} |
|
} |
|
|
|
[DllImport ("fccore")] public static extern Bool fcFlacIsSupported(); |
|
[DllImport ("fccore")] public static extern fcFlacContext fcFlacCreateContext(ref fcFlacConfig conf); |
|
[DllImport ("fccore")] public static extern void fcFlacAddOutputStream(fcFlacContext ctx, fcStream stream); |
|
[DllImport ("fccore")] public static extern Bool fcFlacAddAudioSamples(fcFlacContext ctx, float[] samples, int num_samples); |
|
|
|
|
|
|
|
|
|
public static void fcLock(RenderTexture src, TextureFormat dstfmt, Action<byte[], fcPixelFormat> body) |
|
{ |
|
var tex = new Texture2D(src.width, src.height, dstfmt, false); |
|
RenderTexture.active = src; |
|
tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0, false); |
|
tex.Apply(); |
|
body(tex.GetRawTextureData(), fcGetPixelFormat(tex.format)); |
|
UnityEngine.Object.Destroy(tex); |
|
} |
|
|
|
public static void fcLock(RenderTexture src, Action<byte[], fcPixelFormat> body) |
|
{ |
|
TextureFormat dstfmt = TextureFormat.RGBA32; |
|
switch (src.format) |
|
{ |
|
case RenderTextureFormat.DefaultHDR: |
|
case RenderTextureFormat.ARGB2101010: |
|
case RenderTextureFormat.RGB111110Float: |
|
case RenderTextureFormat.ARGBHalf: |
|
case RenderTextureFormat.RGHalf: |
|
case RenderTextureFormat.Depth: |
|
case RenderTextureFormat.Shadowmap: |
|
case RenderTextureFormat.RHalf: dstfmt = TextureFormat.RGBAHalf; break; |
|
case RenderTextureFormat.ARGBFloat: |
|
case RenderTextureFormat.RGFloat: |
|
case RenderTextureFormat.RFloat: dstfmt = TextureFormat.RGBAFloat; break; |
|
} |
|
fcLock(src, dstfmt, body); |
|
} |
|
|
|
public static Mesh CreateFullscreenQuad() |
|
{ |
|
var r = new Mesh(); |
|
r.vertices = new Vector3[4] { |
|
new Vector3( 1.0f, 1.0f, 0.0f), |
|
new Vector3(-1.0f, 1.0f, 0.0f), |
|
new Vector3(-1.0f,-1.0f, 0.0f), |
|
new Vector3( 1.0f,-1.0f, 0.0f), |
|
}; |
|
r.triangles = new int[6] { 0, 1, 2, 2, 3, 0 }; |
|
r.UploadMeshData(true); |
|
return r; |
|
} |
|
|
|
#if UNITY_EDITOR |
|
//public static bool IsRenderingPathDeferred(Camera cam) |
|
//{ |
|
// if (cam.renderingPath == RenderingPath.DeferredShading || |
|
// (cam.renderingPath == RenderingPath.UsePlayerSettings && |
|
// UnityEditor.Rendering.EditorGraphicsSettings.GetTierSettings(EditorUserBuildSettings.selectedBuildTargetGroup, Graphics.activeTier).renderingPath == RenderingPath.DeferredShading)) |
|
// { |
|
// return true; |
|
// } |
|
// return false; |
|
//} |
|
|
|
public static Shader GetFrameBufferCopyShader() |
|
{ |
|
return AssetDatabase.LoadAssetAtPath<Shader>(AssetDatabase.GUIDToAssetPath("2283fb92223c7914c9096670e29202c8")); |
|
} |
|
#endif |
|
|
|
} |
|
}
|
|
|