Browse Source

MultiScene: Phase 4: Added SceneDisplay class to have multiple windows + implementation with SDL. Not with the others.

undefined
Benjamin ‘Touky’ Huet Sam Hocevar <sam@hocevar.net> 9 years ago
parent
commit
2170b89b11
30 changed files with 565 additions and 234 deletions
  1. +44
    -50
      build/Lol (vs2013).sln
  2. +1
    -1
      doc/samples/btphystest.cpp
  3. +9
    -3
      doc/samples/meshviewer/meshviewer.cpp
  4. +1
    -1
      doc/tutorial/02_cube.cpp
  5. +1
    -1
      doc/tutorial/05_easymesh.cpp
  6. +1
    -1
      doc/tutorial/06_sprite.cpp
  7. +1
    -1
      doc/tutorial/07_input.cpp
  8. +1
    -1
      doc/tutorial/08_fbo.cpp
  9. +8
    -8
      doc/tutorial/12_voronoi.cpp
  10. +82
    -0
      src/application/application.cpp
  11. +25
    -0
      src/application/application.h
  12. +1
    -1
      src/camera.cpp
  13. +3
    -3
      src/debug/lines.cpp
  14. +5
    -5
      src/gpu/framebuffer.cpp
  15. +2
    -2
      src/gpu/indexbuffer.cpp
  16. +45
    -45
      src/gpu/rendercontext.cpp
  17. +26
    -2
      src/gpu/renderer.cpp
  18. +2
    -2
      src/gpu/shader.cpp
  19. +2
    -2
      src/gpu/texture.cpp
  20. +4
    -4
      src/gpu/vertexbuffer.cpp
  21. +6
    -1
      src/lol/gpu/renderer.h
  22. +21
    -18
      src/lolcore.vcxproj.filters
  23. +1
    -1
      src/lolimgui.cpp
  24. +131
    -47
      src/platform/sdl/sdlapp.cpp
  25. +22
    -0
      src/platform/sdl/sdlapp.h
  26. +1
    -1
      src/platform/xbox/xboxapp.cpp
  27. +69
    -21
      src/scene.cpp
  28. +40
    -5
      src/scene.h
  29. +4
    -3
      src/ticker.cpp
  30. +6
    -4
      src/video.cpp

+ 44
- 50
build/Lol (vs2013).sln View File

