00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "RenderTiny_Device.h"
00024
00025 using namespace OVR;
00026 using namespace OVR::RenderTiny;
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 enum BuiltinTexture
00037 {
00038 Tex_None,
00039 Tex_Checker,
00040 Tex_Block,
00041 Tex_Panel,
00042 Tex_Count
00043 };
00044
00045 struct Slab
00046 {
00047 float x1, y1, z1;
00048 float x2, y2, z2;
00049 Color c;
00050 };
00051
00052 struct SlabModel
00053 {
00054 int Count;
00055 Slab* pSlabs;
00056 BuiltinTexture tex;
00057 };
00058
00059 Slab FloorSlabs[] =
00060 {
00061
00062 { -10.0f, -0.1f, -20.0f, 10.0f, 0.0f, 20.1f, Color(128,128,128) }
00063 };
00064
00065 SlabModel Floor = {sizeof(FloorSlabs)/sizeof(Slab), FloorSlabs, Tex_Checker};
00066
00067 Slab CeilingSlabs[] =
00068 {
00069 { -10.0f, 4.0f, -20.0f, 10.0f, 4.1f, 20.1f, Color(128,128,128) }
00070 };
00071
00072 SlabModel Ceiling = {sizeof(FloorSlabs)/sizeof(Slab), CeilingSlabs, Tex_Panel};
00073
00074 Slab RoomSlabs[] =
00075 {
00076
00077 { -10.1f, 0.0f, -20.0f, -10.0f, 4.0f, 20.0f, Color(128,128,128) },
00078
00079 { -10.0f, -0.1f, -20.1f, 10.0f, 4.0f, -20.0f, Color(128,128,128) },
00080
00081
00082 { 10.0f, -0.1f, -20.0f, 10.1f, 4.0f, 20.0f, Color(128,128,128) },
00083 };
00084
00085 SlabModel Room = {sizeof(RoomSlabs)/sizeof(Slab), RoomSlabs, Tex_Block};
00086
00087 Slab FixtureSlabs[] =
00088 {
00089
00090 { 9.5f, 0.75f, 3.0f, 10.1f, 2.5f, 3.1f, Color(128,128,128) },
00091 { 9.5f, 0.95f, 3.7f, 10.1f, 2.75f, 3.8f, Color(128,128,128) },
00092 { 9.5f, 1.20f, 2.5f, 10.1f, 1.30f, 3.8f, Color(128,128,128) },
00093 { 9.5f, 2.00f, 3.0f, 10.1f, 2.10f, 4.2f, Color(128,128,128) },
00094
00095
00096 { 5.0f, 1.1f, 20.0f, 10.0f, 1.2f, 20.1f, Color(128,128,128) },
00097
00098 { 9.0f, 1.1f, 20.0f, 9.1f, 0.0f, 20.1f, Color(128,128,128) },
00099 { 8.0f, 1.1f, 20.0f, 8.1f, 0.0f, 20.1f, Color(128,128,128) },
00100 { 7.0f, 1.1f, 20.0f, 7.1f, 0.0f, 20.1f, Color(128,128,128) },
00101 { 6.0f, 1.1f, 20.0f, 6.1f, 0.0f, 20.1f, Color(128,128,128) },
00102 { 5.0f, 1.1f, 20.0f, 5.1f, 0.0f, 20.1f, Color(128,128,128) },
00103
00104
00105 { -10.0f, 1.1f, 20.0f, -5.0f, 1.2f, 20.1f, Color(128,128,128) },
00106
00107 { -9.0f, 1.1f, 20.0f, -9.1f, 0.0f, 20.1f, Color(128,128,128) },
00108 { -8.0f, 1.1f, 20.0f, -8.1f, 0.0f, 20.1f, Color(128,128,128) },
00109 { -7.0f, 1.1f, 20.0f, -7.1f, 0.0f, 20.1f, Color(128,128,128) },
00110 { -6.0f, 1.1f, 20.0f, -6.1f, 0.0f, 20.1f, Color(128,128,128) },
00111 { -5.0f, 1.1f, 20.0f, -5.1f, 0.0f, 20.1f, Color(128,128,128) },
00112
00113
00114 { -15.0f, -6.1f, 18.0f, 15.0f, -6.0f, 30.0f, Color(128,128,128) },
00115 };
00116
00117 SlabModel Fixtures = {sizeof(FixtureSlabs)/sizeof(Slab), FixtureSlabs};
00118
00119 Slab FurnitureSlabs[] =
00120 {
00121
00122 { -1.8f, 0.7f, 1.0f, 0.0f, 0.8f, 0.0f, Color(128,128,88) },
00123 { -1.8f, 0.7f, 0.0f, -1.8f+0.1f, 0.0f, 0.0f+0.1f, Color(128,128,88) },
00124 { -1.8f, 0.7f, 1.0f, -1.8f+0.1f, 0.0f, 1.0f-0.1f, Color(128,128,88) },
00125 { 0.0f, 0.7f, 1.0f, 0.0f-0.1f, 0.0f, 1.0f-0.1f, Color(128,128,88) },
00126 { 0.0f, 0.7f, 0.0f, 0.0f-0.1f, 0.0f, 0.0f+0.1f, Color(128,128,88) },
00127
00128
00129 { -1.4f, 0.5f, -1.1f, -0.8f, 0.55f, -0.5f, Color(88,88,128) },
00130 { -1.4f, 1.0f, -1.1f, -1.4f+0.06f, 0.0f, -1.1f+0.06f, Color(88,88,128) },
00131 { -1.4f, 0.5f, -0.5f, -1.4f+0.06f, 0.0f, -0.5f-0.06f, Color(88,88,128) },
00132 { -0.8f, 0.5f, -0.5f, -0.8f-0.06f, 0.0f, -0.5f-0.06f, Color(88,88,128) },
00133 { -0.8f, 1.0f, -1.1f, -0.8f-0.06f, 0.0f, -1.1f+0.06f, Color(88,88,128) },
00134 { -1.4f, 0.97f,-1.05f,-0.8f, 0.92f, -1.10f, Color(88,88,128) },
00135 };
00136
00137 SlabModel Furniture = {sizeof(FurnitureSlabs)/sizeof(Slab), FurnitureSlabs};
00138
00139 Slab PostsSlabs[] =
00140 {
00141
00142 { 0, 0.0f, 0.0f, 0.1f, 1.3f, 0.1f, Color(128,128,128) },
00143 { 0, 0.0f, 0.4f, 0.1f, 1.3f, 0.5f, Color(128,128,128) },
00144 { 0, 0.0f, 0.8f, 0.1f, 1.3f, 0.9f, Color(128,128,128) },
00145 { 0, 0.0f, 1.2f, 0.1f, 1.3f, 1.3f, Color(128,128,128) },
00146 { 0, 0.0f, 1.6f, 0.1f, 1.3f, 1.7f, Color(128,128,128) },
00147 { 0, 0.0f, 2.0f, 0.1f, 1.3f, 2.1f, Color(128,128,128) },
00148 { 0, 0.0f, 2.4f, 0.1f, 1.3f, 2.5f, Color(128,128,128) },
00149 { 0, 0.0f, 2.8f, 0.1f, 1.3f, 2.9f, Color(128,128,128) },
00150 { 0, 0.0f, 3.2f, 0.1f, 1.3f, 3.3f, Color(128,128,128) },
00151 { 0, 0.0f, 3.6f, 0.1f, 1.3f, 3.7f, Color(128,128,128) },
00152 };
00153
00154 SlabModel Posts = {sizeof(PostsSlabs)/sizeof(Slab), PostsSlabs};
00155
00156
00157
00158 class FillCollection
00159 {
00160 public:
00161 Ptr<ShaderFill> LitSolid;
00162 Ptr<ShaderFill> LitTextures[4];
00163
00164 FillCollection(RenderDevice* render);
00165
00166 };
00167
00168 FillCollection::FillCollection(RenderDevice* render)
00169 {
00170 Ptr<Texture> builtinTextures[Tex_Count];
00171
00172
00173 {
00174 Color checker[256*256];
00175 for (int j = 0; j < 256; j++)
00176 for (int i = 0; i < 256; i++)
00177 checker[j*256+i] = (((i/4 >> 5) ^ (j/4 >> 5)) & 1) ?
00178 Color(180,180,180,255) : Color(80,80,80,255);
00179 builtinTextures[Tex_Checker] = *render->CreateTexture(Texture_RGBA|Texture_GenMipmaps, 256, 256, checker);
00180 builtinTextures[Tex_Checker]->SetSampleMode(Sample_Anisotropic|Sample_Repeat);
00181 }
00182
00183
00184 {
00185 Color panel[256*256];
00186 for (int j = 0; j < 256; j++)
00187 for (int i = 0; i < 256; i++)
00188 panel[j*256+i] = (i/4 == 0 || j/4 == 0) ?
00189 Color(80,80,80,255) : Color(180,180,180,255);
00190 builtinTextures[Tex_Panel] = *render->CreateTexture(Texture_RGBA|Texture_GenMipmaps, 256, 256, panel);
00191 builtinTextures[Tex_Panel]->SetSampleMode(Sample_Anisotropic|Sample_Repeat);
00192 }
00193
00194
00195 {
00196 Color block[256*256];
00197 for (int j = 0; j < 256; j++)
00198 for (int i = 0; i < 256; i++)
00199 block[j*256+i] = (((j/4 & 15) == 0) || (((i/4 & 15) == 0) && ((((i/4 & 31) == 0) ^ ((j/4 >> 4) & 1)) == 0))) ?
00200 Color(60,60,60,255) : Color(180,180,180,255);
00201 builtinTextures[Tex_Block] = *render->CreateTexture(Texture_RGBA|Texture_GenMipmaps, 256, 256, block);
00202 builtinTextures[Tex_Block]->SetSampleMode(Sample_Anisotropic|Sample_Repeat);
00203 }
00204
00205 LitSolid = *new ShaderFill(*render->CreateShaderSet());
00206 LitSolid->GetShaders()->SetShader(render->LoadBuiltinShader(Shader_Vertex, VShader_MVP));
00207 LitSolid->GetShaders()->SetShader(render->LoadBuiltinShader(Shader_Fragment, FShader_LitGouraud));
00208
00209 for (int i = 1; i < Tex_Count; i++)
00210 {
00211 LitTextures[i] = *new ShaderFill(*render->CreateShaderSet());
00212 LitTextures[i]->GetShaders()->SetShader(render->LoadBuiltinShader(Shader_Vertex, VShader_MVP));
00213 LitTextures[i]->GetShaders()->SetShader(render->LoadBuiltinShader(Shader_Fragment, FShader_LitTexture));
00214 LitTextures[i]->SetTexture(0, builtinTextures[i]);
00215 }
00216
00217 }
00218
00219
00220
00221
00222 Model* CreateModel(Vector3f pos, SlabModel* sm, const FillCollection& fills)
00223 {
00224 Model* m = new Model(Prim_Triangles);
00225 m->SetPosition(pos);
00226
00227 for(int i=0; i< sm->Count; i++)
00228 {
00229 Slab &s = sm->pSlabs[i];
00230 m->AddSolidColorBox(s.x1, s.y1, s.z1, s.x2, s.y2, s.z2, s.c);
00231 }
00232
00233 if (sm->tex > 0)
00234 m->Fill = fills.LitTextures[sm->tex];
00235 else
00236 m->Fill = fills.LitSolid;
00237 return m;
00238 }
00239
00240
00241
00242 void PopulateRoomScene(Scene* scene, RenderDevice* render)
00243 {
00244 FillCollection fills(render);
00245
00246 scene->World.Add(Ptr<Model>(*CreateModel(Vector3f(0,0,0), &Room, fills)));
00247 scene->World.Add(Ptr<Model>(*CreateModel(Vector3f(0,0,0), &Floor, fills)));
00248 scene->World.Add(Ptr<Model>(*CreateModel(Vector3f(0,0,0), &Ceiling, fills)));
00249 scene->World.Add(Ptr<Model>(*CreateModel(Vector3f(0,0,0), &Fixtures, fills)));
00250 scene->World.Add(Ptr<Model>(*CreateModel(Vector3f(0,0,0), &Furniture, fills)));
00251 scene->World.Add(Ptr<Model>(*CreateModel(Vector3f(0,0,4), &Furniture, fills)));
00252 scene->World.Add(Ptr<Model>(*CreateModel(Vector3f(-3,0,3), &Posts, fills)));
00253
00254
00255 scene->SetAmbient(Vector4f(0.65f,0.65f,0.65f,1));
00256 scene->AddLight(Vector3f(-2,4,-2), Vector4f(8,8,8,1));
00257 scene->AddLight(Vector3f(3,4,-3), Vector4f(2,1,1,1));
00258 scene->AddLight(Vector3f(-4,3,25), Vector4f(3,6,3,1));
00259 }
00260