vpenades пре 2 година
родитељ
комит
fb6bda09dc

+ 89 - 77
MonoScene.sln

@@ -1,41 +1,43 @@
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 17
-VisualStudioVersion = 17.2.32526.322
+VisualStudioVersion = 17.4.33103.184
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Pipeline", "Pipeline", "{B8E244DA-E11E-4E86-A247-220C1AE236BF}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demos", "demos", "{CB3349D6-3282-49BC-87BC-3EA128FAE922}"
+	ProjectSection(SolutionItems) = preProject
+		demos\Directory.Build.props = demos\Directory.Build.props
+	EndProjectSection
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Demo1", "Demo1\Demo1.csproj", "{2C1C3C4C-6BF8-4C26-9212-B8814EF6F3BD}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D3CE88C7-E423-42EF-B869-C233AE360D89}"
+	ProjectSection(SolutionItems) = preProject
+		src\Directory.Build.props = src\Directory.Build.props
+		src\MonoGameFramework.props = src\MonoGameFramework.props
+	EndProjectSection
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Pipeline.GLTF", "MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj", "{C8AC1020-FE76-4BF5-9767-F63554900091}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Demo1", "demos\Demo1\Demo1.csproj", "{2D6AF4F3-897E-4C22-A173-58FBD3C55CDE}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Runtime.Effects.PBR", "MonoScene.Runtime.Effects.PBR\MonoScene.Runtime.Effects.PBR.csproj", "{2563EE5B-0B4A-4EC1-BF78-8F270CACAB59}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Pipeline.GLTF", "src\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj", "{9F9FDD1D-19D3-484D-8A96-0407C46DC6FC}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Runtime.Content", "MonoScene.Runtime.Content\MonoScene.Runtime.Content.csproj", "{41112F36-3213-4C3F-8ECC-616F1B502B6A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Pipeline", "src\MonoScene.Pipeline\MonoScene.Pipeline.csproj", "{A0D0CC86-89B3-43F0-A115-DEDA81D167D4}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Runtime.Model3D", "MonoScene.Runtime.Model3D\MonoScene.Runtime.Model3D.csproj", "{7B9B380E-D9AA-44F4-ABD3-36255EEE9F4A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Runtime.Content", "src\MonoScene.Runtime.Content\MonoScene.Runtime.Content.csproj", "{8753FECF-5D3D-409E-BAE9-80B7CE310A05}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Runtime.Scene3D", "MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj", "{486A02BA-D0C2-4EBB-B17A-DAC9C32A8C99}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Runtime.Effects.Classic", "src\MonoScene.Runtime.Effects.Classic\MonoScene.Runtime.Effects.Classic.csproj", "{24AD71F7-2875-4E50-8687-39CD71356DCD}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Demo2", "Demo2\Demo2.csproj", "{B3D0B09B-1DF1-49CB-B84F-6047C49550CC}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Runtime.Model3D", "src\MonoScene.Runtime.Model3D\MonoScene.Runtime.Model3D.csproj", "{B55A50F0-B0D3-4CDB-AE38-F999FA0F73F1}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Demo3", "Demo3\Demo3.csproj", "{C8D978C4-BEC8-4FB3-9B00-1490A13A5779}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Runtime.Effects.PBR", "src\MonoScene.Runtime.Effects.PBR\MonoScene.Runtime.Effects.PBR.csproj", "{A739AEB9-0439-41A9-8AA2-1973A02EF3DC}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Pipeline.Assimp", "MonoScene.Pipeline.Assimp\MonoScene.Pipeline.Assimp.csproj", "{53F32A7E-EA67-408E-92FC-D6B3D46AC9B1}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Runtime.Scene3D", "src\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj", "{DC3B0B6B-E4DF-46E6-A7C0-2C7904254956}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Pipeline", "MonoScene.Pipeline\MonoScene.Pipeline.csproj", "{BF0082A1-44BE-45B6-8679-BD22E5899050}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Demo2", "demos\Demo2\Demo2.csproj", "{92F7F12B-F434-4396-AA57-1A3D4DF63F4B}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demos", "Demos", "{891DFE27-C481-4D2C-9F55-91CFC08635DF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Demo3", "demos\Demo3\Demo3.csproj", "{2BD342D9-5E43-497C-930C-7576376F6B91}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Runtime", "Runtime", "{C5BB2248-5C6A-4895-BE07-F9A53D566E9B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Primitives3D.OVR", "demos\Demo4.VR\Primitives3D.OVR.csproj", "{E33A8290-FFD1-44DF-B095-FF7002BE8CFE}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F0B1912B-E726-4B4E-8FF5-5ADC7FC18824}"
-	ProjectSection(SolutionItems) = preProject
-		Directory.Build.props = Directory.Build.props
-		MonoGameFramework.props = MonoGameFramework.props
-		..\README.md = ..\README.md
-	EndProjectSection
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoSceneViewer", "demos\MonoSceneViewer\MonoSceneViewer.csproj", "{FE00A03E-5C60-4722-8DE2-B3705FB9845B}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Runtime.Effects.Classic", "MonoScene.Runtime.Effects.Classic\MonoScene.Runtime.Effects.Classic.csproj", "{691C5DFC-9041-4406-9459-B83AFD5FBAD2}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoScene.Pipeline.Assimp", "src\MonoScene.Pipeline.Assimp\MonoScene.Pipeline.Assimp.csproj", "{CC274EDC-1D0D-4BAB-AB9B-26077CE7874B}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -43,69 +45,79 @@ Global
 		Release|Any CPU = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{2C1C3C4C-6BF8-4C26-9212-B8814EF6F3BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{2C1C3C4C-6BF8-4C26-9212-B8814EF6F3BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{2C1C3C4C-6BF8-4C26-9212-B8814EF6F3BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{2C1C3C4C-6BF8-4C26-9212-B8814EF6F3BD}.Release|Any CPU.Build.0 = Release|Any CPU
-		{C8AC1020-FE76-4BF5-9767-F63554900091}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{C8AC1020-FE76-4BF5-9767-F63554900091}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{C8AC1020-FE76-4BF5-9767-F63554900091}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{C8AC1020-FE76-4BF5-9767-F63554900091}.Release|Any CPU.Build.0 = Release|Any CPU
-		{2563EE5B-0B4A-4EC1-BF78-8F270CACAB59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{2563EE5B-0B4A-4EC1-BF78-8F270CACAB59}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{2563EE5B-0B4A-4EC1-BF78-8F270CACAB59}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{2563EE5B-0B4A-4EC1-BF78-8F270CACAB59}.Release|Any CPU.Build.0 = Release|Any CPU
-		{41112F36-3213-4C3F-8ECC-616F1B502B6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{41112F36-3213-4C3F-8ECC-616F1B502B6A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{41112F36-3213-4C3F-8ECC-616F1B502B6A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{41112F36-3213-4C3F-8ECC-616F1B502B6A}.Release|Any CPU.Build.0 = Release|Any CPU
-		{7B9B380E-D9AA-44F4-ABD3-36255EEE9F4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{7B9B380E-D9AA-44F4-ABD3-36255EEE9F4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{7B9B380E-D9AA-44F4-ABD3-36255EEE9F4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{7B9B380E-D9AA-44F4-ABD3-36255EEE9F4A}.Release|Any CPU.Build.0 = Release|Any CPU
-		{486A02BA-D0C2-4EBB-B17A-DAC9C32A8C99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{486A02BA-D0C2-4EBB-B17A-DAC9C32A8C99}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{486A02BA-D0C2-4EBB-B17A-DAC9C32A8C99}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{486A02BA-D0C2-4EBB-B17A-DAC9C32A8C99}.Release|Any CPU.Build.0 = Release|Any CPU
-		{B3D0B09B-1DF1-49CB-B84F-6047C49550CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{B3D0B09B-1DF1-49CB-B84F-6047C49550CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{B3D0B09B-1DF1-49CB-B84F-6047C49550CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{B3D0B09B-1DF1-49CB-B84F-6047C49550CC}.Release|Any CPU.Build.0 = Release|Any CPU
-		{C8D978C4-BEC8-4FB3-9B00-1490A13A5779}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{C8D978C4-BEC8-4FB3-9B00-1490A13A5779}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{C8D978C4-BEC8-4FB3-9B00-1490A13A5779}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{C8D978C4-BEC8-4FB3-9B00-1490A13A5779}.Release|Any CPU.Build.0 = Release|Any CPU
-		{53F32A7E-EA67-408E-92FC-D6B3D46AC9B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{53F32A7E-EA67-408E-92FC-D6B3D46AC9B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{53F32A7E-EA67-408E-92FC-D6B3D46AC9B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{53F32A7E-EA67-408E-92FC-D6B3D46AC9B1}.Release|Any CPU.Build.0 = Release|Any CPU
-		{BF0082A1-44BE-45B6-8679-BD22E5899050}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{BF0082A1-44BE-45B6-8679-BD22E5899050}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{BF0082A1-44BE-45B6-8679-BD22E5899050}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{BF0082A1-44BE-45B6-8679-BD22E5899050}.Release|Any CPU.Build.0 = Release|Any CPU
-		{691C5DFC-9041-4406-9459-B83AFD5FBAD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{691C5DFC-9041-4406-9459-B83AFD5FBAD2}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{691C5DFC-9041-4406-9459-B83AFD5FBAD2}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{691C5DFC-9041-4406-9459-B83AFD5FBAD2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2D6AF4F3-897E-4C22-A173-58FBD3C55CDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2D6AF4F3-897E-4C22-A173-58FBD3C55CDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2D6AF4F3-897E-4C22-A173-58FBD3C55CDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2D6AF4F3-897E-4C22-A173-58FBD3C55CDE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9F9FDD1D-19D3-484D-8A96-0407C46DC6FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9F9FDD1D-19D3-484D-8A96-0407C46DC6FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9F9FDD1D-19D3-484D-8A96-0407C46DC6FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9F9FDD1D-19D3-484D-8A96-0407C46DC6FC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A0D0CC86-89B3-43F0-A115-DEDA81D167D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A0D0CC86-89B3-43F0-A115-DEDA81D167D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A0D0CC86-89B3-43F0-A115-DEDA81D167D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A0D0CC86-89B3-43F0-A115-DEDA81D167D4}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8753FECF-5D3D-409E-BAE9-80B7CE310A05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8753FECF-5D3D-409E-BAE9-80B7CE310A05}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8753FECF-5D3D-409E-BAE9-80B7CE310A05}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8753FECF-5D3D-409E-BAE9-80B7CE310A05}.Release|Any CPU.Build.0 = Release|Any CPU
+		{24AD71F7-2875-4E50-8687-39CD71356DCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{24AD71F7-2875-4E50-8687-39CD71356DCD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{24AD71F7-2875-4E50-8687-39CD71356DCD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{24AD71F7-2875-4E50-8687-39CD71356DCD}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B55A50F0-B0D3-4CDB-AE38-F999FA0F73F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B55A50F0-B0D3-4CDB-AE38-F999FA0F73F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B55A50F0-B0D3-4CDB-AE38-F999FA0F73F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B55A50F0-B0D3-4CDB-AE38-F999FA0F73F1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A739AEB9-0439-41A9-8AA2-1973A02EF3DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A739AEB9-0439-41A9-8AA2-1973A02EF3DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A739AEB9-0439-41A9-8AA2-1973A02EF3DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A739AEB9-0439-41A9-8AA2-1973A02EF3DC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DC3B0B6B-E4DF-46E6-A7C0-2C7904254956}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DC3B0B6B-E4DF-46E6-A7C0-2C7904254956}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DC3B0B6B-E4DF-46E6-A7C0-2C7904254956}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DC3B0B6B-E4DF-46E6-A7C0-2C7904254956}.Release|Any CPU.Build.0 = Release|Any CPU
+		{92F7F12B-F434-4396-AA57-1A3D4DF63F4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{92F7F12B-F434-4396-AA57-1A3D4DF63F4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{92F7F12B-F434-4396-AA57-1A3D4DF63F4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{92F7F12B-F434-4396-AA57-1A3D4DF63F4B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2BD342D9-5E43-497C-930C-7576376F6B91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2BD342D9-5E43-497C-930C-7576376F6B91}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2BD342D9-5E43-497C-930C-7576376F6B91}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2BD342D9-5E43-497C-930C-7576376F6B91}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E33A8290-FFD1-44DF-B095-FF7002BE8CFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E33A8290-FFD1-44DF-B095-FF7002BE8CFE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E33A8290-FFD1-44DF-B095-FF7002BE8CFE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E33A8290-FFD1-44DF-B095-FF7002BE8CFE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{FE00A03E-5C60-4722-8DE2-B3705FB9845B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FE00A03E-5C60-4722-8DE2-B3705FB9845B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FE00A03E-5C60-4722-8DE2-B3705FB9845B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FE00A03E-5C60-4722-8DE2-B3705FB9845B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CC274EDC-1D0D-4BAB-AB9B-26077CE7874B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CC274EDC-1D0D-4BAB-AB9B-26077CE7874B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CC274EDC-1D0D-4BAB-AB9B-26077CE7874B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CC274EDC-1D0D-4BAB-AB9B-26077CE7874B}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
-		{2C1C3C4C-6BF8-4C26-9212-B8814EF6F3BD} = {891DFE27-C481-4D2C-9F55-91CFC08635DF}
-		{C8AC1020-FE76-4BF5-9767-F63554900091} = {B8E244DA-E11E-4E86-A247-220C1AE236BF}
-		{2563EE5B-0B4A-4EC1-BF78-8F270CACAB59} = {C5BB2248-5C6A-4895-BE07-F9A53D566E9B}
-		{41112F36-3213-4C3F-8ECC-616F1B502B6A} = {C5BB2248-5C6A-4895-BE07-F9A53D566E9B}
-		{7B9B380E-D9AA-44F4-ABD3-36255EEE9F4A} = {C5BB2248-5C6A-4895-BE07-F9A53D566E9B}
-		{486A02BA-D0C2-4EBB-B17A-DAC9C32A8C99} = {C5BB2248-5C6A-4895-BE07-F9A53D566E9B}
-		{B3D0B09B-1DF1-49CB-B84F-6047C49550CC} = {891DFE27-C481-4D2C-9F55-91CFC08635DF}
-		{C8D978C4-BEC8-4FB3-9B00-1490A13A5779} = {891DFE27-C481-4D2C-9F55-91CFC08635DF}
-		{53F32A7E-EA67-408E-92FC-D6B3D46AC9B1} = {B8E244DA-E11E-4E86-A247-220C1AE236BF}
-		{BF0082A1-44BE-45B6-8679-BD22E5899050} = {B8E244DA-E11E-4E86-A247-220C1AE236BF}
-		{691C5DFC-9041-4406-9459-B83AFD5FBAD2} = {C5BB2248-5C6A-4895-BE07-F9A53D566E9B}
+		{2D6AF4F3-897E-4C22-A173-58FBD3C55CDE} = {CB3349D6-3282-49BC-87BC-3EA128FAE922}
+		{9F9FDD1D-19D3-484D-8A96-0407C46DC6FC} = {D3CE88C7-E423-42EF-B869-C233AE360D89}
+		{A0D0CC86-89B3-43F0-A115-DEDA81D167D4} = {D3CE88C7-E423-42EF-B869-C233AE360D89}
+		{8753FECF-5D3D-409E-BAE9-80B7CE310A05} = {D3CE88C7-E423-42EF-B869-C233AE360D89}
+		{24AD71F7-2875-4E50-8687-39CD71356DCD} = {D3CE88C7-E423-42EF-B869-C233AE360D89}
+		{B55A50F0-B0D3-4CDB-AE38-F999FA0F73F1} = {D3CE88C7-E423-42EF-B869-C233AE360D89}
+		{A739AEB9-0439-41A9-8AA2-1973A02EF3DC} = {D3CE88C7-E423-42EF-B869-C233AE360D89}
+		{DC3B0B6B-E4DF-46E6-A7C0-2C7904254956} = {D3CE88C7-E423-42EF-B869-C233AE360D89}
+		{92F7F12B-F434-4396-AA57-1A3D4DF63F4B} = {CB3349D6-3282-49BC-87BC-3EA128FAE922}
+		{2BD342D9-5E43-497C-930C-7576376F6B91} = {CB3349D6-3282-49BC-87BC-3EA128FAE922}
+		{E33A8290-FFD1-44DF-B095-FF7002BE8CFE} = {CB3349D6-3282-49BC-87BC-3EA128FAE922}
+		{FE00A03E-5C60-4722-8DE2-B3705FB9845B} = {CB3349D6-3282-49BC-87BC-3EA128FAE922}
+		{CC274EDC-1D0D-4BAB-AB9B-26077CE7874B} = {D3CE88C7-E423-42EF-B869-C233AE360D89}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
-		SolutionGuid = {7B695401-8FEE-4F6F-9A83-4AF3714E3BD7}
+		SolutionGuid = {3A93E868-4176-4EB6-864F-C1CEE03ED6A5}
 	EndGlobalSection
 	GlobalSection(SubversionScc) = preSolution
 		Svn-Managed = True

+ 1 - 1
NuGet.config

@@ -3,7 +3,7 @@
 
   <packageSources>
 
-    <add key="MonoGame Develop" value="..\MonoGame" />
+    <add key="MonoGame Develop" value="MonoGame" />
 
   </packageSources>  
 

+ 10 - 7
demos/AndroidDemo1/AndroidDemo1.csproj

@@ -24,6 +24,7 @@
     <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
     <AndroidEnableSGenConcurrent>true</AndroidEnableSGenConcurrent>
     <AndroidHttpClientHandlerType>Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
+    <IsPackable>false</IsPackable>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -35,6 +36,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidUseSharedRuntime>True</AndroidUseSharedRuntime>
     <AndroidLinkMode>None</AndroidLinkMode>
+    <IsPackable>false</IsPackable>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -45,6 +47,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
     <AndroidLinkMode>SdkOnly</AndroidLinkMode>
+    <IsPackable>false</IsPackable>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="System" />
@@ -75,31 +78,31 @@
     <PackageReference Include="MonoGame.Framework.Android" Version="3.8.1.2070-develop" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\MonoScene.Pipeline\MonoScene.Pipeline.csproj">
+    <ProjectReference Include="..\..\src\MonoScene.Pipeline\MonoScene.Pipeline.csproj">
       <Project>{bf0082a1-44be-45b6-8679-bd22e5899050}</Project>
       <Name>MonoScene.Pipeline</Name>
     </ProjectReference>
-    <ProjectReference Include="..\MonoScene.Runtime.Content\MonoScene.Runtime.Content.csproj">
+    <ProjectReference Include="..\..\src\MonoScene.Runtime.Content\MonoScene.Runtime.Content.csproj">
       <Project>{41112F36-3213-4C3F-8ECC-616F1B502B6A}</Project>
       <Name>MonoScene.Runtime.Content</Name>
     </ProjectReference>
-    <ProjectReference Include="..\MonoScene.Runtime.Effects.Classic\MonoScene.Runtime.Effects.Classic.csproj">
+    <ProjectReference Include="..\..\src\MonoScene.Runtime.Effects.Classic\MonoScene.Runtime.Effects.Classic.csproj">
       <Project>{691c5dfc-9041-4406-9459-b83afd5fbad2}</Project>
       <Name>MonoScene.Runtime.Effects.Classic</Name>
     </ProjectReference>
-    <ProjectReference Include="..\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj">
+    <ProjectReference Include="..\..\src\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj">
       <Project>{c8ac1020-fe76-4bf5-9767-f63554900091}</Project>
       <Name>MonoScene.Pipeline.GLTF</Name>
     </ProjectReference>
-    <ProjectReference Include="..\MonoScene.Runtime.Effects.PBR\MonoScene.Runtime.Effects.PBR.csproj">
+    <ProjectReference Include="..\..\src\MonoScene.Runtime.Effects.PBR\MonoScene.Runtime.Effects.PBR.csproj">
       <Project>{2563ee5b-0b4a-4ec1-bf78-8f270cacab59}</Project>
       <Name>MonoScene.Runtime.Effects.PBR</Name>
     </ProjectReference>
-    <ProjectReference Include="..\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj">
+    <ProjectReference Include="..\..\src\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj">
       <Project>{486A02BA-D0C2-4EBB-B17A-DAC9C32A8C99}</Project>
       <Name>MonoScene.Runtime.Scene3D</Name>
     </ProjectReference>
-    <ProjectReference Include="..\MonoScene.Runtime.Model3D\MonoScene.Runtime.Model3D.csproj">
+    <ProjectReference Include="..\..\src\MonoScene.Runtime.Model3D\MonoScene.Runtime.Model3D.csproj">
       <Project>{7B9B380E-D9AA-44F4-ABD3-36255EEE9F4A}</Project>
       <Name>MonoScene.Runtime.Model3D</Name>
     </ProjectReference>

+ 2 - 2
demos/Demo1/Demo1.csproj

@@ -26,8 +26,8 @@
     <PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.1.2082-develop" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj" />
-    <ProjectReference Include="..\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj" />
+    <ProjectReference Include="..\..\src\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj" />
+    <ProjectReference Include="..\..\src\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj" />
   </ItemGroup>
 
   <ItemGroup>

+ 2 - 2
demos/Demo2/Demo2.csproj

@@ -26,8 +26,8 @@
     <PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.1.2082-develop" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj" />
-    <ProjectReference Include="..\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj" />
+    <ProjectReference Include="..\..\src\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj" />
+    <ProjectReference Include="..\..\src\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj" />
   </ItemGroup>
 
   <ItemGroup>

+ 2 - 2
demos/Demo3/Demo3.csproj

@@ -26,8 +26,8 @@
     <PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.1.2082-develop" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj" />
-    <ProjectReference Include="..\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj" />
+    <ProjectReference Include="..\..\src\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj" />
+    <ProjectReference Include="..\..\src\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj" />
   </ItemGroup>
   
   <ItemGroup>

BIN
demos/Demo4.VR/Content/CesiumMan.glb


BIN
demos/Demo4.VR/Content/WaterBottle.glb


BIN
demos/Demo4.VR/Content/haunted_house.glb


BIN
demos/Demo4.VR/Icon.ico


+ 35 - 0
demos/Demo4.VR/Primitives3D.OVR.csproj

@@ -0,0 +1,35 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+    <TargetFramework>net6.0-windows7.0</TargetFramework>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <OutputType>Exe</OutputType>
+    <UseWindowsForms>true</UseWindowsForms>
+    <ApplicationIcon>Icon.ico</ApplicationIcon>
+  </PropertyGroup>
+
+ <ItemGroup>
+   <None Remove="Content\CesiumMan.glb" />
+   <None Remove="Content\haunted_house.glb" />
+   <None Remove="Content\WaterBottle.glb" />
+ </ItemGroup> 
+
+ <ItemGroup>
+   <Content Include="Content\CesiumMan.glb" CopyToOutputDirectory="PreserveNewest" />
+   <Content Include="Content\haunted_house.glb" CopyToOutputDirectory="PreserveNewest" />     
+   <Content Include="Content\WaterBottle.glb" CopyToOutputDirectory="PreserveNewest" />
+   <Content Include="Icon.ico" />
+ </ItemGroup>  
+
+  <ItemGroup>
+    <PackageReference Include="MonoGame.Framework.WindowsDX.9000" Version="3.8.9101" />
+    <PackageReference Include="nkast.Xna.Framework.Oculus.OvrDX11" Version="3.8.9101.1" />
+    <PackageReference Include="nkast.LibOVR" Version="1.0.0" />    
+  </ItemGroup>  
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj" />
+    <ProjectReference Include="..\..\src\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj" />
+  </ItemGroup>
+
+</Project>

+ 20 - 0
demos/Demo4.VR/Program.cs

@@ -0,0 +1,20 @@
+using System;
+
+namespace Primitives3D
+{
+    /// <summary>
+    /// The main class.
+    /// </summary>
+    public static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            using (var game = new VRGameDemo())
+                game.Run();
+        }
+    }
+}

+ 158 - 0
demos/Demo4.VR/VRGameDemo.cs

@@ -0,0 +1,158 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Linq;
+
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Input;
+using Microsoft.Xna.Framework.Input.Oculus;
+
+namespace Primitives3D
+{
+    /// <summary>
+    /// This sample shows how to draw 3D geometric primitives
+    /// such as cubes, spheres, and cylinders.
+    /// </summary>
+    public class VRGameDemo : Microsoft.Xna.Framework.XRGame
+    {
+        #region Lifecycle
+        public VRGameDemo()
+        {
+            Content.RootDirectory = "Content";            
+        }
+
+        /// <summary>
+        /// Load your graphics content.
+        /// </summary>
+        protected override void LoadContent()
+        {
+            base.LoadContent();
+
+            var gltfScene = new VRSceneDemo(this);
+            gltfScene.Initialize();
+            this.Components.Add(gltfScene);
+        }
+
+        #endregion                
+
+        #region Fields        
+
+        KeyboardState currentKeyboardState;
+        KeyboardState lastKeyboardState;
+        GamePadState currentGamePadState;
+        GamePadState lastGamePadState;
+        TouchControllerState currentTouchControllerState;
+        TouchControllerState lastTouchControllerState;        
+
+        #endregion
+
+        #region Update
+
+
+        /// <inheritdoc/>
+        protected override void Update(GameTime gameTime)
+        {
+            UpdateXRDevice();
+
+            HandleInput();
+
+            base.Update(gameTime);
+        }
+
+        #endregion
+
+        #region Handle Input
+
+        /// <summary>
+        /// Handles input for quitting or changing settings.
+        /// </summary>
+        void HandleInput()
+        {
+            lastKeyboardState = currentKeyboardState;
+            lastGamePadState = currentGamePadState;
+            lastTouchControllerState = currentTouchControllerState;
+
+            currentKeyboardState = Keyboard.GetState();
+            currentGamePadState = GamePad.GetState(PlayerIndex.One);
+            currentTouchControllerState = TouchController.GetState(TouchControllerType.Touch);
+            //if (ovrDevice.IsConnected)
+            var handsState = this.GetHandsState();
+
+            // Check for exit.
+            if (IsPressed(Keys.Escape, Buttons.Back))
+            {
+                Exit();
+            }
+
+            // Change primitive?
+            if (IsPressed(Keys.A, Buttons.A))
+            {
+                // currentPrimitiveIndex = (currentPrimitiveIndex + 1) % primitives.Count;
+            }
+
+            // Change color?
+            if (IsPressed(Keys.B, Buttons.B))
+            {
+                // currentColorIndex = (currentColorIndex + 1) % colors.Count;
+            }
+
+            // Toggle wireframe?
+            if (IsPressed(Keys.Y, Buttons.Y))
+            {
+                // isWireframe = !isWireframe;
+            }
+
+        }
+
+        /// <summary>
+        /// Checks whether the specified key or button has been pressed.
+        /// </summary>
+        bool IsPressed(Keys key, Buttons button)
+        {
+            return (currentKeyboardState.IsKeyDown(key) &&
+                    lastKeyboardState.IsKeyUp(key)) ||
+                   (currentGamePadState.IsButtonDown(button) &&
+                    lastGamePadState.IsButtonUp(button)) ||
+                   (currentTouchControllerState.IsButtonPressed(button) &&
+                    !lastTouchControllerState.IsButtonPressed(button));
+        }
+
+        #endregion
+
+        #region Draw
+
+
+        /// <inheritdoc/>        
+        protected override void Draw(GameTime gameTime)
+        {
+            var cameraPosition = new Vector3(0, 1.7f, 0);            
+
+            this.DrawStereo(gameTime, cameraPosition, out var leftView, out var rightView);
+
+            if (true)
+            {
+                // draw on PC screen
+                GraphicsDevice.SetRenderTarget(null);
+
+                var aspect = GraphicsDevice.Viewport.AspectRatio;
+
+                DrawScene(gameTime, leftView, (near, far) => Matrix.CreatePerspectiveFieldOfView(1, aspect, near, far));
+            }
+        }
+
+        protected override void DrawScene(GameTime gameTime, Matrix view, ProjectionDelegate projection)
+        {
+            GraphicsDevice.Clear(Color.CornflowerBlue);
+
+            base.DrawScene(gameTime, view, projection);
+        }
+
+        #endregion
+    }
+
+    
+
+
+}

+ 97 - 0
demos/Demo4.VR/VRSceneDemo.cs

@@ -0,0 +1,97 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+
+using MonoScene.Graphics;
+
+namespace Primitives3D
+{
+    class VRSceneDemo : XRGameComponent
+    {
+        #region lifecycle
+        public VRSceneDemo(XRGame game) : base(game)
+        {
+        }
+
+        protected override void LoadContent()
+        {
+            base.LoadContent();
+            
+            var gltfFactory = new MonoScene.Graphics.Pipeline.GltfModelFactory(this.GraphicsDevice);
+
+            _HouseTemplate = gltfFactory.LoadModel("Content\\haunted_house.glb");
+            _CharTemplate = gltfFactory.LoadModel("Content\\CesiumMan.glb");
+        }
+
+        protected override void UnloadContent()
+        {
+            _HouseTemplate?.Dispose();
+            _CharTemplate?.Dispose();
+
+            base.UnloadContent();            
+        }
+        #endregion
+
+        #region data
+
+        private PBREnvironment _LightsAndFog = PBREnvironment.CreateDefault();
+
+        private DeviceModelCollection _HouseTemplate;
+        private DeviceModelCollection _CharTemplate;
+
+        private ModelInstance _HouseView1;
+        private ModelInstance _HouseView2;
+        private ModelInstance _HouseView3;
+        private ModelInstance _HouseView4;
+
+        private ModelInstance _CharView1;
+
+        #endregion
+
+        #region update
+
+        public override void Update(GameTime gameTime)
+        {
+            base.Update(gameTime);
+
+            _HouseView1 ??= _HouseTemplate.DefaultModel.CreateInstance();            
+            _HouseView1.WorldMatrix = Matrix.CreateScale(60) * Matrix.CreateTranslation(0, 0, -10);
+
+            _HouseView2 ??= _HouseTemplate.DefaultModel.CreateInstance();
+            _HouseView2.WorldMatrix = Matrix.CreateScale(60) * Matrix.CreateTranslation(-12, 0, 1);
+
+            _HouseView3 ??= _HouseTemplate.DefaultModel.CreateInstance();
+            _HouseView3.WorldMatrix = Matrix.CreateScale(60) * Matrix.CreateTranslation(11, 0, 0);
+
+            _HouseView4 ??= _HouseTemplate.DefaultModel.CreateInstance();
+            _HouseView4.WorldMatrix = Matrix.CreateScale(60) * Matrix.CreateTranslation(0, 0, 15);
+
+            _CharView1 ??= _CharTemplate.DefaultModel.CreateInstance();
+            _CharView1.WorldMatrix = Matrix.CreateScale(2) * Matrix.CreateTranslation(0, 0, -3);
+            _CharView1.Armature.SetAnimationFrame(0, (float)gameTime.TotalGameTime.TotalSeconds);
+        }
+
+        #endregion
+
+        #region draw
+
+        public override void Draw(GameTime gameTime, Matrix view, ProjectionDelegate projFunc)
+        {
+            var dc = new ModelDrawingContext(this.GraphicsDevice);
+            
+            dc.SetCamera(Matrix.Invert(view));            
+            dc.SetProjectionMatrix(projFunc(0.1f, 100));
+
+            dc.DrawSceneInstances(_LightsAndFog, _HouseView1, _HouseView2, _HouseView3, _HouseView4, _CharView1);
+
+            base.Draw(gameTime, view, projFunc);
+        }
+
+        #endregion
+    }
+}

+ 169 - 0
demos/Demo4.VR/XRGame.cs

@@ -0,0 +1,169 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Input.Oculus;
+
+
+namespace Microsoft.Xna.Framework
+{
+    /// <summary>
+    /// callback to retrieve the projection matrix
+    /// </summary>
+    /// <param name="nearPlane">near plane to use in the projection matrix</param>
+    /// <param name="farPlane">far plane to use in the projection matrix</param>
+    /// <returns>the projection matrix</returns>
+    public delegate Matrix ProjectionDelegate(float nearPlane, float farPlane);
+
+    /// <inheritdoc/>    
+    public class XRGame : Game
+    {
+        #region Lifecycle
+
+        public XRGame()
+        {
+            graphics = new GraphicsDeviceManager(this);
+
+            // 90Hz Frame rate for oculus
+            TargetElapsedTime = TimeSpan.FromTicks(111111);
+            IsFixedTimeStep = true;
+            graphics.SynchronizeWithVerticalRetrace = false;
+
+            // we don't care is the main window is Focuses or not
+            // because we render on the Oculus surface.
+            InactiveSleepTime = TimeSpan.FromSeconds(0);
+
+            // OVR requirees at least DX feature level 10.0
+            graphics.GraphicsProfile = GraphicsProfile.FL10_0;
+
+            // create oculus device
+            ovrDevice = new OvrDevice(graphics);
+        }
+
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing)
+            {
+                ovrDevice?.Dispose();
+            }
+
+            base.Dispose(disposing);
+        }
+
+        #endregion                
+
+        #region Fields
+
+        GraphicsDeviceManager graphics;
+
+        OvrDevice ovrDevice;
+
+        #endregion
+
+        #region Update
+
+        public HandsState GetHandsState()
+        {
+            return ovrDevice.GetHandsState();
+        }           
+
+        protected void UpdateXRDevice()
+        {
+            if (!ovrDevice.IsConnected)
+            {
+                try
+                {
+                    // Initialize Oculus VR
+                    int ovrCreateResult = ovrDevice.CreateDevice();
+                    if (ovrCreateResult == 0) { }
+                }
+                catch (Exception ovre)
+                {
+                    System.Diagnostics.Debug.WriteLine(ovre.Message);
+                }
+            }
+        }
+
+        #endregion
+
+        #region Draw
+
+        protected virtual void DrawStereo(GameTime gameTime, Vector3 cameraPosition, out Matrix left, out Matrix right)
+        {
+            left = Matrix.Identity;
+            right = Matrix.Identity;
+
+            if (!ovrDevice.IsConnected) return;
+
+            // draw on VR headset            
+            if (ovrDevice.BeginFrame() < 0) return;
+
+            var headsetState = ovrDevice.GetHeadsetState();
+
+            // draw each eye on a rendertarget
+            for (int eye = 0; eye < 2; eye++)
+            {
+                RenderTarget2D rt = ovrDevice.GetEyeRenderTarget(eye);
+                GraphicsDevice.SetRenderTarget(rt);                
+
+                // VR eye view and projection
+                var view = headsetState.GetEyeView(eye);
+
+                Matrix globalWorld = Matrix.CreateWorld(cameraPosition, Vector3.Forward, Vector3.Up);
+                view = Matrix.Invert(globalWorld) * view;
+
+                if (eye == 0) left = view;
+                if (eye == 1) right = view;
+
+                DrawScene(gameTime, view, (near, far) => ovrDevice.CreateProjection(eye, near, far));
+
+                // Resolve eye rendertarget
+                GraphicsDevice.SetRenderTarget(null);
+                // submit eye rendertarget
+                ovrDevice.CommitRenderTarget(eye, rt);
+            }
+
+            // submit frame
+            int result = ovrDevice.EndFrame();            
+
+            return;
+        }
+
+        protected virtual void DrawPreview()
+        {
+            // draw on PC screen
+            GraphicsDevice.SetRenderTarget(null);
+            GraphicsDevice.Clear(Color.Black);
+
+            // preview VR rendertargets
+            var pp = GraphicsDevice.PresentationParameters;
+            int height = pp.BackBufferHeight;
+            float aspectRatio = (float)ovrDevice.GetEyeRenderTarget(0).Width / ovrDevice.GetEyeRenderTarget(0).Height;
+
+            /*
+            int width = Math.Min(pp.BackBufferWidth, (int)(height * aspectRatio));
+            spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive);
+            spriteBatch.Draw(ovrDevice.GetEyeRenderTarget(0), new Rectangle(0, 0, width, height), Color.White);
+            spriteBatch.Draw(ovrDevice.GetEyeRenderTarget(1), new Rectangle(width, 0, width, height), Color.White);
+            spriteBatch.End();
+            */
+        }
+
+        protected virtual void DrawScene(GameTime gameTime, Matrix view, ProjectionDelegate projection)
+        {
+            // prepare XR drawable components
+            foreach(var component in this.Components.OfType<XRGameComponent>())
+            {
+                component.SetEyeTransforms(view, projection);
+            }
+
+            // draw any drawable components
+            base.Draw(gameTime);
+        }
+
+        #endregion
+    }
+}

+ 52 - 0
demos/Demo4.VR/XRGameComponent.cs

@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Microsoft.Xna.Framework.Input.Oculus;
+
+namespace Microsoft.Xna.Framework
+{
+    internal class XRGameComponent : DrawableGameComponent
+    {
+        public XRGameComponent(XRGame game)
+            : base(game)
+        {
+            XRGame = game;
+        }
+         
+        public XRGame XRGame { get; }
+        private Matrix _EyeView;
+        private ProjectionDelegate _EyeProjection;        
+
+        protected HandsState GetHandsState()
+        {
+            return XRGame.GetHandsState();
+        }
+
+        /// <summary>
+        /// This method must be called before calling <see cref="Draw(GameTime)"/>
+        /// </summary>
+        /// <param name="view">the view matrix</param>
+        /// <param name="projFunction">the projection function</param>
+        internal void SetEyeTransforms(Matrix view, ProjectionDelegate projFunction)
+        {
+            _EyeView = view;
+            _EyeProjection = projFunction;
+        }
+
+        [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
+        public override void Draw(GameTime gameTime)
+        {
+            Draw(gameTime, _EyeView, _EyeProjection);
+
+            base.Draw(gameTime);
+        }
+
+        public virtual void Draw(GameTime gameTime, Matrix view, ProjectionDelegate proj)
+        {
+
+        }
+    }
+}

+ 42 - 0
demos/Demo4.VR/app.manifest

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
+  <assemblyIdentity version="1.0.0.0" name="Primitives3D"/>
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
+    <security>
+      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
+        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+
+  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+    <application>
+      <!-- A list of the Windows versions that this application has been tested on and is
+           is designed to work with. Uncomment the appropriate elements and Windows will 
+           automatically selected the most compatible environment. -->
+
+      <!-- Windows Vista -->
+      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
+
+      <!-- Windows 7 -->
+      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
+
+      <!-- Windows 8 -->
+      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
+
+      <!-- Windows 8.1 -->
+      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
+
+      <!-- Windows 10 -->
+      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
+
+    </application>
+  </compatibility>
+
+  <application xmlns="urn:schemas-microsoft-com:asm.v3">
+    <windowsSettings>
+      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
+    </windowsSettings>
+  </application>
+
+</assembly>

+ 94 - 0
demos/Directory.Build.props

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project>
+  
+  <!-- https://blog.johnnyreilly.com/2021/07/14/directory-build-props-c-sharp-9-for-all -->
+
+  <!-- Legal =================================================================================== -->
+
+  <PropertyGroup>
+    <Authors>Vicente Penades</Authors>
+    <Company>Vicente Penades</Company>
+    <Copyright>Copyright (c) 2022 Vicente Penades</Copyright>
+    <PackageLicenseExpression>MIT</PackageLicenseExpression>
+  </PropertyGroup>
+
+  <!-- Configuration =================================================================================== -->
+
+  <PropertyGroup>
+    <LangVersion>8.0</LangVersion>
+    <IsPackable>false</IsPackable>
+  </PropertyGroup>
+
+  <PropertyGroup>
+    <IsTrimmable>true</IsTrimmable>
+    <EnableTrimAnalyzer>true</EnableTrimAnalyzer>
+  </PropertyGroup>
+  
+  <!-- Analysers =================================================================================== -->
+
+  <PropertyGroup>
+    <NoWarn>1701;1702;1591;CA1062;CA1304;CA1310</NoWarn>
+  </PropertyGroup>
+
+  <PropertyGroup>
+    <!-- Enable all FxCop rules with NetAnalyzers
+    https://docs.microsoft.com/es-es/visualstudio/code-quality/migrate-from-fxcop-analyzers-to-net-analyzers?view=vs-2022#migration-steps
+    -->
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <!-- <CodeAnalysisRuleSet>$(MsBuildThisFileDirectory)..\solution.ruleset</CodeAnalysisRuleSet>  -->
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Update="ErrorProne.NET.Structs" Version="0.4.0-beta.1">
+      <PrivateAssets>all</PrivateAssets>
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+    </PackageReference>
+  </ItemGroup>
+  
+  <!-- Packaging =================================================================================== -->
+
+  <PropertyGroup>
+    
+    <Description>Heterogeneous collection of types for interop between third party graphics libraries</Description>
+
+    <RepositoryType>git</RepositoryType>
+    <RepositoryUrl>https://github.com/vpenades/MonoScene</RepositoryUrl>
+    <PackageProjectUrl>https://github.com/vpenades/MonoScene</PackageProjectUrl>
+
+    <PublishRepositoryUrl>true</PublishRepositoryUrl>
+
+    <PackageTags>glTF support for MonoGame</PackageTags>
+  </PropertyGroup>  
+  
+  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+    <VersionPrefix>1.0.0</VersionPrefix>
+    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
+  </PropertyGroup>
+
+  <PropertyGroup>
+    <Deterministic>false</Deterministic>
+    <ContinuousIntegrationBuild>false</ContinuousIntegrationBuild>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+    <DebugSymbols>true</DebugSymbols>
+    <IncludeSymbols>true</IncludeSymbols>
+    <SymbolPackageFormat>snupkg</SymbolPackageFormat>    
+    
+    <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <DocumentationFile>bin\$(Configuration)\$(AssemblyName).xml</DocumentationFile>
+  </PropertyGroup>
+
+  <!-- Source Control =================================================================================== -->
+
+  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">   
+
+    <!-- https://github.com/dotnet/sourcelink/blob/main/docs/README.md -->
+    
+    <EmbedAllSources>true</EmbedAllSources>
+    <!-- Optional: Embed source files that are not tracked by the source control manager in the PDB -->
+    <!--<EmbedUntrackedSources>true</EmbedUntrackedSources>-->
+    
+  </PropertyGroup>
+  
+</Project>

+ 3 - 3
demos/MonoSceneViewer/MonoSceneViewer.csproj

@@ -14,9 +14,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj" />
-    <ProjectReference Include="..\MonoScene.Pipeline.Assimp\MonoScene.Pipeline.Assimp.csproj" />
-    <ProjectReference Include="..\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj" />
+    <ProjectReference Include="..\..\src\MonoScene.Pipeline.GLTF\MonoScene.Pipeline.GLTF.csproj" />
+    <ProjectReference Include="..\..\src\MonoScene.Pipeline.Assimp\MonoScene.Pipeline.Assimp.csproj" />
+    <ProjectReference Include="..\..\src\MonoScene.Runtime.Scene3D\MonoScene.Runtime.Scene3D.csproj" />
   </ItemGroup>
 
 

+ 1 - 1
src/build-preview.cmd

@@ -11,7 +11,7 @@ echo Building 1.0.0-%VERSIONSUFFIX%
 
 :: ============================================= DOTNET builder
 
-dotnet build -c:Release --version-suffix %VERSIONSUFFIX% MonoScene.sln
+dotnet build -c:Release --version-suffix %VERSIONSUFFIX% ..\MonoScene.sln
 
 :: ============================================= Copy output