@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.31101.0
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "deushax", "..\games\deushax\deushax.vcxproj", "{EF1A4E80-63FA-4EB0-B834-12B6C500F31C}"
EndProject
@@ -757,97 +757,91 @@ Global
{81C83B42-D00A-4FA3-9A3D-80F9D46524BF}.Release|x64.ActiveCfg = Release|x64
{81C83B42-D00A-4FA3-9A3D-80F9D46524BF}.Release|x64.Build.0 = Release|x64
{81C83B42-D00A-4FA3-9A3D-80F9D46524BF}.Release|Xbox 360.ActiveCfg = Release|Win32
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|ORBIS.ActiveCfg = Debug|ORBIS
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|ORBIS.Build.0 = Debug|ORBIS
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|ORBIS.ActiveCfg = Debug|Win32
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Win32.ActiveCfg = Debug|Win32
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Win32.Build.0 = Debug|Win32
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|x64.ActiveCfg = Debug|x64
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|x64.Build.0 = Debug|x64
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Xbox 360.ActiveCfg = Debug|Xbox 360
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Xbox 360.Build.0 = Debug|Xbox 360
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|ORBIS.ActiveCfg = Release|ORBIS
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|ORBIS.Build.0 = Release|ORBIS
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Debug|Xbox 360.ActiveCfg = Debug|Win32
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|ORBIS.ActiveCfg = Release|Win32
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Win32.ActiveCfg = Release|Win32
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Win32.Build.0 = Release|Win32
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|x64.ActiveCfg = Release|x64
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|x64.Build.0 = Release|x64
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Xbox 360.ActiveCfg = Release|Xbox 360
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Xbox 360.Build.0 = Release|Xbox 360
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Xbox 360.Deploy.0 = Release|Xbox 360
{B9A255A0-2B92-4801-AF6C-354535A6E105}.Release|Xbox 360.ActiveCfg = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{928A359C-9C41-400A-8D2D-A054B33A79F5} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{9EA99B18-D352-47F6-BC04-A0B49CAA2772} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{0A1651FC-322B-4B04-82CB-28E9046D9383} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{E27FDF36-50C4-4ED2-8CF5-A20FED016910} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{454DE15C-9063-4EB1-AD6C-77D7150F15DF} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{2F87CEAB-4818-443C-A5E3-6C34E7D967EC} = {1DFE1729-4F1B-47CA-9819-72431FE14E25}
{33704AA4-F2B5-4138-A40D-E3E77F89ED46} = {1DFE1729-4F1B-47CA-9819-72431FE14E25}
{8C77EAA8-1077-4EF7-AE53-97C6C60A3601} = {1DFE1729-4F1B-47CA-9819-72431FE14E25}
{50509BA3-D27B-4FAC-9772-9EC76146F709} = {1DFE1729-4F1B-47CA-9819-72431FE14E25}
{65114D40-9450-4B2D-B051-7A75E97C88E1} = {1DFE1729-4F1B-47CA-9819-72431FE14E25}
{08C6A854-533D-4A1E-924E-C4A62281869F} = {928A359C-9C41-400A-8D2D-A054B33A79F5}
{9C66B179-0737-4BDA-AB42-2ADE478A9008} = {08C6A854-533D-4A1E-924E-C4A62281869F}
{EF1A4E80-63FA-4EB0-B834-12B6C500F31C} = {08C6A854-533D-4A1E-924E-C4A62281869F}
{17F0F184-4436-4D08-B8AA-16572EA238DB} = {2F87CEAB-4818-443C-A5E3-6C34E7D967EC}
{9C66B179-0737-4BDA-AB42-2ADE478A9008} = {08C6A854-533D-4A1E-924E-C4A62281869F}
{08C6A854-533D-4A1E-924E-C4A62281869F} = {928A359C-9C41-400A-8D2D-A054B33A79F5}
{2F87CEAB-4818-443C-A5E3-6C34E7D967EC} = {1DFE1729-4F1B-47CA-9819-72431FE14E25}
{9E62F2FE-3408-4EAE-8238-FD84238CEEDA} = {1AFD580B-98B8-4689-B661-38C41132C60E}
{83D3B207-C601-4025-8F41-01DEDC354661} = {1AFD580B-98B8-4689-B661-38C41132C60E}
{D84021CA-B233-4E0F-8A52-071B83BBCCC4} = {1AFD580B-98B8-4689-B661-38C41132C60E}
{8F59A635-0240-4D7F-A80D-050C3F1670C2} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E}
{E4DFEBF9-C310-462F-9876-7EB59C1E4D4E} = {1AFD580B-98B8-4689-B661-38C41132C60E}
{9E62F2FE-3408-4EAE-8238-FD84238CEEDA} = {1AFD580B-98B8-4689-B661-38C41132C60E}
{962D4E25-45D3-4ACE-8C02-69FA3713ABD4} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E}
{1782F849-B6E1-466D-9F02-A751F3F8712C} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E}
{5A27FF18-A1EC-49BE-9455-415F1C701153} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E}
{D7F6C2CA-5A13-4FD0-8468-1833923E3EE3} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E}
{B1E10086-A1DA-401A-834D-969C9DBB5CC1} = {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA}
{8F59A635-0240-4D7F-A80D-050C3F1670C2} = {E4DFEBF9-C310-462F-9876-7EB59C1E4D4E}
{E74CF679-CA2A-47E9-B1F4-3779D6AC6B04} = {65FD48E9-C936-4A23-AD46-BF738B6D4733}
{B6297FF2-63D0-41EE-BE13-EFF720C9B0FA} = {65FD48E9-C936-4A23-AD46-BF738B6D4733}
{B92ABADC-45BE-4CC5-B724-9426053123A1} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{1C5B8702-290C-42DA-AA9E-671348F5B747} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{6BF81B39-EDC2-4227-9992-C2D8ABEA95AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{33704AA4-F2B5-4138-A40D-E3E77F89ED46} = {1DFE1729-4F1B-47CA-9819-72431FE14E25}
{BCEE0132-8E24-49BE-AFEB-96DAD14396BA} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{834852DB-EDB6-4FD0-BCF9-45CD01126962} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{6BF81B39-EDC2-4227-9982-C2D8ABEA95AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{572E5B9C-7E19-489C-BD8A-E8401CFBBC47} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{F59FA82C-DDB9-4EE2-80AE-CB0E4C6567A4} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{81C83B42-D00A-4FA3-9A3D-80F9D46524BF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{32F3F8CF-D22E-45E4-BEB8-AD909E8C5515} = {33704AA4-F2B5-4138-A40D-E3E77F89ED46}
{8C77EAA8-1077-4EF7-AE53-97C6C60A3601} = {1DFE1729-4F1B-47CA-9819-72431FE14E25}
{EE203B88-44CF-4859-9D42-7A5F40FECB52} = {8C77EAA8-1077-4EF7-AE53-97C6C60A3601}
{B357514A-7881-422D-8358-161B689E7620} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5}
{2195FB18-53BF-48AF-96B6-9BD242924EA5} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5}
{4C4BD478-3767-4C27-BD91-DAAFE7CD03A2} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5}
{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233} = {B357514A-7881-422D-8358-161B689E7620}
{9EA99B18-D352-47F6-BC04-A0B49CAA2772} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{EE203B88-44CF-4859-9D42-7A5F43FECB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{25493FC8-75AC-4703-AD58-AB0C4A0FB79C} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{6BF81B39-EDC2-4127-9982-C2D8ABEA95AF} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{EE203B88-44CF-4829-9D42-7A5F43FECB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{7422B977-CA61-49BF-A586-F57B6FF9BD64} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{DB344310-4938-4294-AEE2-18512454585D} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{EE203B88-44CF-4859-9D42-7A5F45FEDB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{EE203B88-44CF-4859-9D42-7A4F43FEDB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E} = {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA}
{EE203B88-44CF-4859-9D42-7A1F43FECB52} = {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA}
{BCEE0132-8E24-49BE-AFEB-96DAD14396BA} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{0A1651FC-322B-4B04-82CB-28E9046D9383} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{B1E10086-A1DA-401A-834D-969C9DBB5CC1} = {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA}
{A69411B3-6DE8-404E-8E70-0D3375A7492A} = {0A1651FC-322B-4B04-82CB-28E9046D9383}
{928A359C-9C41-400A-8D2D-A054B33A79F5} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{E27FDF36-50C4-4ED2-8CF5-A20FED016910} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{C2E01551-B636-4324-8461-71811DF6FBB5} = {E27FDF36-50C4-4ED2-8CF5-A20FED016910}
{B0A53D75-CBB4-4FDF-93AC-2D12A79ADA0E} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{5A77DCDD-2CBA-43E9-8B45-00C281443F77} = {0A1651FC-322B-4B04-82CB-28E9046D9383}
{834852DB-EDB6-4FD0-BCF9-45CD01126962} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{C2E01551-B636-4324-8461-71811DF6FBB5} = {E27FDF36-50C4-4ED2-8CF5-A20FED016910}
{FAF82AD2-D9F4-4694-9A01-103BC5B771B4} = {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0}
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E} = {B6297FF2-63D0-41EE-BE13-EFF720C9B0FA}
{25493FC8-75AC-4703-AD58-AB0C4A0FB79C} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{6BF81B39-EDC2-4227-9982-C2D8ABEA95AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{6BF81B39-EDC2-4127-9982-C2D8ABEA95AF} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{AA376B9B-484B-4DC4-982F-6CFA645E441E} = {F7D4A671-612F-4FF4-883F-2097697694B7}
{F7D4A671-612F-4FF4-883F-2097697694B7} = {E5C5E320-C077-4362-9A3F-3920C6447601}
{572E5B9C-7E19-489C-BD8A-E8401CFBBC47} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{E05E23A5-67DE-42B5-98A3-E63CCE0CC0AF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{52493826-AC00-470B-A745-4F602529B3B0} = {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0}
{9F291982-8C81-4105-BF39-16844648E55F} = {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0}
{950EDCC1-DF6A-4A75-B083-DFE98E7DD34F} = {B583BBFF-BE97-4F4E-BA1E-1F978A31EAB0}
{50509BA3-D27B-4FAC-9772-9EC76146F709} = {1DFE1729-4F1B-47CA-9819-72431FE14E25}
{F7D4A671-612F-4FF4-883F-2097697694B7} = {E5C5E320-C077-4362-9A3F-3920C6447601}
{AA376B9B-484B-4DC4-982F-6CFA645E441E} = {F7D4A671-612F-4FF4-883F-2097697694B7}
{5D994A3B-83BF-4FCB-9AC1-E7B642B46FEA} = {50509BA3-D27B-4FAC-9772-9EC76146F709}
{454DE15C-9063-4EB1-AD6C-77D7150F15DF} = {5F1AAF03-7202-4C07-B99F-EB397105B1B7}
{C3E2D690-F2B4-4A11-B317-D5CB8EF9561A} = {454DE15C-9063-4EB1-AD6C-77D7150F15DF}
{EE203B88-44CF-4829-9D42-7A5F43FECB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{7422B977-CA61-49BF-A586-F57B6FF9BD64} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{DB344310-4938-4294-AEE2-18512454585D} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{2195FB18-53BF-48AF-96B6-9BD242924EA5} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5}
{FFF58874-D460-41E6-AD65-DBFEC6E47A94} = {2195FB18-53BF-48AF-96B6-9BD242924EA5}
{E4DFEBF9-C310-462F-9876-7EB59C1E4D4E} = {1AFD580B-98B8-4689-B661-38C41132C60E}
{EE203B88-44CF-4859-9D42-7A5F45FEDB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{F59FA82C-DDB9-4EE2-80AE-CB0E4C6567A4} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{4C4BD478-3767-4C27-BD91-DAAFE7CD03A2} = {3D341D8A-E400-4B1D-BC05-B5C35487D9B5}
{73F1A804-1116-46C3-922A-9C0ADEB33F52} = {4C4BD478-3767-4C27-BD91-DAAFE7CD03A2}
{B6297FF2-63D0-41EE-BE13-EFF720C9B0FA} = {65FD48E9-C936-4A23-AD46-BF738B6D4733}
{EE203B88-44CF-4859-9D42-7A4F43FEDB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{81C83B42-D00A-4FA3-9A3D-80F9D46524BF} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{65114D40-9450-4B2D-B051-7A75E97C88E1} = {1DFE1729-4F1B-47CA-9819-72431FE14E25}
{B9A255A0-2B92-4801-AF6C-354535A6E105} = {65114D40-9450-4B2D-B051-7A75E97C88E1}
EndGlobalSection
EndGlobal

+ 1
- 1
doc/samples/btphystest.cpp View File

@@ -307,7 +307,7 @@ void BtPhysTest::TickGame(float seconds)

if (!m_init_status)
{
if (g_renderer)
if (Renderer::GetCount())
InitApp();
return;
}


+ 9
- 3
doc/samples/meshviewer/meshviewer.cpp View File

@@ -162,7 +162,7 @@ void MeshViewer::Start()
m_entities << (m_file_loader = new DefaultThreadManager(4, 0));

//Scene setup
m_ssetup_file_name = "data/meshviewer.init.lua";
m_ssetup_file_name = "../data/meshviewer.init.lua";
UpdateSceneSetup();

//Mesh file
@@ -394,6 +394,12 @@ int main(int argc, char **argv)
new MeshViewer(argv[1]);
else
new MeshViewer();
/*
//SceneDisplay* display = new ApplicationDisplay("newDisplay", ivec2(800, 600));
//SceneDisplay::Add(display);
//Scene::GetScene(Scene::GetCount() - 1).SetDisplay(display);
*/

app.Run();

return EXIT_SUCCESS;
@@ -932,7 +938,7 @@ void MeshViewer::Draw(float seconds, Scene &scene)
m_texture_shader->SetUniform(m_texture_uni, m_default_texture->GetTexture(), 0);
#endif //!HAS_WEB && WITH_TEXTURE

g_renderer->SetClearColor(m_ssetup->m_clear_color);
Renderer::Get()->SetClearColor(m_ssetup->m_clear_color);

for (int i = 0; i < m_gizmos.Count(); ++i)
{
@@ -1043,7 +1049,7 @@ void MeshViewer::Draw(float seconds, Scene &scene)
mat4 new_proj = mat_obj_offset * mat_count_offset * mat_align * mat_count_scale * save_proj;
m_camera->SetProjection(new_proj);
m_meshes[i].m1->Render(scene, m_mat);
g_renderer->Clear(ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Depth);
}
m_camera->SetProjection(save_proj);
#else


+ 1
- 1
doc/tutorial/02_cube.cpp View File

@@ -93,7 +93,7 @@ public:
m_ready = true;
}

g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
Renderer::Get()->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));

m_shader->Bind();
m_vdecl->SetStream(m_vbo, m_coord, m_color);


+ 1
- 1
doc/tutorial/05_easymesh.cpp View File

@@ -126,7 +126,7 @@ public:

if (!m_ready)
{
g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
Renderer::Get()->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));

/* Upload vertex data to GPU */
for (int i = 0; i < m_gears.Count(); i++)


+ 1
- 1
doc/tutorial/06_sprite.cpp View File

@@ -70,7 +70,7 @@ public:

if (!m_ready)
{
g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
Renderer::Get()->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
m_ready = true;
}



+ 1
- 1
doc/tutorial/07_input.cpp View File

@@ -189,7 +189,7 @@ public:
m_ready = true;
}

g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
Renderer::Get()->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));

