Compare commits
14 Commits
main
...
2fb6d45a75
| Author | SHA1 | Date | |
|---|---|---|---|
| 2fb6d45a75 | |||
| ac38a9581b | |||
| b7cd4ea7f7 | |||
| 41bbfa81a2 | |||
| add37a9288 | |||
| 3c9e88531d | |||
| 5c5d55955e | |||
| 4d03d277a9 | |||
| 95d7b81cde | |||
| b9a9220156 | |||
| aa1a6584f6 | |||
| 6d4166ed60 | |||
| 8ca58a1f13 | |||
| 77040b7d56 |
@@ -1,432 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!29 &1
|
||||
OcclusionCullingSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_OcclusionBakeSettings:
|
||||
smallestOccluder: 5
|
||||
smallestHole: 0.25
|
||||
backfaceThreshold: 100
|
||||
m_SceneGUID: 00000000000000000000000000000000
|
||||
m_OcclusionCullingData: {fileID: 0}
|
||||
--- !u!104 &2
|
||||
RenderSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 10
|
||||
m_Fog: 0
|
||||
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||
m_FogMode: 3
|
||||
m_FogDensity: 0.01
|
||||
m_LinearFogStart: 0
|
||||
m_LinearFogEnd: 300
|
||||
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
|
||||
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
|
||||
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
|
||||
m_AmbientIntensity: 1
|
||||
m_AmbientMode: 0
|
||||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
|
||||
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_HaloStrength: 0.5
|
||||
m_FlareStrength: 1
|
||||
m_FlareFadeSpeed: 3
|
||||
m_HaloTexture: {fileID: 0}
|
||||
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_DefaultReflectionMode: 0
|
||||
m_DefaultReflectionResolution: 128
|
||||
m_ReflectionBounces: 1
|
||||
m_ReflectionIntensity: 1
|
||||
m_CustomReflection: {fileID: 0}
|
||||
m_Sun: {fileID: 0}
|
||||
m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1}
|
||||
m_UseRadianceAmbientProbe: 0
|
||||
--- !u!157 &3
|
||||
LightmapSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 12
|
||||
m_GISettings:
|
||||
serializedVersion: 2
|
||||
m_BounceScale: 1
|
||||
m_IndirectOutputScale: 1
|
||||
m_AlbedoBoost: 1
|
||||
m_EnvironmentLightingMode: 0
|
||||
m_EnableBakedLightmaps: 1
|
||||
m_EnableRealtimeLightmaps: 0
|
||||
m_LightmapEditorSettings:
|
||||
serializedVersion: 12
|
||||
m_Resolution: 2
|
||||
m_BakeResolution: 40
|
||||
m_AtlasSize: 1024
|
||||
m_AO: 0
|
||||
m_AOMaxDistance: 1
|
||||
m_CompAOExponent: 1
|
||||
m_CompAOExponentDirect: 0
|
||||
m_ExtractAmbientOcclusion: 0
|
||||
m_Padding: 2
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_LightmapsBakeMode: 1
|
||||
m_TextureCompression: 1
|
||||
m_ReflectionCompression: 2
|
||||
m_MixedBakeMode: 2
|
||||
m_BakeBackend: 1
|
||||
m_PVRSampling: 1
|
||||
m_PVRDirectSampleCount: 32
|
||||
m_PVRSampleCount: 512
|
||||
m_PVRBounces: 2
|
||||
m_PVREnvironmentSampleCount: 256
|
||||
m_PVREnvironmentReferencePointCount: 2048
|
||||
m_PVRFilteringMode: 1
|
||||
m_PVRDenoiserTypeDirect: 1
|
||||
m_PVRDenoiserTypeIndirect: 1
|
||||
m_PVRDenoiserTypeAO: 1
|
||||
m_PVRFilterTypeDirect: 0
|
||||
m_PVRFilterTypeIndirect: 0
|
||||
m_PVRFilterTypeAO: 0
|
||||
m_PVREnvironmentMIS: 1
|
||||
m_PVRCulling: 1
|
||||
m_PVRFilteringGaussRadiusDirect: 1
|
||||
m_PVRFilteringGaussRadiusIndirect: 5
|
||||
m_PVRFilteringGaussRadiusAO: 2
|
||||
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
|
||||
m_PVRFilteringAtrousPositionSigmaIndirect: 2
|
||||
m_PVRFilteringAtrousPositionSigmaAO: 1
|
||||
m_ExportTrainingData: 0
|
||||
m_TrainingDataDestination: TrainingData
|
||||
m_LightProbeSampleCountMultiplier: 4
|
||||
m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_LightingSettings: {fileID: 0}
|
||||
--- !u!196 &4
|
||||
NavMeshSettings:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_BuildSettings:
|
||||
serializedVersion: 3
|
||||
agentTypeID: 0
|
||||
agentRadius: 0.5
|
||||
agentHeight: 2
|
||||
agentSlope: 45
|
||||
agentClimb: 0.4
|
||||
ledgeDropHeight: 0
|
||||
maxJumpAcrossDistance: 0
|
||||
minRegionArea: 2
|
||||
manualCellSize: 0
|
||||
cellSize: 0.16666667
|
||||
manualTileSize: 0
|
||||
tileSize: 256
|
||||
buildHeightMesh: 0
|
||||
maxJobWorkers: 0
|
||||
preserveTilesOutsideBounds: 0
|
||||
debug:
|
||||
m_Flags: 0
|
||||
m_NavMeshData: {fileID: 0}
|
||||
--- !u!1 &330585543
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 330585546}
|
||||
- component: {fileID: 330585545}
|
||||
- component: {fileID: 330585544}
|
||||
- component: {fileID: 330585547}
|
||||
m_Layer: 0
|
||||
m_Name: Main Camera
|
||||
m_TagString: MainCamera
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!81 &330585544
|
||||
AudioListener:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
m_Enabled: 1
|
||||
--- !u!20 &330585545
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 1
|
||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||
m_projectionMatrixMode: 1
|
||||
m_GateFitMode: 2
|
||||
m_FOVAxisMode: 0
|
||||
m_Iso: 200
|
||||
m_ShutterSpeed: 0.005
|
||||
m_Aperture: 16
|
||||
m_FocusDistance: 10
|
||||
m_FocalLength: 50
|
||||
m_BladeCount: 5
|
||||
m_Curvature: {x: 2, y: 11}
|
||||
m_BarrelClipping: 0.25
|
||||
m_Anamorphism: 0
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
near clip plane: 0.3
|
||||
far clip plane: 1000
|
||||
field of view: 60
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: -1
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingPath: -1
|
||||
m_TargetTexture: {fileID: 0}
|
||||
m_TargetDisplay: 0
|
||||
m_TargetEye: 3
|
||||
m_HDR: 1
|
||||
m_AllowMSAA: 1
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 1
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!4 &330585546
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 1, z: -10}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &330585547
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_RenderShadows: 1
|
||||
m_RequiresDepthTextureOption: 2
|
||||
m_RequiresOpaqueTextureOption: 2
|
||||
m_CameraType: 0
|
||||
m_Cameras: []
|
||||
m_RendererIndex: -1
|
||||
m_VolumeLayerMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 1
|
||||
m_VolumeTrigger: {fileID: 0}
|
||||
m_VolumeFrameworkUpdateModeOption: 2
|
||||
m_RenderPostProcessing: 1
|
||||
m_Antialiasing: 0
|
||||
m_AntialiasingQuality: 2
|
||||
m_StopNaN: 0
|
||||
m_Dithering: 0
|
||||
m_ClearDepth: 1
|
||||
m_AllowXRRendering: 1
|
||||
m_AllowHDROutput: 1
|
||||
m_UseScreenCoordOverride: 0
|
||||
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_RequiresDepthTexture: 0
|
||||
m_RequiresColorTexture: 0
|
||||
m_Version: 2
|
||||
m_TaaSettings:
|
||||
quality: 3
|
||||
frameInfluence: 0.1
|
||||
jitterScale: 1
|
||||
mipBias: 0
|
||||
varianceClampScale: 0.9
|
||||
contrastAdaptiveSharpening: 0
|
||||
--- !u!1 &410087039
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 410087041}
|
||||
- component: {fileID: 410087040}
|
||||
- component: {fileID: 410087042}
|
||||
m_Layer: 0
|
||||
m_Name: Directional Light
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!108 &410087040
|
||||
Light:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 410087039}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 11
|
||||
m_Type: 1
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_Intensity: 2
|
||||
m_Range: 10
|
||||
m_SpotAngle: 30
|
||||
m_InnerSpotAngle: 21.80208
|
||||
m_CookieSize: 10
|
||||
m_Shadows:
|
||||
m_Type: 2
|
||||
m_Resolution: -1
|
||||
m_CustomResolution: -1
|
||||
m_Strength: 1
|
||||
m_Bias: 0.05
|
||||
m_NormalBias: 0.4
|
||||
m_NearPlane: 0.2
|
||||
m_CullingMatrixOverride:
|
||||
e00: 1
|
||||
e01: 0
|
||||
e02: 0
|
||||
e03: 0
|
||||
e10: 0
|
||||
e11: 1
|
||||
e12: 0
|
||||
e13: 0
|
||||
e20: 0
|
||||
e21: 0
|
||||
e22: 1
|
||||
e23: 0
|
||||
e30: 0
|
||||
e31: 0
|
||||
e32: 0
|
||||
e33: 1
|
||||
m_UseCullingMatrixOverride: 0
|
||||
m_Cookie: {fileID: 0}
|
||||
m_DrawHalo: 0
|
||||
m_Flare: {fileID: 0}
|
||||
m_RenderMode: 0
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingLayerMask: 1
|
||||
m_Lightmapping: 4
|
||||
m_LightShadowCasterMode: 0
|
||||
m_AreaSize: {x: 1, y: 1}
|
||||
m_BounceIntensity: 1
|
||||
m_ColorTemperature: 5000
|
||||
m_UseColorTemperature: 1
|
||||
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_UseBoundingSphereOverride: 0
|
||||
m_UseViewFrustumForShadowCasterCull: 1
|
||||
m_ForceVisible: 0
|
||||
m_ShadowRadius: 0
|
||||
m_ShadowAngle: 0
|
||||
--- !u!4 &410087041
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 410087039}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
|
||||
m_LocalPosition: {x: 0, y: 3, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
|
||||
--- !u!114 &410087042
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 410087039}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Version: 3
|
||||
m_UsePipelineSettings: 1
|
||||
m_AdditionalLightsShadowResolutionTier: 2
|
||||
m_LightLayerMask: 1
|
||||
m_RenderingLayers: 1
|
||||
m_CustomShadowLayers: 0
|
||||
m_ShadowLayerMask: 1
|
||||
m_ShadowRenderingLayers: 1
|
||||
m_LightCookieSize: {x: 1, y: 1}
|
||||
m_LightCookieOffset: {x: 0, y: 0}
|
||||
m_SoftShadowQuality: 1
|
||||
--- !u!1 &832575517
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 832575519}
|
||||
- component: {fileID: 832575518}
|
||||
m_Layer: 0
|
||||
m_Name: Global Volume
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &832575518
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 832575517}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_IsGlobal: 1
|
||||
priority: 0
|
||||
blendDistance: 0
|
||||
weight: 1
|
||||
sharedProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2}
|
||||
--- !u!4 &832575519
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 832575517}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1660057539 &9223372036854775807
|
||||
SceneRoots:
|
||||
m_ObjectHideFlags: 0
|
||||
m_Roots:
|
||||
- {fileID: 330585546}
|
||||
- {fileID: 410087041}
|
||||
- {fileID: 832575519}
|
||||
@@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 99c9720ab356a0642a771bea13969a05
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -342,6 +342,9 @@ MonoBehaviour:
|
||||
skyOcclusionIntensityMultiplier:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
worldOffset:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &-1216621516061285780
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
@@ -376,6 +379,9 @@ MonoBehaviour:
|
||||
highQualityFiltering:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
filter:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
downscale:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
@@ -462,8 +468,6 @@ MonoBehaviour:
|
||||
- {fileID: -6288072647309666549}
|
||||
- {fileID: 7518938298396184218}
|
||||
- {fileID: -1410297666881709256}
|
||||
- {fileID: -7750755424749557576}
|
||||
- {fileID: -5139089513906902183}
|
||||
--- !u!114 &853819529557874667
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
|
||||
@@ -12,8 +12,8 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3}
|
||||
m_Name: Mobile_RPAsset
|
||||
m_EditorClassIdentifier:
|
||||
k_AssetVersion: 12
|
||||
k_AssetPreviousVersion: 12
|
||||
k_AssetVersion: 13
|
||||
k_AssetPreviousVersion: 13
|
||||
m_RendererType: 1
|
||||
m_RendererData: {fileID: 0}
|
||||
m_RendererDataList:
|
||||
@@ -23,7 +23,7 @@ MonoBehaviour:
|
||||
m_RequireOpaqueTexture: 0
|
||||
m_OpaqueDownsampling: 0
|
||||
m_SupportsTerrainHoles: 1
|
||||
m_SupportsHDR: 1
|
||||
m_SupportsHDR: 0
|
||||
m_HDRColorBufferPrecision: 0
|
||||
m_MSAA: 1
|
||||
m_RenderScale: 0.8
|
||||
@@ -53,6 +53,7 @@ MonoBehaviour:
|
||||
m_AdditionalLightsShadowResolutionTierHigh: 1024
|
||||
m_ReflectionProbeBlending: 1
|
||||
m_ReflectionProbeBoxProjection: 1
|
||||
m_ReflectionProbeAtlas: 1
|
||||
m_ShadowDistance: 50
|
||||
m_ShadowCascadeCount: 1
|
||||
m_Cascade2Split: 0.25
|
||||
@@ -78,11 +79,11 @@ MonoBehaviour:
|
||||
m_UseAdaptivePerformance: 1
|
||||
m_ColorGradingMode: 0
|
||||
m_ColorGradingLutSize: 32
|
||||
m_AllowPostProcessAlphaOutput: 0
|
||||
m_UseFastSRGBLinearConversion: 1
|
||||
m_SupportDataDrivenLensFlare: 1
|
||||
m_SupportScreenSpaceLensFlare: 1
|
||||
m_GPUResidentDrawerMode: 0
|
||||
m_UseLegacyLightmaps: 0
|
||||
m_SmallMeshScreenPercentage: 0
|
||||
m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0
|
||||
m_ShadowType: 1
|
||||
@@ -100,23 +101,24 @@ MonoBehaviour:
|
||||
m_Keys: []
|
||||
m_Values:
|
||||
m_PrefilteringModeMainLightShadows: 3
|
||||
m_PrefilteringModeAdditionalLight: 4
|
||||
m_PrefilteringModeAdditionalLight: 3
|
||||
m_PrefilteringModeAdditionalLightShadows: 0
|
||||
m_PrefilterXRKeywords: 1
|
||||
m_PrefilteringModeForwardPlus: 1
|
||||
m_PrefilteringModeForwardPlus: 0
|
||||
m_PrefilteringModeDeferredRendering: 0
|
||||
m_PrefilteringModeScreenSpaceOcclusion: 0
|
||||
m_PrefilterDebugKeywords: 1
|
||||
m_PrefilterWriteRenderingLayers: 1
|
||||
m_PrefilterHDROutput: 1
|
||||
m_PrefilterAlphaOutput: 1
|
||||
m_PrefilterSSAODepthNormals: 1
|
||||
m_PrefilterSSAOSourceDepthLow: 1
|
||||
m_PrefilterSSAOSourceDepthMedium: 0
|
||||
m_PrefilterSSAOSourceDepthMedium: 1
|
||||
m_PrefilterSSAOSourceDepthHigh: 1
|
||||
m_PrefilterSSAOInterleaved: 0
|
||||
m_PrefilterSSAOInterleaved: 1
|
||||
m_PrefilterSSAOBlueNoise: 1
|
||||
m_PrefilterSSAOSampleCountLow: 1
|
||||
m_PrefilterSSAOSampleCountMedium: 0
|
||||
m_PrefilterSSAOSampleCountMedium: 1
|
||||
m_PrefilterSSAOSampleCountHigh: 1
|
||||
m_PrefilterDBufferMRT1: 1
|
||||
m_PrefilterDBufferMRT2: 1
|
||||
@@ -126,8 +128,14 @@ MonoBehaviour:
|
||||
m_PrefilterSoftShadowsQualityHigh: 1
|
||||
m_PrefilterSoftShadows: 0
|
||||
m_PrefilterScreenCoord: 1
|
||||
m_PrefilterScreenSpaceIrradiance: 1
|
||||
m_PrefilterNativeRenderPass: 1
|
||||
m_PrefilterUseLegacyLightmaps: 0
|
||||
m_PrefilterBicubicLightmapSampling: 1
|
||||
m_PrefilterReflectionProbeRotation: 1
|
||||
m_PrefilterReflectionProbeBlending: 0
|
||||
m_PrefilterReflectionProbeBoxProjection: 0
|
||||
m_PrefilterReflectionProbeAtlas: 1
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_ShadowCascades: 0
|
||||
m_Textures:
|
||||
|
||||
@@ -101,16 +101,16 @@ MonoBehaviour:
|
||||
m_Keys: []
|
||||
m_Values:
|
||||
m_PrefilteringModeMainLightShadows: 3
|
||||
m_PrefilteringModeAdditionalLight: 4
|
||||
m_PrefilteringModeAdditionalLightShadows: 0
|
||||
m_PrefilteringModeAdditionalLight: 0
|
||||
m_PrefilteringModeAdditionalLightShadows: 2
|
||||
m_PrefilterXRKeywords: 1
|
||||
m_PrefilteringModeForwardPlus: 1
|
||||
m_PrefilteringModeForwardPlus: 2
|
||||
m_PrefilteringModeDeferredRendering: 0
|
||||
m_PrefilteringModeScreenSpaceOcclusion: 1
|
||||
m_PrefilteringModeScreenSpaceOcclusion: 2
|
||||
m_PrefilterDebugKeywords: 1
|
||||
m_PrefilterWriteRenderingLayers: 0
|
||||
m_PrefilterWriteRenderingLayers: 1
|
||||
m_PrefilterHDROutput: 1
|
||||
m_PrefilterAlphaOutput: 0
|
||||
m_PrefilterAlphaOutput: 1
|
||||
m_PrefilterSSAODepthNormals: 0
|
||||
m_PrefilterSSAOSourceDepthLow: 1
|
||||
m_PrefilterSSAOSourceDepthMedium: 1
|
||||
@@ -122,17 +122,17 @@ MonoBehaviour:
|
||||
m_PrefilterSSAOSampleCountHigh: 1
|
||||
m_PrefilterDBufferMRT1: 1
|
||||
m_PrefilterDBufferMRT2: 1
|
||||
m_PrefilterDBufferMRT3: 0
|
||||
m_PrefilterSoftShadowsQualityLow: 0
|
||||
m_PrefilterSoftShadowsQualityMedium: 0
|
||||
m_PrefilterSoftShadowsQualityHigh: 0
|
||||
m_PrefilterDBufferMRT3: 1
|
||||
m_PrefilterSoftShadowsQualityLow: 1
|
||||
m_PrefilterSoftShadowsQualityMedium: 1
|
||||
m_PrefilterSoftShadowsQualityHigh: 1
|
||||
m_PrefilterSoftShadows: 0
|
||||
m_PrefilterScreenCoord: 1
|
||||
m_PrefilterScreenSpaceIrradiance: 0
|
||||
m_PrefilterScreenSpaceIrradiance: 1
|
||||
m_PrefilterNativeRenderPass: 1
|
||||
m_PrefilterUseLegacyLightmaps: 0
|
||||
m_PrefilterBicubicLightmapSampling: 0
|
||||
m_PrefilterReflectionProbeRotation: 0
|
||||
m_PrefilterBicubicLightmapSampling: 1
|
||||
m_PrefilterReflectionProbeRotation: 1
|
||||
m_PrefilterReflectionProbeBlending: 0
|
||||
m_PrefilterReflectionProbeBoxProjection: 0
|
||||
m_PrefilterReflectionProbeAtlas: 0
|
||||
|
||||
@@ -34,6 +34,9 @@ MonoBehaviour:
|
||||
highQualityFiltering:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
filter:
|
||||
m_OverrideState: 0
|
||||
m_Value: 0
|
||||
downscale:
|
||||
m_OverrideState: 0
|
||||
m_Value: 0
|
||||
|
||||
@@ -68,7 +68,22 @@ MonoBehaviour:
|
||||
- rid: 6885172117838757900
|
||||
- rid: 6885172117838757901
|
||||
m_RuntimeSettings:
|
||||
m_List: []
|
||||
m_List:
|
||||
- rid: 6852985685364965378
|
||||
- rid: 6852985685364965379
|
||||
- rid: 6852985685364965380
|
||||
- rid: 6852985685364965381
|
||||
- rid: 6852985685364965384
|
||||
- rid: 6852985685364965385
|
||||
- rid: 6852985685364965392
|
||||
- rid: 6852985685364965394
|
||||
- rid: 8712630790384254976
|
||||
- rid: 6885172117838757889
|
||||
- rid: 6885172117838757890
|
||||
- rid: 6885172117838757893
|
||||
- rid: 6885172117838757894
|
||||
- rid: 6885172117838757899
|
||||
- rid: 6885172117838757901
|
||||
m_AssetVersion: 10
|
||||
m_ObsoleteDefaultVolumeProfile: {fileID: 0}
|
||||
m_RenderingLayerNames:
|
||||
|
||||
@@ -133,6 +133,10 @@ PrefabInstance:
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Float.m_Array.Array.size
|
||||
value: 2
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.size
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
@@ -147,6 +151,10 @@ PrefabInstance:
|
||||
propertyPath: m_PropertySheet.m_Float.m_Array.Array.data[0].m_Name
|
||||
value: ScaleMultiplier
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Float.m_Array.Array.data[1].m_Name
|
||||
value: OpacityMultiplier
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Uint.m_Array.Array.data[0].m_Value
|
||||
value: 200000
|
||||
@@ -159,6 +167,14 @@ PrefabInstance:
|
||||
propertyPath: m_PropertySheet.m_Float.m_Array.Array.data[0].m_Value
|
||||
value: 64
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Float.m_Array.Array.data[1].m_Value
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Name
|
||||
value: GradientScale
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Uint.m_Array.Array.data[0].m_Overridden
|
||||
value: 1
|
||||
@@ -171,6 +187,62 @@ PrefabInstance:
|
||||
propertyPath: m_PropertySheet.m_Float.m_Array.Array.data[0].m_Overridden
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Float.m_Array.Array.data[1].m_Overridden
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Overridden
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.atime0
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.atime1
|
||||
value: 65535
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.ctime0
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.ctime1
|
||||
value: 65535
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.key1.a
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.key1.b
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.key1.g
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.key1.r
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.m_Mode
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.m_ColorSpace
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.m_NumAlphaKeys
|
||||
value: 2
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -973084862543737302, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_PropertySheet.m_Gradient.m_Array.Array.data[0].m_Value.m_NumColorKeys
|
||||
value: 2
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -774367247743995920, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
propertyPath: m_Enabled
|
||||
value: 1
|
||||
@@ -232,6 +304,55 @@ PrefabInstance:
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: -4216948427090074523, guid: 25c54d8c074f08447ab1c822a6a052fa, type: 3}
|
||||
--- !u!1 &688714159
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 688714160}
|
||||
- component: {fileID: 688714161}
|
||||
m_Layer: 0
|
||||
m_Name: Target
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &688714160
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 688714159}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: -0, y: -0.6424656, z: -0, w: -0.76631457}
|
||||
m_LocalPosition: {x: 0.06, y: 0.13, z: -0.16}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 1826889290}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &688714161
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 688714159}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 536715a2510f9db4883a1cd9d1bf11ef, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier: Assembly-CSharp::SimpleSpin
|
||||
rotationSpeed: -15
|
||||
rotationAxis: {x: 0, y: 1, z: 0}
|
||||
useLocalRotation: 1
|
||||
enableRotation: 1
|
||||
--- !u!1 &1826889287
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -277,7 +398,7 @@ Camera:
|
||||
m_ShutterSpeed: 0.005
|
||||
m_Aperture: 16
|
||||
m_FocusDistance: 10
|
||||
m_FocalLength: 50
|
||||
m_FocalLength: 23.999998
|
||||
m_BladeCount: 5
|
||||
m_Curvature: {x: 2, y: 11}
|
||||
m_BarrelClipping: 0.25
|
||||
@@ -292,7 +413,7 @@ Camera:
|
||||
height: 1
|
||||
near clip plane: 0.3
|
||||
far clip plane: 1000
|
||||
field of view: 60
|
||||
field of view: 53.130108
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: -1
|
||||
@@ -318,13 +439,13 @@ Transform:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1826889287}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: -5}
|
||||
m_LocalRotation: {x: 0.18301274, y: -0.6830127, z: 0.18301274, w: 0.6830127}
|
||||
m_LocalPosition: {x: 2.1, y: 0.8, z: 0.2}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_Father: {fileID: 688714160}
|
||||
m_LocalEulerAnglesHint: {x: 30, y: -90, z: 0}
|
||||
--- !u!114 &1826889291
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -500,6 +621,6 @@ Transform:
|
||||
SceneRoots:
|
||||
m_ObjectHideFlags: 0
|
||||
m_Roots:
|
||||
- {fileID: 1826889290}
|
||||
- {fileID: 688714160}
|
||||
- {fileID: 1911516433}
|
||||
- {fileID: 562634546}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8b806a6344f096541a361192f27632ab
|
||||
guid: be08df561d070254fba75f41010423f9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -0,0 +1,351 @@
|
||||
using Unity.Burst;
|
||||
using Unity.Mathematics;
|
||||
using UnityEngine;
|
||||
using UnityEngine.VFX;
|
||||
using UnityEngine.VFX.Utility;
|
||||
using UnityEditor.AssetImporters;
|
||||
using UnityEditor.Experimental;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using Unity.Collections;
|
||||
using Unity.Jobs;
|
||||
|
||||
namespace SplatVfx.Editor
|
||||
{
|
||||
|
||||
[ScriptedImporter(1, "ply"), BurstCompile]
|
||||
public sealed class SplatImporter : ScriptedImporter
|
||||
{
|
||||
const float SH_C0 = 0.28209479177387814f;
|
||||
const string DefaultVfxPath = "Assets/vfx-graph-gs/SplatVFX.vfx";
|
||||
|
||||
public override void OnImportAsset(AssetImportContext context)
|
||||
{
|
||||
var (headerString, endHeaderPosition) = GetHeader(context.assetPath);
|
||||
var headerData = ParseMetadata(headerString);
|
||||
|
||||
var data = ImportData(headerData, context.assetPath, endHeaderPosition);
|
||||
data.name = Path.GetFileNameWithoutExtension(context.assetPath);
|
||||
context.AddObjectToAsset("data", data);
|
||||
|
||||
var prefab = CreatePrefab(data);
|
||||
context.AddObjectToAsset("prefab", prefab);
|
||||
context.SetMainObject(prefab);
|
||||
}
|
||||
|
||||
private GameObject CreatePrefab(SplatData data)
|
||||
{
|
||||
var go = new GameObject();
|
||||
var vfx = go.AddComponent<VisualEffect>();
|
||||
vfx.visualEffectAsset = EditorResources.Load<VisualEffectAsset>(DefaultVfxPath);
|
||||
|
||||
var binderBase = go.AddComponent<VFXPropertyBinder>();
|
||||
var binder = binderBase.AddPropertyBinder<VFXSplatDataBinder>();
|
||||
|
||||
binder.SplatData = data;
|
||||
|
||||
return go;
|
||||
}
|
||||
|
||||
const int MAX_CHUNK_SIZE = 1048576 * 256; // 256MiB
|
||||
|
||||
private enum TypeEnum
|
||||
{
|
||||
None, Float32, Float64, Float16, Int8, UInt8, Char, Short, UInt16
|
||||
}
|
||||
|
||||
private enum DataEnum
|
||||
{
|
||||
x, y, z, f_dc_0, f_dc_1, f_dc_2, f_rest_0, f_rest_1, f_rest_2,
|
||||
f_rest_3, f_rest_4, f_rest_5, f_rest_6, f_rest_7, f_rest_8,
|
||||
f_rest_9, f_rest_10, f_rest_11, f_rest_12, f_rest_13, f_rest_14,
|
||||
f_rest_15, f_rest_16, f_rest_17, f_rest_18, f_rest_19, f_rest_20,
|
||||
f_rest_21, f_rest_22, f_rest_23, f_rest_24, f_rest_25, f_rest_26,
|
||||
f_rest_27, f_rest_28, f_rest_29, f_rest_30, f_rest_31, f_rest_32,
|
||||
f_rest_33, f_rest_34, f_rest_35, f_rest_36, f_rest_37, f_rest_38,
|
||||
f_rest_39, f_rest_40, f_rest_41, f_rest_42, f_rest_43, f_rest_44,
|
||||
opacity, scale_0, scale_1, scale_2, rot_0, rot_1, rot_2, rot_3
|
||||
}
|
||||
|
||||
private static readonly Dictionary<TypeEnum, int> TypeToByteLengths =
|
||||
new()
|
||||
{
|
||||
{ TypeEnum.Float32, 4 },
|
||||
{ TypeEnum.Float64, 8 },
|
||||
{ TypeEnum.Float16, 2 }, // keeping this here to support half precision floats in the future
|
||||
{ TypeEnum.UInt8, 1 },
|
||||
{ TypeEnum.Int8, 1 }
|
||||
};
|
||||
|
||||
private static readonly Dictionary<string, TypeEnum> TypeMappings =
|
||||
new()
|
||||
{
|
||||
{ "float", TypeEnum.Float32 },
|
||||
{ "double", TypeEnum.Float64 },
|
||||
{ "uint8", TypeEnum.UInt8 },
|
||||
{ "int8", TypeEnum.Int8 }
|
||||
};
|
||||
|
||||
private struct HeaderData
|
||||
{
|
||||
public uint NumElements;
|
||||
public uint BinaryDataStartOffset;
|
||||
public NativeArray<int> ElementByteOffsets;
|
||||
public NativeArray<int> ElementTypes;
|
||||
public int BytesPerElement;
|
||||
|
||||
public HeaderData(int count)
|
||||
{
|
||||
NumElements = 0;
|
||||
BinaryDataStartOffset = 0;
|
||||
ElementByteOffsets = new NativeArray<int>(count, Allocator.Persistent);
|
||||
ElementTypes = new NativeArray<int>(count, Allocator.Persistent);
|
||||
BytesPerElement = 0;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
ElementByteOffsets.Dispose();
|
||||
ElementTypes.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
private static (string headerString, int endHeaderPosition) GetHeader(string filePath)
|
||||
{
|
||||
using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
|
||||
using var reader = new StreamReader(fileStream);
|
||||
|
||||
var headerBuilder = new StringBuilder();
|
||||
string line;
|
||||
|
||||
while ((line = reader.ReadLine()) != null)
|
||||
{
|
||||
headerBuilder.AppendLine(line);
|
||||
if (line.Trim() == "end_header")
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Old logic that works because AppendLine adds another \n
|
||||
// TODO: Fix this logic
|
||||
int endHeaderPosition = headerBuilder.Length - headerBuilder.ToString().Split('\n').Length + 1;
|
||||
Debug.Log($"Total filesize: {fileStream.Length}");
|
||||
Debug.Log($"Byte stream start position: {endHeaderPosition}");
|
||||
|
||||
return (headerBuilder.ToString(), endHeaderPosition);
|
||||
}
|
||||
|
||||
private static HeaderData ParseMetadata(string headerString)
|
||||
{
|
||||
HeaderData result = new(59);
|
||||
string line;
|
||||
|
||||
using var reader = new StringReader(headerString);
|
||||
|
||||
while ((line = reader.ReadLine()) != null)
|
||||
{
|
||||
if (line.Trim() == "end_header")
|
||||
break;
|
||||
|
||||
var strings = line.Split(" ");
|
||||
|
||||
switch (strings.FirstOrDefault())
|
||||
{
|
||||
case "element":
|
||||
result.NumElements = uint.Parse(strings[2]);
|
||||
break;
|
||||
|
||||
case "property":
|
||||
TypeEnum dataType = TypeMappings[strings[1]];
|
||||
|
||||
// If in DataEnum, store byte offset and type
|
||||
if (DataEnum.TryParse(strings[2], out DataEnum dataName))
|
||||
{
|
||||
int ix = (int)dataName;
|
||||
result.ElementByteOffsets[ix] = result.BytesPerElement;
|
||||
result.ElementTypes[ix] = (int)dataType;
|
||||
}
|
||||
|
||||
result.BytesPerElement += TypeToByteLengths[dataType];
|
||||
break;
|
||||
}
|
||||
}
|
||||
Debug.Log($"Bytes per Element: {result.BytesPerElement}");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
[BurstCompile]
|
||||
private struct SplatDataNative
|
||||
{
|
||||
public NativeArray<float3> position;
|
||||
public NativeArray<float3> color;
|
||||
public NativeArray<float> sh;
|
||||
public NativeArray<float> opacity;
|
||||
public NativeArray<float3> scale;
|
||||
public NativeArray<float4> rotation;
|
||||
|
||||
public SplatDataNative(int count)
|
||||
{
|
||||
position = new NativeArray<float3>(count, Allocator.Persistent);
|
||||
color = new NativeArray<float3>(count, Allocator.Persistent);
|
||||
sh = new NativeArray<float>(count * 45, Allocator.Persistent);
|
||||
opacity = new NativeArray<float>(count, Allocator.Persistent);
|
||||
scale = new NativeArray<float3>(count, Allocator.Persistent);
|
||||
rotation = new NativeArray<float4>(count, Allocator.Persistent);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
position.Dispose();
|
||||
color.Dispose();
|
||||
sh.Dispose();
|
||||
opacity.Dispose();
|
||||
scale.Dispose();
|
||||
rotation.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
private static SplatData ImportData(HeaderData headerData, string filePath, int endHeaderPosition)
|
||||
{
|
||||
var splatData = ScriptableObject.CreateInstance<SplatData>();
|
||||
|
||||
splatData.PositionArray = new Vector3[headerData.NumElements];
|
||||
splatData.ScaleArray = new Vector3[headerData.NumElements];
|
||||
splatData.RotationArray = new Quaternion[headerData.NumElements];
|
||||
splatData.ColorArray = new Color[headerData.NumElements];
|
||||
splatData.OpacityArray = new float[headerData.NumElements];
|
||||
splatData.SHArray = new float[headerData.NumElements * 45];
|
||||
|
||||
int elementsPerChunk = Mathf.Min(
|
||||
MAX_CHUNK_SIZE / headerData.BytesPerElement,
|
||||
(int)headerData.NumElements
|
||||
);
|
||||
int chunkSize = elementsPerChunk * headerData.BytesPerElement;
|
||||
|
||||
// Debug.Log($"Elements per chunk: {elementsPerChunk}");
|
||||
// Debug.Log($"Chunk size: {chunkSize}");
|
||||
|
||||
using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
|
||||
fileStream.Seek(endHeaderPosition, SeekOrigin.Begin);
|
||||
|
||||
int totalBytes = (int)fileStream.Length - endHeaderPosition;
|
||||
// Debug.Log($"Total bytes: {totalBytes}");
|
||||
|
||||
var splatDataNative = new SplatDataNative(elementsPerChunk);
|
||||
var chunkBuffer = new NativeArray<byte>(chunkSize, Allocator.Persistent);
|
||||
var chunkBufferSpan = MemoryMarshal.AsBytes<byte>(chunkBuffer);
|
||||
int numBytesRead;
|
||||
int numElemsRead;
|
||||
int totalElemsRead = 0;
|
||||
|
||||
while ((numBytesRead = fileStream.Read(chunkBufferSpan)) > 0)
|
||||
{
|
||||
numElemsRead = numBytesRead / headerData.BytesPerElement;
|
||||
var splatElementJob = new SplatElementJob
|
||||
{
|
||||
chunkBytes = chunkBuffer,
|
||||
splatDataNative = splatDataNative,
|
||||
headerData = headerData,
|
||||
totalElemsRead = totalElemsRead,
|
||||
numElemsRead = numElemsRead
|
||||
};
|
||||
|
||||
splatElementJob.Schedule().Complete();
|
||||
|
||||
for (int i = 0; i < numElemsRead; i++)
|
||||
{
|
||||
splatData.PositionArray[totalElemsRead + i] = splatDataNative.position[i];
|
||||
splatData.ColorArray[totalElemsRead + i].r = splatDataNative.color[i].x;
|
||||
splatData.ColorArray[totalElemsRead + i].g = splatDataNative.color[i].y;
|
||||
splatData.ColorArray[totalElemsRead + i].b = splatDataNative.color[i].z;
|
||||
splatData.OpacityArray[totalElemsRead + i] = splatDataNative.opacity[i];
|
||||
splatData.ScaleArray[totalElemsRead + i] = splatDataNative.scale[i];
|
||||
splatData.RotationArray[totalElemsRead + i] = new quaternion(splatDataNative.rotation[i]);
|
||||
for (int j = 0; j < 45; j++)
|
||||
{
|
||||
splatData.SHArray[(totalElemsRead + i) * 45 + j] = splatDataNative.sh[i * 45 + j];
|
||||
}
|
||||
}
|
||||
|
||||
totalElemsRead += numElemsRead;
|
||||
// Debug.Log($"Current Elements Read: {totalElemsRead}");
|
||||
}
|
||||
|
||||
// Debug.Log($"First position Vector3: {splatData.PositionArray[0]}");
|
||||
|
||||
headerData.Dispose();
|
||||
splatDataNative.Dispose();
|
||||
chunkBuffer.Dispose();
|
||||
|
||||
splatData.ReleaseGpuResources();
|
||||
|
||||
return splatData;
|
||||
}
|
||||
|
||||
[BurstCompile]
|
||||
private struct SplatElementJob : IJob
|
||||
{
|
||||
public NativeArray<byte> chunkBytes;
|
||||
public SplatDataNative splatDataNative;
|
||||
[ReadOnly] public HeaderData headerData;
|
||||
[ReadOnly] public int totalElemsRead;
|
||||
[ReadOnly] public int numElemsRead;
|
||||
|
||||
public void Execute()
|
||||
{
|
||||
for (int i = 0; i < numElemsRead; i++)
|
||||
{
|
||||
int elemIx = i;
|
||||
int start = elemIx * headerData.BytesPerElement;
|
||||
|
||||
splatDataNative.position[elemIx] = new()
|
||||
{
|
||||
x = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.x]),
|
||||
y = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.y]),
|
||||
z = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.z])
|
||||
};
|
||||
|
||||
float3 color = new()
|
||||
{
|
||||
x = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.f_dc_0]),
|
||||
y = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.f_dc_1]),
|
||||
z = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.f_dc_2])
|
||||
};
|
||||
color = 0.5f + color * SH_C0;
|
||||
splatDataNative.color[elemIx] = color;
|
||||
|
||||
for (int j = 0; j < 45; j++)
|
||||
{
|
||||
splatDataNative.sh[elemIx * 45 + j] = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.f_rest_0 + j]);
|
||||
}
|
||||
|
||||
float opacity = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.opacity]);
|
||||
opacity = 1 / (1 + math.exp(-opacity));
|
||||
splatDataNative.opacity[elemIx] = opacity;
|
||||
|
||||
float3 scale = new()
|
||||
{
|
||||
x = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.scale_0]),
|
||||
y = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.scale_1]),
|
||||
z = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.scale_2])
|
||||
};
|
||||
scale = math.exp(scale);
|
||||
splatDataNative.scale[elemIx] = scale;
|
||||
|
||||
splatDataNative.rotation[elemIx] = new()
|
||||
{
|
||||
w = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.rot_0]),
|
||||
x = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.rot_1]),
|
||||
y = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.rot_2]),
|
||||
z = chunkBytes.ReinterpretLoad<float>(start + headerData.ElementByteOffsets[(int)DataEnum.rot_3])
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class SimpleSpin : MonoBehaviour
|
||||
{
|
||||
[Header("Rotation Settings")]
|
||||
[Tooltip("Rotation speed in degrees per second")]
|
||||
[Range(-200f, 200f)]
|
||||
public float rotationSpeed = 10f;
|
||||
|
||||
[Tooltip("Rotation axis (X, Y, Z components)")]
|
||||
public Vector3 rotationAxis = Vector3.up;
|
||||
|
||||
[Tooltip("Rotate in local or world space")]
|
||||
public bool useLocalRotation = true;
|
||||
|
||||
[Header("Advanced Options")]
|
||||
[Tooltip("Enable rotation on this script")]
|
||||
public bool enableRotation = true;
|
||||
|
||||
void Start()
|
||||
{
|
||||
if (rotationAxis == Vector3.zero)
|
||||
rotationAxis = Vector3.up;
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (!enableRotation)
|
||||
return;
|
||||
|
||||
float rotationAmount = rotationSpeed * Time.deltaTime;
|
||||
|
||||
if (useLocalRotation)
|
||||
transform.Rotate(rotationAxis, rotationAmount, Space.Self);
|
||||
else
|
||||
transform.Rotate(rotationAxis, rotationAmount, Space.World);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 536715a2510f9db4883a1cd9d1bf11ef
|
||||
@@ -1,328 +0,0 @@
|
||||
using Unity.Burst;
|
||||
using Unity.Mathematics;
|
||||
using UnityEngine;
|
||||
using UnityEngine.VFX;
|
||||
using UnityEngine.VFX.Utility;
|
||||
using UnityEditor;
|
||||
using UnityEditor.AssetImporters;
|
||||
using UnityEditor.Experimental;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using UnityEditor.Rendering.LookDev;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using Unity.VectorGraphics;
|
||||
using Unity.VisualScripting;
|
||||
using System.Collections;
|
||||
using Unity.Collections;
|
||||
using UnityEditor.Experimental.GraphView;
|
||||
|
||||
/*******************************************************************************
|
||||
TODO:
|
||||
1. Move header parsing to ParsePLYFile
|
||||
2. Improve exception reporting and handling
|
||||
3. Use Burst compiler for parsing binary data
|
||||
4. If we can reasonably assume that items are contigious (e.g. position)
|
||||
use MemoryMarshal
|
||||
5. Use a struct for header_info
|
||||
6. Write handler for data other than 32 bit float
|
||||
7. Pass around Span<byte> instead of byte[] for memory safety
|
||||
8. Implement opacity clamping in the VFX Graph
|
||||
*******************************************************************************/
|
||||
|
||||
namespace SplatVfx.Editor
|
||||
{
|
||||
|
||||
[ScriptedImporter(1, "ply"), BurstCompile]
|
||||
public sealed class SplatImporter : ScriptedImporter
|
||||
{
|
||||
const float SH_C0 = 0.28209479177387814f;
|
||||
|
||||
#region ScriptedImporter implementation
|
||||
|
||||
[BurstCompile]
|
||||
public override void OnImportAsset(AssetImportContext context)
|
||||
{
|
||||
var ply = ParsePLYFile(context.assetPath);
|
||||
var header_info = ParseHeader(ply.header);
|
||||
|
||||
var data = ImportAsSplatData(header_info, ply.binaryData);
|
||||
data.name = Path.GetFileNameWithoutExtension(context.assetPath);
|
||||
context.AddObjectToAsset("data", data);
|
||||
|
||||
var prefab = CreatePrefab(data);
|
||||
context.AddObjectToAsset("prefab", prefab);
|
||||
context.SetMainObject(prefab);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Prefab construction
|
||||
|
||||
const string DefaultVfxPath = "Assets/vfx-graph-gs/SplatVFX.vfx";
|
||||
|
||||
[BurstCompile]
|
||||
GameObject CreatePrefab(SplatData data)
|
||||
{
|
||||
var go = new GameObject();
|
||||
var vfx = go.AddComponent<VisualEffect>();
|
||||
vfx.visualEffectAsset = EditorResources.Load<VisualEffectAsset>(DefaultVfxPath);
|
||||
|
||||
var binderBase = go.AddComponent<VFXPropertyBinder>();
|
||||
var binder = binderBase.AddPropertyBinder<VFXSplatDataBinder>();
|
||||
|
||||
binder.SplatData = data;
|
||||
|
||||
return go;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Reader implementation
|
||||
|
||||
[BurstCompile]
|
||||
(string header, byte[] binaryData) ParsePLYFile(string filePath)
|
||||
{
|
||||
using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
|
||||
using var reader = new StreamReader(fileStream);
|
||||
|
||||
var headerBuilder = new StringBuilder();
|
||||
string line;
|
||||
|
||||
while ((line = reader.ReadLine()) != null)
|
||||
{
|
||||
headerBuilder.AppendLine(line);
|
||||
if (line.Trim() == "end_header")
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
long endHeaderPosition = headerBuilder.Length - headerBuilder.ToString().Split('\n').Length + 1;
|
||||
fileStream.Seek(endHeaderPosition, SeekOrigin.Begin);
|
||||
|
||||
var binaryReader = new BinaryReader(fileStream);
|
||||
var binaryData = binaryReader.ReadBytes((int)(fileStream.Length - endHeaderPosition));
|
||||
|
||||
return (headerBuilder.ToString(), binaryData);
|
||||
}
|
||||
|
||||
[BurstCompile]
|
||||
(string format, int num_element, List<(string, string)> properties)
|
||||
ParseHeader(string header)
|
||||
{
|
||||
using var reader = new StringReader(header);
|
||||
string line;
|
||||
|
||||
string format = "";
|
||||
int num_element = 0;
|
||||
var properties = new List<(string, string)>();
|
||||
|
||||
while ((line = reader.ReadLine()) != null)
|
||||
{
|
||||
if (line.StartsWith("end_header"))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
var strings = line.Split(" ");
|
||||
|
||||
switch (strings.FirstOrDefault())
|
||||
{
|
||||
case "format":
|
||||
format = strings[1];
|
||||
|
||||
break;
|
||||
|
||||
case "element":
|
||||
num_element = int.Parse(strings[2]);
|
||||
|
||||
break;
|
||||
|
||||
case "property":
|
||||
properties.Add((strings[2].Trim(), strings[1].Trim()));
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (format, num_element, properties);
|
||||
}
|
||||
|
||||
[BurstCompile]
|
||||
SplatData ImportAsSplatData((string format, int num_element, List<(string, string)> properties) header_info, byte[] binaryData)
|
||||
{
|
||||
var splatData = ScriptableObject.CreateInstance<SplatData>();
|
||||
|
||||
var stream = new MemoryStream(binaryData);
|
||||
var reader = new BinaryReader(stream);
|
||||
|
||||
splatData.PositionArray = new Vector3[header_info.num_element];
|
||||
splatData.ScaleArray = new Vector3[header_info.num_element];
|
||||
splatData.RotationArray = new Quaternion[header_info.num_element];
|
||||
splatData.ColorArray = new Color[header_info.num_element];
|
||||
splatData.OpacityArray = new float[header_info.num_element];
|
||||
splatData.SHArray = new float[header_info.num_element * 45];
|
||||
|
||||
for (int i = 0; i < header_info.num_element; i++)
|
||||
{
|
||||
foreach ((string name, string dtype) property in header_info.properties)
|
||||
{
|
||||
float val = reader.ReadSingle();
|
||||
|
||||
switch (property.name)
|
||||
{
|
||||
case "x":
|
||||
splatData.PositionArray[i].x = val;
|
||||
|
||||
break;
|
||||
|
||||
case "y":
|
||||
splatData.PositionArray[i].y = val;
|
||||
|
||||
break;
|
||||
|
||||
case "z":
|
||||
splatData.PositionArray[i].z = val;
|
||||
|
||||
break;
|
||||
|
||||
case "opacity":
|
||||
splatData.OpacityArray[i] = 1 / (1 + math.exp(-val));
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
if (property.name.StartsWith("f_dc"))
|
||||
{
|
||||
switch (property.name[5])
|
||||
{
|
||||
case '0':
|
||||
splatData.ColorArray[i].r = 0.5f + val * SH_C0;
|
||||
|
||||
break;
|
||||
|
||||
case '1':
|
||||
splatData.ColorArray[i].g = 0.5f + val * SH_C0;
|
||||
|
||||
break;
|
||||
|
||||
case '2':
|
||||
splatData.ColorArray[i].b = 0.5f + val * SH_C0;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
else if (property.name.StartsWith("scale"))
|
||||
{
|
||||
switch (property.name[6])
|
||||
{
|
||||
case '0':
|
||||
splatData.ScaleArray[i].x = math.exp(val);
|
||||
|
||||
break;
|
||||
|
||||
case '1':
|
||||
splatData.ScaleArray[i].y = math.exp(val);
|
||||
|
||||
break;
|
||||
|
||||
case '2':
|
||||
splatData.ScaleArray[i].z = math.exp(val);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
else if (property.name.StartsWith("rot"))
|
||||
{
|
||||
switch (property.name[4])
|
||||
{
|
||||
case '0':
|
||||
splatData.RotationArray[i].w = val;
|
||||
|
||||
break;
|
||||
|
||||
case '1':
|
||||
splatData.RotationArray[i].x = val;
|
||||
|
||||
break;
|
||||
|
||||
case '2':
|
||||
splatData.RotationArray[i].y = val;
|
||||
|
||||
break;
|
||||
|
||||
case '3':
|
||||
splatData.RotationArray[i].z = val;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
splatData.ReleaseGpuResources();
|
||||
|
||||
return splatData;
|
||||
}
|
||||
|
||||
// struct ReadData
|
||||
// {
|
||||
// public float px, py, pz;
|
||||
// public float sx, sy, sz;
|
||||
// public byte r, g, b, a;
|
||||
// public byte rw, rx, ry, rz;
|
||||
// }
|
||||
|
||||
// (Vector3[] position, Vector3[] axis, Color[] color)
|
||||
// LoadDataArrays(string path)
|
||||
// {
|
||||
// var bytes = (Span<byte>)File.ReadAllBytes(path);
|
||||
// var count = bytes.Length / 32;
|
||||
|
||||
// var source = MemoryMarshal.Cast<byte, ReadData>(bytes);
|
||||
|
||||
// var position = new Vector3[count];
|
||||
// var axis = new Vector3[count * 3];
|
||||
// var color = new Color[count];
|
||||
|
||||
// for (var i = 0; i < count; i++)
|
||||
// ParseReadData(source[i],
|
||||
// out position[i],
|
||||
// out axis[i * 3],
|
||||
// out axis[i * 3 + 1],
|
||||
// out axis[i * 3 + 2],
|
||||
// out color[i]);
|
||||
|
||||
// return (position, axis, color);
|
||||
// }
|
||||
|
||||
// [BurstCompile]
|
||||
// void ParseReadData(in ReadData src,
|
||||
// out Vector3 position,
|
||||
// out Vector3 axis1,
|
||||
// out Vector3 axis2,
|
||||
// out Vector3 axis3,
|
||||
// out Color color)
|
||||
// {
|
||||
// var rv = (math.float4(src.rx, src.ry, src.rz, src.rw) - 128) / 128;
|
||||
// var q = math.quaternion(-rv.x, -rv.y, rv.z, rv.w);
|
||||
// position = math.float3(src.px, src.py, -src.pz);
|
||||
// axis1 = math.mul(q, math.float3(src.sx, 0, 0));
|
||||
// axis2 = math.mul(q, math.float3(0, src.sy, 0));
|
||||
// axis3 = math.mul(q, math.float3(0, 0, src.sz));
|
||||
// color = (Vector4)math.float4(src.r, src.g, src.b, src.a) / 255;
|
||||
// }
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
} // namespace SplatVfx.Editor
|
||||
+1630
-897
File diff suppressed because it is too large
Load Diff
@@ -1,15 +1,18 @@
|
||||
#define sh(i) (float3)SHBuffer.Load3(Index * 45 + (i - 1) * 15)
|
||||
|
||||
const float SH_C0 = 0.28209479177387814f;
|
||||
const float SH_C1 = 0.4886025119029199f;
|
||||
const float SH_C2[] = {
|
||||
/// Index: The splat's index
|
||||
/// Degrees: The degrees of spherical harmonics to calculate
|
||||
/// DirClr: A 4x4 matrix with the first row containing a vector from the splat position to the camera, and the second row containing its base color
|
||||
/// SHBuffer: The spherical harmonics buffer from a SplatData object
|
||||
float3 CalculateSHColor(uint Index, uint Degrees, float4x4 DirClr, StructuredBuffer<float> SHBuffer) {
|
||||
const float SH_C0 = 0.28209479177387814f;
|
||||
const float SH_C1 = 0.4886025119029199f;
|
||||
const float SH_C2[] = {
|
||||
1.0925484305920792f,
|
||||
-1.0925484305920792f,
|
||||
0.31539156525252005f,
|
||||
-1.0925484305920792f,
|
||||
0.5462742152960396f
|
||||
};
|
||||
const float SH_C3[] = {
|
||||
};
|
||||
const float SH_C3[] = {
|
||||
-0.5900435899266435f,
|
||||
2.890611442640554f,
|
||||
-0.4570457994644658f,
|
||||
@@ -17,41 +20,54 @@ const float SH_C3[] = {
|
||||
-0.4570457994644658f,
|
||||
1.445305721320277f,
|
||||
-0.5900435899266435f
|
||||
};
|
||||
};
|
||||
|
||||
// float3 CalculateSHColor(uint Index, uint Degrees, float3 Direction, StructuredBuffer<float3> SHBuffer) {
|
||||
float3 CalculateSHColor(uint Index, uint Degrees, float4x4 DirClr, ByteAddressBuffer SHBuffer) {
|
||||
float3 dir = DirClr[0].xyz;
|
||||
float3 result = DirClr[1].xyz;
|
||||
|
||||
float3 sh[16];
|
||||
|
||||
// for (int i = 1; i < 16; i++)
|
||||
// {
|
||||
// sh[i].x = SHBuffer[Index * 45 + (i - 1) * 3];
|
||||
// sh[i].y = SHBuffer[Index * 45 + (i - 1) * 3 + 1];
|
||||
// sh[i].z = SHBuffer[Index * 45 + (i - 1) * 3 + 2];
|
||||
// }
|
||||
for (int i = 1; i < 16; i++)
|
||||
{
|
||||
sh[i].x = SHBuffer[Index * 45 + (i - 1)];
|
||||
sh[i].y = SHBuffer[Index * 45 + 15 + (i - 1)];
|
||||
sh[i].z = SHBuffer[Index * 45 + 30 + (i - 1)];
|
||||
}
|
||||
|
||||
if (Degrees > 0)
|
||||
{
|
||||
float x = dir.x;
|
||||
float y = dir.y;
|
||||
float z = dir.z;
|
||||
result = result - SH_C1 * y * sh(1) + SH_C1 * z * sh(2) - SH_C1 * x * sh(3);
|
||||
result = result - SH_C1 * y * sh[1] + SH_C1 * z * sh[2] - SH_C1 * x * sh[3];
|
||||
|
||||
if (Degrees > 1)
|
||||
{
|
||||
float xx = x * x, yy = y * y, zz = z * z;
|
||||
float xy = x * y, yz = y * z, xz = x * z;
|
||||
result = result +
|
||||
SH_C2[0] * xy * sh(4) +
|
||||
SH_C2[1] * yz * sh(5) +
|
||||
SH_C2[2] * (2.0f * zz - xx - yy) * sh(6) +
|
||||
SH_C2[3] * xz * sh(7) +
|
||||
SH_C2[4] * (xx - yy) * sh(8);
|
||||
SH_C2[0] * xy * sh[4] +
|
||||
SH_C2[1] * yz * sh[5] +
|
||||
SH_C2[2] * (2.0f * zz - xx - yy) * sh[6] +
|
||||
SH_C2[3] * xz * sh[7] +
|
||||
SH_C2[4] * (xx - yy) * sh[8];
|
||||
|
||||
if (Degrees > 2)
|
||||
{
|
||||
result = result +
|
||||
SH_C3[0] * y * (3.0f * xx - yy) * sh(9) +
|
||||
SH_C3[1] * xy * z * sh(10) +
|
||||
SH_C3[2] * y * (4.0f * zz - xx - yy) * sh(11) +
|
||||
SH_C3[3] * z * (2.0f * zz - 3.0f * xx - 3.0f * yy) * sh(12) +
|
||||
SH_C3[4] * x * (4.0f * zz - xx - yy) * sh(13) +
|
||||
SH_C3[5] * z * (xx - yy) * sh(14) +
|
||||
SH_C3[6] * x * (xx - 3.0f * yy) * sh(15);
|
||||
SH_C3[0] * y * (3.0f * xx - yy) * sh[9] +
|
||||
SH_C3[1] * xy * z * sh[10] +
|
||||
SH_C3[2] * y * (4.0f * zz - xx - yy) * sh[11] +
|
||||
SH_C3[3] * z * (2.0f * zz - 3.0f * xx - 3.0f * yy) * sh[12] +
|
||||
SH_C3[4] * x * (4.0f * zz - xx - yy) * sh[13] +
|
||||
SH_C3[5] * z * (xx - yy) * sh[14] +
|
||||
SH_C3[6] * x * (xx - 3.0f * yy) * sh[15];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -60,6 +76,8 @@ float3 CalculateSHColor(uint Index, uint Degrees, float4x4 DirClr, ByteAddressBu
|
||||
}
|
||||
|
||||
/*
|
||||
> Reference taken from the original Gaussian splatting paper code
|
||||
|
||||
// The implementation is loosely based on code for
|
||||
// "Differentiable Point-Based Radiance Fields for
|
||||
// Efficient View Synthesis" by Zhang et al. (2022)
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
/// Hidden
|
||||
float CrossProduct(float2 A, float2 B)
|
||||
{
|
||||
return A.x * B.y - A.y * B.x;
|
||||
}
|
||||
|
||||
/// Hidden
|
||||
float SweepArea(float2 A, float2 B)
|
||||
{
|
||||
return abs(CrossProduct(A, B));
|
||||
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 Rafael Formoso
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"com.unity.cinemachine": "3.1.6",
|
||||
"com.unity.ide.visualstudio": "2.0.27",
|
||||
"com.unity.inputsystem": "1.18.0",
|
||||
"com.unity.render-pipelines.universal": "17.3.0",
|
||||
@@ -9,7 +10,6 @@
|
||||
"com.unity.visualeffectgraph": "17.3.0",
|
||||
"com.unity.visualscripting": "1.9.10",
|
||||
"com.unity.modules.accessibility": "1.0.0",
|
||||
"com.unity.modules.adaptiveperformance": "1.0.0",
|
||||
"com.unity.modules.ai": "1.0.0",
|
||||
"com.unity.modules.androidjni": "1.0.0",
|
||||
"com.unity.modules.animation": "1.0.0",
|
||||
|
||||
@@ -10,6 +10,16 @@
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.cinemachine": {
|
||||
"version": "3.1.6",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.splines": "2.0.0",
|
||||
"com.unity.modules.imgui": "1.0.0"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.collections": {
|
||||
"version": "2.6.2",
|
||||
"depth": 2,
|
||||
@@ -100,6 +110,13 @@
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.settings-manager": {
|
||||
"version": "2.1.1",
|
||||
"depth": 2,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.shadergraph": {
|
||||
"version": "17.3.0",
|
||||
"depth": 1,
|
||||
@@ -109,6 +126,17 @@
|
||||
"com.unity.searcher": "4.9.3"
|
||||
}
|
||||
},
|
||||
"com.unity.splines": {
|
||||
"version": "2.8.2",
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.mathematics": "1.2.1",
|
||||
"com.unity.modules.imgui": "1.0.0",
|
||||
"com.unity.settings-manager": "1.0.3"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.test-framework": {
|
||||
"version": "1.6.0",
|
||||
"depth": 0,
|
||||
@@ -175,14 +203,6 @@
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.adaptiveperformance": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.subsystems": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.ai": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
|
||||
@@ -6,8 +6,8 @@ EditorBuildSettings:
|
||||
serializedVersion: 2
|
||||
m_Scenes:
|
||||
- enabled: 1
|
||||
path: Assets/Scenes/SampleScene.unity
|
||||
guid: 99c9720ab356a0642a771bea13969a05
|
||||
path: Assets/vfx-graph-gs/Main.unity
|
||||
guid: 09fad7c6f4d48844d9510f9903fca619
|
||||
m_configObjects:
|
||||
com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3}
|
||||
m_UseUCBPForAssetBundles: 0
|
||||
|
||||
@@ -61,7 +61,7 @@ GraphicsSettings:
|
||||
UnityEngine.Rendering.Universal.UniversalRenderPipeline: {fileID: 11400000, guid: 18dc0cd2c080841dea60987a38ce93fa, type: 2}
|
||||
m_ShaderBuildSettings:
|
||||
keywordDeclarationOverrides: []
|
||||
m_LightsUseLinearIntensity: 1
|
||||
m_LightsUseLinearIntensity: 0
|
||||
m_LightsUseColorTemperature: 1
|
||||
m_LogWhenShaderIsCompiled: 0
|
||||
m_LightProbeOutsideHullStrategy: 0
|
||||
|
||||
@@ -12,11 +12,13 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_EnablePreviewPackages: 0
|
||||
m_EnablePackageDependencies: 0
|
||||
m_EnablePreReleasePackages: 0
|
||||
m_AdvancedSettingsExpanded: 1
|
||||
m_ScopedRegistriesSettingsExpanded: 1
|
||||
oneTimeWarningShown: 0
|
||||
m_SeeAllPackageVersions: 0
|
||||
m_DismissPreviewPackagesInUse: 0
|
||||
oneTimeWarningShown: 1
|
||||
oneTimePackageErrorsPopUpShown: 0
|
||||
m_Registries:
|
||||
- m_Id: main
|
||||
m_Name:
|
||||
@@ -24,20 +26,15 @@ MonoBehaviour:
|
||||
m_Scopes: []
|
||||
m_IsDefault: 1
|
||||
m_Capabilities: 7
|
||||
m_ConfigSource: 0
|
||||
m_Compliance:
|
||||
m_Status: 0
|
||||
m_Violations: []
|
||||
m_UserSelectedRegistryName:
|
||||
m_UserAddingNewScopedRegistry: 0
|
||||
m_RegistryInfoDraft:
|
||||
m_ErrorMessage:
|
||||
m_Original:
|
||||
m_Id:
|
||||
m_Name:
|
||||
m_Url:
|
||||
m_Scopes: []
|
||||
m_IsDefault: 0
|
||||
m_Capabilities: 0
|
||||
m_Modified: 0
|
||||
m_Name:
|
||||
m_Url:
|
||||
m_Scopes:
|
||||
-
|
||||
m_SelectedScopeIndex: 0
|
||||
m_ErrorMessage:
|
||||
m_UserModificationsInstanceId: -900
|
||||
m_OriginalInstanceId: -902
|
||||
m_LoadAssets: 0
|
||||
|
||||
@@ -12,13 +12,13 @@ PlayerSettings:
|
||||
targetDevice: 2
|
||||
useOnDemandResources: 0
|
||||
accelerometerFrequency: 60
|
||||
companyName: DefaultCompany
|
||||
companyName: rsformoso
|
||||
productName: vfx-graph-gs
|
||||
defaultCursor: {fileID: 0}
|
||||
cursorHotspot: {x: 0, y: 0}
|
||||
m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}
|
||||
m_ShowUnitySplashScreen: 1
|
||||
m_ShowUnitySplashLogo: 1
|
||||
m_ShowUnitySplashScreen: 0
|
||||
m_ShowUnitySplashLogo: 0
|
||||
m_SplashScreenOverlayOpacity: 1
|
||||
m_SplashScreenAnimation: 1
|
||||
m_SplashScreenLogoStyle: 1
|
||||
@@ -47,7 +47,7 @@ PlayerSettings:
|
||||
defaultScreenWidthWeb: 960
|
||||
defaultScreenHeightWeb: 600
|
||||
m_StereoRenderingPath: 0
|
||||
m_ActiveColorSpace: 1
|
||||
m_ActiveColorSpace: 0
|
||||
unsupportedMSAAFallback: 0
|
||||
m_SpriteBatchMaxVertexCount: 65535
|
||||
m_SpriteBatchVertexThreshold: 300
|
||||
@@ -143,8 +143,9 @@ PlayerSettings:
|
||||
loadStoreDebugModeEnabled: 0
|
||||
visionOSBundleVersion: 1.0
|
||||
tvOSBundleVersion: 1.0
|
||||
bundleVersion: 0.1.0
|
||||
preloadedAssets: []
|
||||
bundleVersion: 0.0.0-prototype
|
||||
preloadedAssets:
|
||||
- {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3}
|
||||
metroInputSource: 0
|
||||
wsaTransparentSwapchain: 0
|
||||
m_HolographicPauseOnTrackingLoss: 1
|
||||
@@ -524,7 +525,10 @@ PlayerSettings:
|
||||
m_Height: 720
|
||||
m_Kind: 1
|
||||
m_SubKind:
|
||||
m_BuildTargetBatching: []
|
||||
m_BuildTargetBatching:
|
||||
- m_BuildTarget: WebGL
|
||||
m_StaticBatching: 0
|
||||
m_DynamicBatching: 0
|
||||
m_BuildTargetShaderSettings: []
|
||||
m_BuildTargetGraphicsJobs: []
|
||||
m_BuildTargetGraphicsJobMode: []
|
||||
@@ -535,6 +539,9 @@ PlayerSettings:
|
||||
- m_BuildTarget: AndroidPlayer
|
||||
m_APIs: 150000000b000000
|
||||
m_Automatic: 0
|
||||
- m_BuildTarget: WebGLSupport
|
||||
m_APIs: 1c0000000b000000
|
||||
m_Automatic: 0
|
||||
m_BuildTargetVRSettings: []
|
||||
m_DefaultShaderChunkSizeInMB: 16
|
||||
m_DefaultShaderChunkCount: 0
|
||||
@@ -560,6 +567,9 @@ PlayerSettings:
|
||||
- serializedVersion: 3
|
||||
m_BuildTarget: Android
|
||||
m_Formats: 03000000
|
||||
- serializedVersion: 3
|
||||
m_BuildTarget: WebGL
|
||||
m_Formats: 05000000
|
||||
playModeTestRunnerEnabled: 0
|
||||
runPlayModeTestAsEditModeTest: 0
|
||||
actionOnDotNetUnhandledException: 1
|
||||
@@ -812,14 +822,14 @@ PlayerSettings:
|
||||
webGLWasmArithmeticExceptions: 0
|
||||
webGLLinkerTarget: 1
|
||||
webGLThreadsSupport: 0
|
||||
webGLDecompressionFallback: 0
|
||||
webGLDecompressionFallback: 1
|
||||
webGLInitialMemorySize: 32
|
||||
webGLMaximumMemorySize: 2048
|
||||
webGLMemoryGrowthMode: 2
|
||||
webGLMemoryLinearGrowthStep: 16
|
||||
webGLMemoryGeometricGrowthStep: 0.2
|
||||
webGLMemoryGeometricGrowthCap: 96
|
||||
webGLPowerPreference: 2
|
||||
webGLPowerPreference: 1
|
||||
webGLWebAssemblyTable: 0
|
||||
webGLWebAssemblyBigInt: 0
|
||||
webGLCloseOnQuit: 0
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
QualitySettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 5
|
||||
m_CurrentQuality: 1
|
||||
m_CurrentQuality: 0
|
||||
m_QualitySettings:
|
||||
- serializedVersion: 4
|
||||
- serializedVersion: 5
|
||||
name: Mobile
|
||||
pixelLightCount: 2
|
||||
shadows: 2
|
||||
@@ -34,6 +34,7 @@ QualitySettings:
|
||||
adaptiveVsyncExtraA: 0
|
||||
adaptiveVsyncExtraB: 0
|
||||
lodBias: 1
|
||||
meshLodThreshold: 1
|
||||
maximumLODLevel: 0
|
||||
enableLODCrossFade: 1
|
||||
streamingMipmapsActive: 0
|
||||
@@ -47,8 +48,7 @@ QualitySettings:
|
||||
asyncUploadBufferSize: 16
|
||||
asyncUploadPersistentBuffer: 1
|
||||
resolutionScalingFixedDPIFactor: 1
|
||||
customRenderPipeline: {fileID: 11400000, guid: 5e6cbd92db86f4b18aec3ed561671858,
|
||||
type: 2}
|
||||
customRenderPipeline: {fileID: 11400000, guid: 5e6cbd92db86f4b18aec3ed561671858, type: 2}
|
||||
terrainQualityOverrides: 0
|
||||
terrainPixelError: 1
|
||||
terrainDetailDensityScale: 1
|
||||
@@ -60,7 +60,7 @@ QualitySettings:
|
||||
terrainMaxTrees: 50
|
||||
excludedTargetPlatforms:
|
||||
- Standalone
|
||||
- serializedVersion: 4
|
||||
- serializedVersion: 5
|
||||
name: PC
|
||||
pixelLightCount: 2
|
||||
shadows: 2
|
||||
@@ -88,6 +88,7 @@ QualitySettings:
|
||||
adaptiveVsyncExtraA: 0
|
||||
adaptiveVsyncExtraB: 0
|
||||
lodBias: 2
|
||||
meshLodThreshold: 1
|
||||
maximumLODLevel: 0
|
||||
enableLODCrossFade: 1
|
||||
streamingMipmapsActive: 0
|
||||
@@ -101,8 +102,7 @@ QualitySettings:
|
||||
asyncUploadBufferSize: 16
|
||||
asyncUploadPersistentBuffer: 1
|
||||
resolutionScalingFixedDPIFactor: 1
|
||||
customRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd,
|
||||
type: 2}
|
||||
customRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd, type: 2}
|
||||
terrainQualityOverrides: 0
|
||||
terrainPixelError: 1
|
||||
terrainDetailDensityScale: 1
|
||||
@@ -122,6 +122,7 @@ QualitySettings:
|
||||
GameCoreXboxOne: 1
|
||||
Lumin: 0
|
||||
Nintendo Switch: 1
|
||||
Nintendo Switch 2: 1
|
||||
PS4: 1
|
||||
PS5: 1
|
||||
Server: 0
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
{
|
||||
"templatePinStates": [],
|
||||
"dependencyTypeInfos": [
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.AnimationClip",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEditor.Animations.AnimatorController",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.AnimatorOverrideController",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEditor.Audio.AudioMixerController",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.ComputeShader",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Cubemap",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.GameObject",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEditor.LightingDataAsset",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.LightingSettings",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Material",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEditor.MonoScript",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.PhysicsMaterial",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.PhysicsMaterial2D",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Rendering.PostProcessing.PostProcessResources",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Rendering.VolumeProfile",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEditor.SceneAsset",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Shader",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.ShaderVariantCollection",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Texture",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Texture2D",
|
||||
"defaultInstantiationMode": 0
|
||||
},
|
||||
{
|
||||
"userAdded": false,
|
||||
"type": "UnityEngine.Timeline.TimelineAsset",
|
||||
"defaultInstantiationMode": 0
|
||||
}
|
||||
],
|
||||
"defaultDependencyTypeInfo": {
|
||||
"userAdded": false,
|
||||
"type": "<default_scene_template_dependencies>",
|
||||
"defaultInstantiationMode": 1
|
||||
},
|
||||
"newSceneOverride": 0
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &1
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 53
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a287be6c49135cd4f9b2b8666c39d999, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier: Unity.Timeline.Editor::TimelineProjectSettings
|
||||
assetDefaultFramerate: 60
|
||||
m_DefaultFrameRate: 60
|
||||
@@ -3,12 +3,12 @@
|
||||
--- !u!937362698 &1
|
||||
VFXManager:
|
||||
m_ObjectHideFlags: 0
|
||||
m_IndirectShader: {fileID: 0}
|
||||
m_CopyBufferShader: {fileID: 0}
|
||||
m_PrefixSumShader: {fileID: 0}
|
||||
m_SortShader: {fileID: 0}
|
||||
m_StripUpdateShader: {fileID: 0}
|
||||
m_EmptyShader: {fileID: 0}
|
||||
m_IndirectShader: {fileID: 7200000, guid: 84a17cfa13e40ae4082ef42714f0a81c, type: 3}
|
||||
m_CopyBufferShader: {fileID: 7200000, guid: 23c51f21a3503f6428b527b01f8a2f4e, type: 3}
|
||||
m_PrefixSumShader: {fileID: 7200000, guid: 783e0fdc1a277f54bb851fd2ceab1e7f, type: 3}
|
||||
m_SortShader: {fileID: 7200000, guid: ea257ca3cfb12a642a5025e612af6b2a, type: 3}
|
||||
m_StripUpdateShader: {fileID: 7200000, guid: 8fa6c4009fe2a4d4486c62736fc30ad8, type: 3}
|
||||
m_EmptyShader: {fileID: 4800000, guid: 33a2079f6a2db4c4eb2e44b33f4ddf6b, type: 3}
|
||||
m_RenderPipeSettingsPath:
|
||||
m_FixedTimeStep: 0.016666668
|
||||
m_MaxDeltaTime: 0.05
|
||||
@@ -16,5 +16,5 @@ VFXManager:
|
||||
m_MaxCapacity: 100000000
|
||||
m_CompiledVersion: 7
|
||||
m_RuntimeVersion: 39
|
||||
m_RuntimeResources: {fileID: 0}
|
||||
m_RuntimeResources: {fileID: 11400000, guid: bc10b42afe3813544bffd38ae2cd893d, type: 2}
|
||||
m_BatchEmptyLifetime: 300
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
# Unity VFX Graph Gaussian Splatting Renderer
|
||||
|
||||
A Unity implementation of Gaussian splatting using VFX Graph for real-time rendering. This project uses Unity's VFX Graph system as an alternative to the EWA algorithm to provide more flexibility in accessing the splat's data structures.
|
||||
|
||||
## Installation
|
||||
|
||||
Import this project into Unity or copy the `Assets/vfx-graph-gs/` folder to your project
|
||||
|
||||
## Usage
|
||||
|
||||
### Importing PLY Files
|
||||
|
||||
1. Place your PLY file containing Gaussian splat data in your project
|
||||
2. The custom `SplatImporter` will automatically process the file
|
||||
3. A VFX prefab will be generated that you can drag on to a scene
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
Assets/vfx-graph-gs/
|
||||
├── Scripts/ # Core C# implementation
|
||||
│ ├── SplatData.cs # Data container and GPU buffer management
|
||||
│ ├── SplatDataBinder.cs # VFX Graph integration
|
||||
│ ├── SplatDataInspector.cs # Custom inspector for SplatData
|
||||
│ └── SplatImporter.cs # PLY file importer with burst compilation
|
||||
├── VFXGraphHLSL/ # GPU shader functions
|
||||
│ ├── CalculateAxes.hlsl # Quaternion to matrix conversion
|
||||
│ ├── CalculateSH.hlsl # Spherical harmonics calculations
|
||||
│ └── GetMajorAxes.hlsl # Projection axis selection
|
||||
├── SplatVFX.vfx # Main VFX Graph asset
|
||||
└── [PLY files] # Gaussian splat data files
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License. See the LICENSE file for details.
|
||||
|
||||
## References
|
||||
|
||||
- [Original Gaussian Splatting Code](https://github.com/graphdeco-inria/gaussian-splatting)
|
||||
- [SplatVFX](https://github.com/keijiro/SplatVFX)
|
||||
|
||||
|
||||
> ## Additional Notes
|
||||
> - The importer processes files in 256MB chunks to handle large files
|
||||
> - Presently, the splat file *must* have all splat data present, including spherical harmonics. It currently only supports `float` type variables and binary-encoded files.
|
||||
@@ -0,0 +1,13 @@
|
||||
# TODO
|
||||
|
||||
- [ ] Rewrite SH Array to use interleaved RGB rather than contiguous data per
|
||||
channel
|
||||
- [ ] Switch to using ByteAddressBuffers instead of loops in CalculateSH.hlsl
|
||||
- [ ] Optimize CalculateAxes.hlsl
|
||||
- [ ] Allow splat data buffers to be accessible by other VFX Graphs
|
||||
- [ ] Support SOGS format
|
||||
- [ ] Add exception reporting and handling for incomplete splat data
|
||||
- [ ] Add support for other PLY data types and endianness
|
||||
- [ ] Add support for ASCII PLY data
|
||||
- [ ] Fix the header parsing logic in SplatImporter.cs
|
||||
- [ ] Add more thorough checks in SplatDataBinder.cs
|
||||
Reference in New Issue
Block a user