m_shader->Bind();
m_vdecl->SetStream(m_vbo, m_coord, m_color);


+ 1
- 1
doc/tutorial/08_fbo.cpp View File

@@ -78,7 +78,7 @@ public:
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
g_renderer->Clear(ClearMask::Color | ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth);
}

m_fbo->Unbind();


+ 8
- 8
doc/tutorial/12_voronoi.cpp View File

@@ -145,7 +145,7 @@ public:
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
g_renderer->Clear(ClearMask::Color | ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth);
}
m_fbos.Last().m1->Unbind();
}
@@ -156,7 +156,7 @@ public:
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
g_renderer->Clear(ClearMask::Color | ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth);
}
temp_buffer->Unbind();

@@ -220,7 +220,7 @@ public:
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
g_renderer->Clear(ClearMask::Color | ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth);
}
temp_buffer->Unbind();

@@ -250,7 +250,7 @@ public:
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
g_renderer->Clear(ClearMask::Color | ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth);
}
m_fbos[f].m1->Unbind();

@@ -273,7 +273,7 @@ public:

dst_buf->Bind();
/* FIXME: we should just disable depth test in the shader */
g_renderer->Clear(ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Depth);
m_fbos[f].m2->Bind();

int i = 0;
@@ -292,7 +292,7 @@ public:
}
}

g_renderer->Clear(ClearMask::Color | ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth);

//FRAME BUFFER DRAW
m_timer -= seconds;
@@ -304,7 +304,7 @@ public:
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
g_renderer->Clear(ClearMask::Color | ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth);
}
m_fbos[m_cur_fbo].m1->Unbind();

@@ -335,7 +335,7 @@ public:

dst_buf->Bind();
/* FIXME: we should just disable depth test in the shader */
g_renderer->Clear(ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Depth);
shader->Bind();

//08_FBO ??


+ 82
- 0
src/application/application.cpp View File

@@ -32,6 +32,87 @@
namespace lol
{

//-----------------------------------------------------------------------------
class ApplicationDisplayData
{
friend class ApplicationDisplay;

ApplicationDisplayData(char const *name, ivec2 resolution)
: display(name, resolution)
{ }

protected:
void SetResolution(ivec2 resolution)
{
display.SetResolution(resolution);
}
void SetPosition(ivec2 position)
{
display.SetPosition(position);
}
void Enable()
{
display.Enable();
}
void Disable()
{
display.Disable();
}

#if _XBOX
//NOT HANDLED YET
#elif __native_client__
//NOT HANDLED YET
#elif __ANDROID__
//NOT HANDLED YET
#elif USE_SDL || USE_OLD_SDL
SdlAppDisplay display;
#elif HAVE_GLES_2X
/* FIXME: this macro is only deactivated if we include "lolgl.h" */
//NOT HANDLED YET
#else
# error No application class available on this platform
#endif
};

ApplicationDisplay::ApplicationDisplay(char const *name, ivec2 resolution)
{
data = new ApplicationDisplayData(name, resolution);
}

ApplicationDisplay::~ApplicationDisplay()
{
delete data;
}

void ApplicationDisplay::SetResolution(ivec2 resolution)
{
super::SetResolution(resolution);

data->SetResolution(resolution);
}
void ApplicationDisplay::SetPosition(ivec2 position)
{
super::SetPosition(position);

data->SetPosition(position);
}

void ApplicationDisplay::Enable()
{
super::Enable();

data->Enable();
}

void ApplicationDisplay::Disable()
{
data->Disable();

super::Disable();
}
//-----------------------------------------------------------------------------
class ApplicationData
{
friend class Application;
@@ -71,6 +152,7 @@ static void AppCallback()

Application::Application(char const *name, ivec2 resolution, float framerate)
{
SceneDisplay::Add(new ApplicationDisplay(name, resolution));
data = new ApplicationData(name, resolution, framerate);
g_world.ExecLuaFile("lua/init.lua");
}


+ 25
- 0
src/application/application.h View File

@@ -18,6 +18,31 @@
namespace lol
{

//-----------------------------------------------------------------------------
class ApplicationDisplayData;

class ApplicationDisplay : public SceneDisplay
{
typedef SceneDisplay super;
friend class Scene;

public:
ApplicationDisplay(char const *name, ivec2 resolution);
virtual ~ApplicationDisplay();

/* pos/size/... methods */
virtual void SetResolution(ivec2 resolution);
virtual void SetPosition(ivec2 position);

protected:
virtual void Enable();
virtual void Disable();

private:
ApplicationDisplayData *data;
};

//-----------------------------------------------------------------------------
class ApplicationData;

class Application


+ 1
- 1
src/camera.cpp View File

@@ -29,7 +29,7 @@ Camera::Camera()
m_drawgroup = DRAWGROUP_CAMERA;

//Arbitrary values when g_renderer is not ready.
ivec2 screen_size = (g_renderer)?(Video::GetSize()):(ivec2(800, 600));
ivec2 screen_size = (Renderer::GetCount()) ? (Video::GetSize()) : (ivec2(800, 600));
m_fov = 45.f;
m_near = -1000.f;
m_far = 1000.f;


+ 3
- 3
src/debug/lines.cpp View File

@@ -273,14 +273,14 @@ void Debug::DrawBox(vec2 a, vec2 b, mat2 transform, vec4 color)
}
void Debug::DrawBox(vec2 a, float s, mat2 transform, vec4 color)
{
vec2 b = s * vec2(1.f, g_renderer->GetXYRatio());
vec2 b = s * vec2(1.f, Renderer::Get()->GetXYRatio());
Debug::DrawBox(a - b, a + b, transform, color);
}

//-- CIRCLE -------------------------------------------------------------------
void Debug::DrawCircle(vec2 a, float s) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, s * vec2(1.f, g_renderer->GetXYRatio()), scene.GetLineColor()); }
void Debug::DrawCircle(vec2 a, float s) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, s * vec2(1.f, Renderer::Get()->GetXYRatio()), scene.GetLineColor()); }
void Debug::DrawCircle(vec3 a, vec3 n) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, n, scene.GetLineColor()); }
void Debug::DrawCircle(vec2 a, vec2 s) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, s * vec2(1.f, g_renderer->GetXYRatio()), scene.GetLineColor()); }
void Debug::DrawCircle(vec2 a, vec2 s) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, s * vec2(1.f, Renderer::Get()->GetXYRatio()), scene.GetLineColor()); }
void Debug::DrawCircle(vec3 a, vec3 x, vec3 y) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, x, y, scene.GetLineColor()); }
void Debug::DrawCircle(vec2 a, vec2 x, vec2 y) { Scene& scene = Scene::GetScene(); Debug::DrawCircle(a, x, y, scene.GetLineColor()); }
void Debug::DrawCircle(vec3 a, vec3 n, vec4 color)


+ 5
- 5
src/gpu/framebuffer.cpp View File

@@ -304,7 +304,7 @@ Framebuffer::Framebuffer(ivec2 size, FramebufferFormat fbo_format)
m_data->m_size = size;
m_data->m_bound = false;
#if defined USE_D3D9
m_data->m_dev = (IDirect3DDevice9 *)g_renderer->GetDevice();
m_data->m_dev = (IDirect3DDevice9 *)Renderer::Get()->GetDevice();

if (FAILED(m_data->m_dev->CreateTexture(size.x, size.y, 1,
D3DUSAGE_RENDERTARGET,
@@ -315,7 +315,7 @@ Framebuffer::Framebuffer(ivec2 size, FramebufferFormat fbo_format)
if (FAILED(m_data->m_texture->GetSurfaceLevel(0, &m_data->m_surface)))
Abort();
#elif defined _XBOX
m_data->m_dev = (D3DDevice *)g_renderer->GetDevice();
m_data->m_dev = (D3DDevice *)Renderer::Get()->GetDevice();

if (FAILED(m_data->m_dev->CreateTexture(size.x, size.y, 1, 0,
(D3DFORMAT)fbo_format.GetFormat(),
@@ -474,8 +474,8 @@ void Framebuffer::Bind()
/* FIXME: this should be done in the RenderContext object
* instead, maybe by getting rid of Framebuffer::Bind() and
* creating RenderContext::SetFramebuffer() instead. */
m_data->m_saved_viewport = g_renderer->GetViewport();
g_renderer->SetViewport(ibox2(ivec2::zero, m_data->m_size));
m_data->m_saved_viewport = Renderer::Get()->GetViewport();
Renderer::Get()->SetViewport(ibox2(ivec2::zero, m_data->m_size));
m_data->m_bound = true;
}

@@ -501,7 +501,7 @@ void Framebuffer::Unbind()
# endif
#endif

g_renderer->SetViewport(m_data->m_saved_viewport);
Renderer::Get()->SetViewport(m_data->m_saved_viewport);
m_data->m_bound = false;
}



+ 2
- 2
src/gpu/indexbuffer.cpp View File

@@ -61,9 +61,9 @@ IndexBuffer::IndexBuffer(size_t size)
return;
#if defined USE_D3D9 || defined _XBOX
# if defined USE_D3D9
m_data->m_dev = (IDirect3DDevice9 *)g_renderer->GetDevice();
m_data->m_dev = (IDirect3DDevice9 *)Renderer::Get()->GetDevice();
# elif defined _XBOX
m_data->m_dev = (D3DDevice *)g_renderer->GetDevice();
m_data->m_dev = (D3DDevice *)Renderer::Get()->GetDevice();
# endif

if (FAILED(m_data->m_dev->CreateIndexBuffer(size, D3DUSAGE_WRITEONLY,


+ 45
- 45
src/gpu/rendercontext.cpp View File

@@ -73,33 +73,33 @@ RenderContext::RenderContext()
RenderContext::~RenderContext()
{
if (m_data->m_viewport.HasChanged())
g_renderer->SetViewport(m_data->m_viewport.GetValue());
Renderer::Get()->SetViewport(m_data->m_viewport.GetValue());

if (m_data->m_clear_color.HasChanged())
g_renderer->SetClearColor(m_data->m_clear_color.GetValue());
Renderer::Get()->SetClearColor(m_data->m_clear_color.GetValue());

if (m_data->m_clear_depth.HasChanged())
g_renderer->SetClearDepth(m_data->m_clear_depth.GetValue());
Renderer::Get()->SetClearDepth(m_data->m_clear_depth.GetValue());

if (m_data->m_alpha_func.HasChanged())
g_renderer->SetAlphaFunc(m_data->m_alpha_func.GetValue(),
Renderer::Get()->SetAlphaFunc(m_data->m_alpha_func.GetValue(),
m_data->m_alpha_value.GetValue());

if (m_data->m_blend_src.HasChanged())
g_renderer->SetBlendFunc(m_data->m_blend_src.GetValue(),
Renderer::Get()->SetBlendFunc(m_data->m_blend_src.GetValue(),
m_data->m_blend_dst.GetValue());

if (m_data->m_depth_func.HasChanged())
g_renderer->SetDepthFunc(m_data->m_depth_func.GetValue());
Renderer::Get()->SetDepthFunc(m_data->m_depth_func.GetValue());

if (m_data->m_depth_mask.HasChanged())
g_renderer->SetDepthMask(m_data->m_depth_mask.GetValue());
Renderer::Get()->SetDepthMask(m_data->m_depth_mask.GetValue());

if (m_data->m_cull_mode.HasChanged())
g_renderer->SetCullMode(m_data->m_cull_mode.GetValue());
Renderer::Get()->SetCullMode(m_data->m_cull_mode.GetValue());

if (m_data->m_polygon_mode.HasChanged())
g_renderer->SetPolygonMode(m_data->m_polygon_mode.GetValue());
Renderer::Get()->SetPolygonMode(m_data->m_polygon_mode.GetValue());

delete m_data;
}
@@ -107,152 +107,152 @@ RenderContext::~RenderContext()
void RenderContext::SetViewport(ibox2 viewport)
{
if (!m_data->m_viewport.HasChanged())
m_data->m_viewport.TrackValue(g_renderer->GetViewport());
m_data->m_viewport.TrackValue(Renderer::Get()->GetViewport());

g_renderer->SetViewport(viewport);
Renderer::Get()->SetViewport(viewport);
}

ibox2 RenderContext::GetViewport()
{
return g_renderer->GetViewport();
return Renderer::Get()->GetViewport();
}

void RenderContext::SetClearColor(vec4 color)
{
if (!m_data->m_clear_color.HasChanged())
m_data->m_clear_color.TrackValue(g_renderer->GetClearColor());
m_data->m_clear_color.TrackValue(Renderer::Get()->GetClearColor());

g_renderer->SetClearColor(color);
Renderer::Get()->SetClearColor(color);
}

vec4 RenderContext::GetClearColor()
{
return g_renderer->GetClearColor();
return Renderer::Get()->GetClearColor();
}

void RenderContext::SetClearDepth(float depth)
{
if (!m_data->m_clear_depth.HasChanged())
m_data->m_clear_depth.TrackValue(g_renderer->GetClearDepth());
m_data->m_clear_depth.TrackValue(Renderer::Get()->GetClearDepth());

g_renderer->SetClearDepth(depth);
Renderer::Get()->SetClearDepth(depth);
}

float RenderContext::GetClearDepth()
{
return g_renderer->GetClearDepth();
return Renderer::Get()->GetClearDepth();
}

void RenderContext::SetAlphaFunc(AlphaFunc func, float alpha)
{
if (!m_data->m_alpha_func.HasChanged())
m_data->m_alpha_func.TrackValue(g_renderer->GetAlphaFunc());
m_data->m_alpha_func.TrackValue(Renderer::Get()->GetAlphaFunc());
if (!m_data->m_alpha_value.HasChanged())
m_data->m_alpha_value.TrackValue(g_renderer->GetAlphaValue());
m_data->m_alpha_value.TrackValue(Renderer::Get()->GetAlphaValue());

g_renderer->SetAlphaFunc(func, alpha);
Renderer::Get()->SetAlphaFunc(func, alpha);
}

AlphaFunc RenderContext::GetAlphaFunc()
{
return g_renderer->GetAlphaFunc();
return Renderer::Get()->GetAlphaFunc();
}

float RenderContext::GetAlphaValue()
{
return g_renderer->GetAlphaValue();
return Renderer::Get()->GetAlphaValue();
}

void RenderContext::SetBlendEquation(BlendEquation rgb, BlendEquation alpha)
{
if (!m_data->m_blend_rgb.HasChanged())
m_data->m_blend_rgb.TrackValue(g_renderer->GetBlendEquationRgb());
m_data->m_blend_rgb.TrackValue(Renderer::Get()->GetBlendEquationRgb());
if (!m_data->m_blend_alpha.HasChanged())
m_data->m_blend_alpha.TrackValue(g_renderer->GetBlendEquationAlpha());
m_data->m_blend_alpha.TrackValue(Renderer::Get()->GetBlendEquationAlpha());

g_renderer->SetBlendEquation(rgb, alpha);
Renderer::Get()->SetBlendEquation(rgb, alpha);
}

BlendEquation RenderContext::GetBlendEquationRgb()
{
return g_renderer->GetBlendEquationRgb();
return Renderer::Get()->GetBlendEquationRgb();
}

BlendEquation RenderContext::GetBlendEquationAlpha()
{
return g_renderer->GetBlendEquationAlpha();
return Renderer::Get()->GetBlendEquationAlpha();
}

void RenderContext::SetBlendFunc(BlendFunc src, BlendFunc dst)
{
if (!m_data->m_blend_src.HasChanged())
m_data->m_blend_src.TrackValue(g_renderer->GetBlendFuncSrc());
m_data->m_blend_src.TrackValue(Renderer::Get()->GetBlendFuncSrc());
if (!m_data->m_blend_dst.HasChanged())
m_data->m_blend_dst.TrackValue(g_renderer->GetBlendFuncDst());
m_data->m_blend_dst.TrackValue(Renderer::Get()->GetBlendFuncDst());

g_renderer->SetBlendFunc(src, dst);
Renderer::Get()->SetBlendFunc(src, dst);
}

BlendFunc RenderContext::GetBlendFuncSrc()
{
return g_renderer->GetBlendFuncSrc();
return Renderer::Get()->GetBlendFuncSrc();
}

BlendFunc RenderContext::GetBlendFuncDst()
{
return g_renderer->GetBlendFuncDst();
return Renderer::Get()->GetBlendFuncDst();
}

void RenderContext::SetDepthFunc(DepthFunc func)
{
if (!m_data->m_depth_func.HasChanged())
m_data->m_depth_func.TrackValue(g_renderer->GetDepthFunc());
m_data->m_depth_func.TrackValue(Renderer::Get()->GetDepthFunc());

g_renderer->SetDepthFunc(func);
Renderer::Get()->SetDepthFunc(func);
}

DepthFunc RenderContext::GetDepthFunc()
{
return g_renderer->GetDepthFunc();
return Renderer::Get()->GetDepthFunc();
}

void RenderContext::SetDepthMask(DepthMask mask)
{
if (!m_data->m_depth_mask.HasChanged())
m_data->m_depth_mask.TrackValue(g_renderer->GetDepthMask());
m_data->m_depth_mask.TrackValue(Renderer::Get()->GetDepthMask());

g_renderer->SetDepthMask(mask);
Renderer::Get()->SetDepthMask(mask);
}

DepthMask RenderContext::GetDepthMask()
{
return g_renderer->GetDepthMask();
return Renderer::Get()->GetDepthMask();
}

void RenderContext::SetCullMode(CullMode mode)
{
if (!m_data->m_cull_mode.HasChanged())
m_data->m_cull_mode.TrackValue(g_renderer->GetCullMode());
m_data->m_cull_mode.TrackValue(Renderer::Get()->GetCullMode());

g_renderer->SetCullMode(mode);
Renderer::Get()->SetCullMode(mode);
}

CullMode RenderContext::GetCullMode()
{
return g_renderer->GetCullMode();
return Renderer::Get()->GetCullMode();
}

void RenderContext::SetPolygonMode(PolygonMode mode)
{
if (!m_data->m_polygon_mode.HasChanged())
m_data->m_polygon_mode.TrackValue(g_renderer->GetPolygonMode());
m_data->m_polygon_mode.TrackValue(Renderer::Get()->GetPolygonMode());

g_renderer->SetPolygonMode(mode);
Renderer::Get()->SetPolygonMode(mode);
}

PolygonMode RenderContext::GetPolygonMode()
{
return g_renderer->GetPolygonMode();
return Renderer::Get()->GetPolygonMode();
}

} /* namespace lol */


+ 26
- 2
src/gpu/renderer.cpp View File

@@ -39,10 +39,11 @@ namespace lol
{

/*
* The global g_renderer object, initialised by Video::Init
* The global g_renderers object, initialised by Video::Setup
*/

Renderer *g_renderer = nullptr;
//Renderer *g_renderer = nullptr;
array<Renderer*> g_renderers;

/*
* Private RendererData class
@@ -225,6 +226,29 @@ void Renderer::Clear(ClearMask mask)
#endif
}

/*
* Renderer static
*/

void Renderer::AddNew(ivec2 size)
{
g_renderers << new Renderer(size);
}
ptrdiff_t Renderer::GetCount()
{
return g_renderers.count();
}
Renderer* Renderer::Get(ptrdiff_t index)
{
return g_renderers[index];
}
void Renderer::DestroyAll()
{
for (Renderer* renderer : g_renderers)
delete renderer;
g_renderers.empty();
}

/*
* Viewport dimensions
*/


+ 2
- 2
src/gpu/shader.cpp View File

@@ -259,9 +259,9 @@ Shader::Shader(String const &name,
data->vert_crc = ShaderData::Hash(vert);
#if defined USE_D3D9 || defined _XBOX
# if defined USE_D3D9
data->m_dev = (IDirect3DDevice9 *)g_renderer->GetDevice();
data->m_dev = (IDirect3DDevice9 *)Renderer::Get()->GetDevice();
# elif defined _XBOX
data->m_dev = (D3DDevice *)g_renderer->GetDevice();
data->m_dev = (D3DDevice *)Renderer::Get()->GetDevice();
# endif

hr = D3DXCompileShader(vert, (UINT)strlen(vert), macros, nullptr, "main",


+ 2
- 2
src/gpu/texture.cpp View File

@@ -70,9 +70,9 @@ Texture::Texture(ivec2 size, PixelFormat format)

#if defined USE_D3D9 || defined _XBOX
# if defined USE_D3D9
m_data->m_dev = (IDirect3DDevice9 *)g_renderer->GetDevice();
m_data->m_dev = (IDirect3DDevice9 *)Renderer::Get()->GetDevice();
# elif defined _XBOX
m_data->m_dev = (D3DDevice *)g_renderer->GetDevice();
m_data->m_dev = (D3DDevice *)Renderer::Get()->GetDevice();
# endif

static struct


+ 4
- 4
src/gpu/vertexbuffer.cpp View File

@@ -529,9 +529,9 @@ void VertexDeclaration::Initialize()
elements[m_count] = end_element[0];

# if defined USE_D3D9
m_data->m_dev = (IDirect3DDevice9 *)g_renderer->GetDevice();
m_data->m_dev = (IDirect3DDevice9 *)Renderer::Get()->GetDevice();
# elif defined _XBOX
m_data->m_dev = (D3DDevice *)g_renderer->GetDevice();
m_data->m_dev = (D3DDevice *)Renderer::Get()->GetDevice();
# endif

if (FAILED(m_data->m_dev->CreateVertexDeclaration(elements,
@@ -614,9 +614,9 @@ VertexBuffer::VertexBuffer(size_t size)
return;
#if defined USE_D3D9 || defined _XBOX
# if defined USE_D3D9
m_data->m_dev = (IDirect3DDevice9 *)g_renderer->GetDevice();
m_data->m_dev = (IDirect3DDevice9 *)Renderer::Get()->GetDevice();
# elif defined _XBOX
m_data->m_dev = (D3DDevice *)g_renderer->GetDevice();
m_data->m_dev = (D3DDevice *)Renderer::Get()->GetDevice();
# endif

if (FAILED(m_data->m_dev->CreateVertexBuffer(size, D3DUSAGE_WRITEONLY, nullptr,


+ 6
- 1
src/lol/gpu/renderer.h View File

@@ -137,6 +137,11 @@ public:

void *GetDevice();

static void AddNew(ivec2 size);
static ptrdiff_t GetCount();
static Renderer* Get(ptrdiff_t index = 0);
static void DestroyAll();

public:
void SetViewport(ibox2 viewport);
ibox2 GetViewport() const;
@@ -177,7 +182,7 @@ private:
RendererData *m_data;
};

extern Renderer *g_renderer;
//extern Renderer *g_renderer;

} /* namespace lol */


+ 21
- 18
src/lolcore.vcxproj.filters View File

@@ -97,6 +97,9 @@
<Filter Include="entities">
<UniqueIdentifier>{3bd5fe6f-c9cd-45f3-98a9-958d86d415e8}</UniqueIdentifier>
</Filter>
<Filter Include="display">
<UniqueIdentifier>{869f0b25-469b-4b06-a2a2-325449fc868f}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="image\crop.cpp">
@@ -225,9 +228,6 @@
<ClCompile Include="light.cpp">
<Filter>...</Filter>
</ClCompile>
<ClCompile Include="ticker.cpp">
<Filter>...</Filter>
</ClCompile>
<ClCompile Include="platform.cpp">
<Filter>...</Filter>
</ClCompile>
@@ -240,18 +240,12 @@
<ClCompile Include="sampler.cpp">
<Filter>...</Filter>
</ClCompile>
<ClCompile Include="scene.cpp">
<Filter>...</Filter>
</ClCompile>
<ClCompile Include="sprite.cpp">
<Filter>...</Filter>
</ClCompile>
<ClCompile Include="text.cpp">
<Filter>...</Filter>
</ClCompile>
<ClCompile Include="video.cpp">
<Filter>...</Filter>
</ClCompile>
<ClCompile Include="world.cpp">
<Filter>...</Filter>
</ClCompile>
@@ -425,6 +419,15 @@
<ClCompile Include="mesh\primitivemesh.cpp">
<Filter>mesh</Filter>
</ClCompile>
<ClCompile Include="ticker.cpp">
<Filter>display</Filter>
</ClCompile>
<ClCompile Include="video.cpp">
<Filter>display</Filter>
</ClCompile>
<ClCompile Include="scene.cpp">
<Filter>display</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="debug\fps.h">
@@ -577,9 +580,6 @@
<ClInclude Include="sampler.h">
<Filter>...</Filter>
</ClInclude>
<ClInclude Include="scene.h">
<Filter>...</Filter>
</ClInclude>
<ClInclude Include="simd.h">
<Filter>...</Filter>
</ClInclude>
@@ -589,12 +589,6 @@
<ClInclude Include="text.h">
<Filter>...</Filter>
</ClInclude>
<ClInclude Include="ticker.h">
<Filter>...</Filter>
</ClInclude>
<ClInclude Include="video.h">
<Filter>...</Filter>
</ClInclude>
<ClInclude Include="world.h">
<Filter>...</Filter>
</ClInclude>
@@ -792,6 +786,15 @@
<ClInclude Include="mesh\primitivemesh.h">
<Filter>mesh</Filter>
</ClInclude>
<ClInclude Include="ticker.h">
<Filter>display</Filter>
</ClInclude>
<ClInclude Include="video.h">
<Filter>display</Filter>
</ClInclude>
<ClInclude Include="scene.h">
<Filter>display</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<LolFxCompile Include="gpu\emptymaterial.lolfx">


+ 1
- 1
src/lolimgui.cpp View File

@@ -263,7 +263,7 @@ void LolImGui::TickDraw(float seconds, Scene &scene)
}
void PrimitiveLolImGui::Render(Scene& scene, PrimitiveSource* primitive)
{
g_renderer->Clear(ClearMask::Depth);
Renderer::Get()->Clear(ClearMask::Depth);

ImGuiIO& io = ImGui::GetIO();
if (io.Fonts->TexID)


+ 131
- 47
src/platform/sdl/sdlapp.cpp View File

@@ -39,12 +39,11 @@ namespace lol
{

/*
* SDL App implementation class
*/

class SdlAppData
* SDL App display implementation class
*/
class SdlAppDisplayData
{
friend class SdlApp;
friend class SdlAppDisplay;

private:
#if USE_SDL
@@ -56,28 +55,30 @@ private:
};

/*
* Public SdlApp class
*/

SdlApp::SdlApp(char const *title, ivec2 res, float fps) :
data(new SdlAppData())
* Public SdlApp class
*/
SdlAppDisplay::SdlAppDisplay(char const *title, ivec2 res)
: data(new SdlAppDisplayData())
{
#if USE_SDL || USE_OLD_SDL
ivec2 window_size = res;
ivec2 screen_size = res;

/* Initialise SDL */
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE) < 0)
if (!SDL_WasInit(0))
{
Log::Error("cannot initialise SDL: %s\n", SDL_GetError());
exit(EXIT_FAILURE);
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE) < 0)
{
Log::Error("cannot initialise SDL: %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
}

#if USE_SDL
data->m_window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
window_size.x, window_size.y,
SDL_WINDOW_OPENGL);
SDL_WINDOWPOS_UNDEFINED,
window_size.x, window_size.y,
SDL_WINDOW_OPENGL);
if (!data->m_window)
{
Log::Error("cannot create rendering window: %s\n", SDL_GetError());
@@ -87,7 +88,6 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) :
SDL_GetWindowSize(data->m_window, &res.x, &res.y);

data->m_glcontext = SDL_GL_CreateContext(data->m_window);

#else
const SDL_VideoInfo* vidinfo = SDL_GetVideoInfo();
screen_size = ivec2(vidinfo->current_w, vidinfo->current_h);
@@ -120,9 +120,122 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) :
res = ivec2(data->m_window->w, data->m_window->h);
#endif

/* Initialise everything */
Video::Setup(res); //TODO ?? Should it be here ?
#endif
}

SdlAppDisplay::~SdlAppDisplay()
{
#if USE_SDL
if (data->m_window)
{
SDL_GL_DeleteContext(data->m_glcontext);
SDL_DestroyWindow(data->m_window);
}
#elif USE_OLD_SDL
if (data->m_window)
SDL_FreeSurface(data->m_window);
#endif
delete data;
}

void SdlAppDisplay::SetResolution(ivec2 resolution)
{
#if USE_SDL
SDL_SetWindowSize(data->m_window, resolution.x, resolution.y);
#elif USE_OLD_SDL && USE_D3D9
//Not implemented
#elif USE_OLD_SDL
//Not implemented
#endif
}
void SdlAppDisplay::SetPosition(ivec2 position)
{
#if USE_SDL
SDL_SetWindowPosition(data->m_window, position.x, position.y);
#elif USE_OLD_SDL && USE_D3D9
//Not implemented
#elif USE_OLD_SDL
//Not implemented
#endif
}

void SdlAppDisplay::Enable()
{
#if USE_SDL
//TODO: Should we do that: ?
SDL_GL_MakeCurrent(data->m_window, data->m_glcontext);
#endif
#if (USE_SDL || USE_OLD_SDL) && defined USE_D3D9
IDirect3DDevice9 *d3d_dev = (IDirect3DDevice9 *)Renderer::Get()->GetDevice();
HRESULT hr;
hr = d3d_dev->BeginScene();
if (FAILED(hr))
Abort();
#endif
}

void SdlAppDisplay::Disable()
{
#if USE_SDL
SDL_GL_SwapWindow(data->m_window);
#elif USE_OLD_SDL && USE_D3D9
hr = d3d_dev->EndScene();
if (FAILED(hr))
Abort();
hr = d3d_dev->Present(nullptr, nullptr, nullptr, nullptr);
if (FAILED(hr))
Abort();
#elif USE_OLD_SDL
SDL_GL_SwapBuffers();
#endif
}

#if USE_SDL
ptrdiff_t SceneDisplay::GetPhysicalCount()
{
return (ptrdiff_t)SDL_GetNumVideoDisplays();
}
const char* SceneDisplay::GetPhysicalName(ptrdiff_t index)
{
return SDL_GetDisplayName((int)index);
}
#elif USE_OLD_SDL && USE_D3D9
// Not implemented
#elif USE_OLD_SDL
// Not implemented
#endif

/*
* SDL App implementation class
*/
class SdlAppData
{
friend class SdlApp;

private:
#if USE_SDL
SDL_Window *m_window;
SDL_GLContext m_glcontext;
#elif USE_OLD_SDL
SDL_Surface *m_window;
#endif
};

/*
* Public SdlApp class
*/
SdlApp::SdlApp(char const *title, ivec2 res, float fps) :
data(new SdlAppData())
{
#if USE_SDL || USE_OLD_SDL
ivec2 window_size = res;
ivec2 screen_size = res;

/* Initialise everything */
Ticker::Setup(fps);
Video::Setup(res);
Audio::Setup(2);

/* Autoreleased objects */
@@ -145,46 +258,17 @@ void SdlApp::ShowPointer(bool show)

void SdlApp::Tick()
{
#if (USE_SDL || USE_OLD_SDL) && defined USE_D3D9
IDirect3DDevice9 *d3d_dev = (IDirect3DDevice9 *)g_renderer->GetDevice();
HRESULT hr;
hr = d3d_dev->BeginScene();
if (FAILED(hr))
Abort();
#endif

/* Tick the renderer, show the frame and clamp to desired framerate. */
Ticker::TickDraw();

#if USE_SDL
SDL_GL_SwapWindow(data->m_window);
#elif USE_OLD_SDL && USE_D3D9
hr = d3d_dev->EndScene();
if (FAILED(hr))
Abort();
hr = d3d_dev->Present(nullptr, nullptr, nullptr, nullptr);
if (FAILED(hr))
Abort();
#elif USE_OLD_SDL
SDL_GL_SwapBuffers();
#endif
}

SdlApp::~SdlApp()
{
#if USE_SDL
if (data->m_window)
{
SDL_GL_DeleteContext(data->m_glcontext);
SDL_DestroyWindow(data->m_window);
}
SDL_Quit();
#elif USE_OLD_SDL
if (data->m_window)
SDL_FreeSurface(data->m_window);
SDL_Quit();
#endif

delete data;
}



+ 22
- 0
src/platform/sdl/sdlapp.h View File

@@ -20,6 +20,28 @@
namespace lol
{

//-----------------------------------------------------------------------------
class SdlAppDisplayData;

class SdlAppDisplay
{
friend class ApplicationDisplayData;
public:
SdlAppDisplay(char const *title, ivec2 resolution);
virtual ~SdlAppDisplay();

protected:
void SetResolution(ivec2 resolution);
void SetPosition(ivec2 position);

void Enable();
void Disable();

private:
SdlAppDisplayData *data;
};

//-----------------------------------------------------------------------------
class SdlAppData;

class SdlApp


+ 1
- 1
src/platform/xbox/xboxapp.cpp View File

@@ -60,7 +60,7 @@ void XboxApp::Tick()
Ticker::TickDraw();

#if defined _XBOX
D3DDevice *d3d_dev = (D3DDevice *)g_renderer->GetDevice();
D3DDevice *d3d_dev = (D3DDevice *)Renderer::Get()->GetDevice();
d3d_dev->Present(nullptr, nullptr, nullptr, nullptr);
#endif
}


+ 69
- 21
src/scene.cpp View File

@@ -46,8 +46,45 @@ struct Tile
int id, o;
};

//-----------------------------------------------------------------------------
static array<SceneDisplay*> m_scene_displays;

/*
* Scene implementation class
* Public SceneDisplay class
*/
void SceneDisplay::Add(SceneDisplay* display)
{
m_scene_displays << display;
}
ptrdiff_t SceneDisplay::GetCount()
{
return m_scene_displays.count();
}
SceneDisplay* SceneDisplay::GetDisplay(ptrdiff_t index)
{
ASSERT(0 <= index && index < m_scene_displays.count());
return m_scene_displays[index];
}
void SceneDisplay::DestroyAll()
{
for (SceneDisplay* display : m_scene_displays)
delete display;
m_scene_displays.Empty();
}

/* ------------------------------------------------ */
void SceneDisplay::Enable()
{
//TODO: PROFILER STUFF
}
void SceneDisplay::Disable()
{
//TODO: PROFILER STUFF
}

//-----------------------------------------------------------------------------
/*
* Primitive implementation class
*/
void PrimitiveSource::Render(Scene& scene) { UNUSED(scene); }
void PrimitiveRenderer::Render(Scene& scene, PrimitiveSource* primitive)
@@ -56,10 +93,10 @@ void PrimitiveRenderer::Render(Scene& scene, PrimitiveSource* primitive)
UNUSED(primitive);
}

//-----------------------------------------------------------------------------
/*
* Scene implementation class
*/

class SceneData
{
friend class Scene;
@@ -78,12 +115,15 @@ private:
static uint64_t m_used_id;
uint64_t m_mask_id = 0;

/* New scenegraph */
array<PrimitiveSource*> m_primitives;
/* Primitives are shared by all scenes.
/* Scene display: if none has been set to the scene,
* the default one created by the app will be used */
SceneDisplay* m_display = nullptr;

/* Sources are shared by all scenes.
* Renderers are scene-dependent. They get the primitive in the identical slot to render with the given scene
* Primitives and renderers will be kept until:
* - Updated by entity
* - Marked Fire&Forget
* - Scene is destroyed */
map<uintptr_t, array<PrimitiveRenderer*> > m_prim_renderers;
static map<uintptr_t, array<PrimitiveSource*> > m_prim_sources;
@@ -273,16 +313,6 @@ void Scene::Reset()
data->m_tile_bufs.Empty();

data->m_lights.Empty();

for (int i = 0; i < data->m_primitives.count(); i++)
delete data->m_primitives[i];
data->m_primitives.Empty();
}

//-----------------------------------------------------------------------------
void Scene::AddPrimitive(PrimitiveSource* primitive)
{
data->m_primitives.Push(primitive);
}

//---- Primitive source stuff -------------------------------------------------
@@ -481,17 +511,35 @@ array<Light *> const &Scene::GetLights()
return data->m_lights;
}

//-----------------------------------------------------------------------------
void Scene::SetDisplay(SceneDisplay* display)
{
data->m_display = display;
}

//-----------------------------------------------------------------------------
void Scene::EnableDisplay()
{
//If no display has been set, use the default one
if (!data->m_display)
SetDisplay(SceneDisplay::GetDisplay());
data->m_display->Enable();
}
void Scene::DisableDisplay()
{
ASSERT(data->m_display);
data->m_display->Disable();
}

//-----------------------------------------------------------------------------
void Scene::RenderPrimitives()
{
ASSERT(!!data, "Trying to access a non-ready scene");

/* TODO: this should be the main entry for rendering of all
* primitives found in the scene graph. When we have one. */
for (PrimitiveSource* p : data->m_primitives)
{
p->Render(*this);
}
/* FIXME: Temp fix for mesh having no render context*/
RenderContext rc;
rc.SetCullMode(CullMode::Clockwise);
rc.SetDepthFunc(DepthFunc::LessOrEqual);

/* new scenegraph */
array<uintptr_t> keys = data->m_prim_renderers.keys();


+ 40
- 5
src/scene.h View File

@@ -27,8 +27,6 @@
namespace lol
{

class SceneData;

//-----------------------------------------------------------------------------
class PrimitiveSource
{
@@ -56,6 +54,41 @@ private:
};

//-----------------------------------------------------------------------------
class SceneDisplayData;

class SceneDisplay
{
friend class Scene;

public:
SceneDisplay() { }
virtual ~SceneDisplay() { }

/* pos/size/... methods */
virtual void SetResolution(ivec2 resolution) { }
virtual void SetPosition(ivec2 position) { }

/* TODO: Should that be there or in Video ? */
static void Add(SceneDisplay* display);
static ptrdiff_t GetCount();
static SceneDisplay* GetDisplay(ptrdiff_t index = 0);
static void DestroyAll();

/* Implement these in the platform section */
static ptrdiff_t GetPhysicalCount();
static const char* GetPhysicalName(ptrdiff_t index = 0);

protected:
virtual void Enable();
virtual void Disable();

private:
SceneDisplayData *data;
};

//-----------------------------------------------------------------------------
class SceneData;

class Scene
{
friend class Video;
@@ -90,9 +123,6 @@ public:

void Reset();

/* New scenegraph */
void AddPrimitive(class PrimitiveSource* primitive);

/* ============================== */
# define _KEY_IDX (uintptr_t)key /* TOUKY: I don't like that. hash should be fixed to handle these custom stuff */
/* ============================== */
@@ -211,6 +241,11 @@ public:
void AddLight(Light *light);
array<Light *> const &GetLights();

/* === Render stuff === */
void SetDisplay(SceneDisplay* display);
void EnableDisplay();
void DisableDisplay();

void RenderPrimitives();
void RenderTiles();
void RenderLines(float seconds);


+ 4
- 3
src/ticker.cpp View File

@@ -428,7 +428,6 @@ void TickerData::DrawThreadTick()
case Entity::DRAWGROUP_BEGIN:
for (ptrdiff_t i = 0; i < Scene::GetCount(); i++)
Scene::GetScene(i).Reset();
g_renderer->Clear(ClearMask::All);
break;
default:
break;
@@ -469,7 +468,9 @@ void TickerData::DrawThreadTick()
Scene& scene = Scene::GetScene(idx);

/* Enable display */
//scene.EnableDisplay(); //TODO
scene.EnableDisplay();

Renderer::Get(idx)->Clear(ClearMask::All);

/* Do the render step */
scene.RenderPrimitives();
@@ -477,7 +478,7 @@ void TickerData::DrawThreadTick()
scene.RenderLines(data->deltatime);

/* Disable display */
//scene.DisableDisplay(); //TODO
scene.DisableDisplay();
}

Profiler::Stop(Profiler::STAT_TICK_DRAW);


+ 6
- 4
src/video.cpp View File

@@ -45,7 +45,8 @@ DebugRenderMode VideoData::render_mode = DebugRenderMode::Default;

void Video::Setup(ivec2 size)
{
g_renderer = new Renderer(size);
//g_renderer = new Renderer(size);
Renderer::AddNew(size);
Scene::AddNew(size);

/* Initialise reasonable scene default properties */
@@ -95,9 +96,10 @@ DebugRenderMode Video::GetDebugRenderMode()
void Video::Destroy()
{
Scene::DestroyAll();
Renderer::DestroyAll();

delete g_renderer;
g_renderer = nullptr;
//delete g_renderer;
//g_renderer = nullptr;
}

void Video::Capture(uint32_t *buffer)
@@ -132,7 +134,7 @@ void Video::Capture(uint32_t *buffer)

ivec2 Video::GetSize()
{
return g_renderer->GetViewport().extent();
return Renderer::Get()->GetViewport().extent();
}

} /* namespace lol */


Loading…
Cancel
Save