First blood
							
								
								
									
										8
									
								
								.classpath
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,8 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <classpath> | ||||||
|  | 	<classpathentry kind="src" path="src"/> | ||||||
|  | 	<classpathentry kind="src" path="gen"/> | ||||||
|  | 	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> | ||||||
|  | 	<classpathentry kind="lib" path="C:/Workplace/Projects/Android/EngineWrapper/jar/EngineWrapper.jar"/> | ||||||
|  | 	<classpathentry kind="output" path="bin"/> | ||||||
|  | </classpath> | ||||||
							
								
								
									
										33
									
								
								.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,33 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <projectDescription> | ||||||
|  | 	<name>SLWP</name> | ||||||
|  | 	<comment></comment> | ||||||
|  | 	<projects> | ||||||
|  | 	</projects> | ||||||
|  | 	<buildSpec> | ||||||
|  | 		<buildCommand> | ||||||
|  | 			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name> | ||||||
|  | 			<arguments> | ||||||
|  | 			</arguments> | ||||||
|  | 		</buildCommand> | ||||||
|  | 		<buildCommand> | ||||||
|  | 			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name> | ||||||
|  | 			<arguments> | ||||||
|  | 			</arguments> | ||||||
|  | 		</buildCommand> | ||||||
|  | 		<buildCommand> | ||||||
|  | 			<name>org.eclipse.jdt.core.javabuilder</name> | ||||||
|  | 			<arguments> | ||||||
|  | 			</arguments> | ||||||
|  | 		</buildCommand> | ||||||
|  | 		<buildCommand> | ||||||
|  | 			<name>com.android.ide.eclipse.adt.ApkBuilder</name> | ||||||
|  | 			<arguments> | ||||||
|  | 			</arguments> | ||||||
|  | 		</buildCommand> | ||||||
|  | 	</buildSpec> | ||||||
|  | 	<natures> | ||||||
|  | 		<nature>com.android.ide.eclipse.adt.AndroidNature</nature> | ||||||
|  | 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||||
|  | 	</natures> | ||||||
|  | </projectDescription> | ||||||
							
								
								
									
										26
									
								
								AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,26 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | 
 | ||||||
|  | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  | 	package="fishrungames.mountainwallpaper" android:versionCode="1" android:versionName="1.0.0"> | ||||||
|  | 	<application android:label="@string/app_name" android:icon="@drawable/icon" > | ||||||
|  | 		<activity android:launchMode="standard" android:name="Prefs"> | ||||||
|  | 			<intent-filter> | ||||||
|  | 				<category android:name="android.intent.category.PREFERENCE"></category> | ||||||
|  | 				<action android:name="android.intent.action.MAIN"></action> | ||||||
|  | 			</intent-filter> | ||||||
|  | 		</activity> | ||||||
|  | 
 | ||||||
|  | 		<service android:name="MountainWallpaperService" android:enabled="true" | ||||||
|  | 			android:icon="@drawable/icon" android:label="@string/app_name" | ||||||
|  | 			android:permission="android.permission.BIND_WALLPAPER"> | ||||||
|  | 			<intent-filter android:priority="1"> | ||||||
|  | 				<action android:name="android.service.wallpaper.WallpaperService" /> | ||||||
|  | 			</intent-filter> | ||||||
|  | 			<meta-data android:name="android.service.wallpaper" | ||||||
|  | 				android:resource="@xml/wallpaper" /> | ||||||
|  | 		</service> | ||||||
|  | 	</application> | ||||||
|  | 	<uses-sdk android:minSdkVersion="8" /> | ||||||
|  | 	<uses-feature android:glEsVersion="0x00020000"/> | ||||||
|  | 
 | ||||||
|  | </manifest> | ||||||
							
								
								
									
										
											BIN
										
									
								
								assets/console_bkg.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 102 B | 
							
								
								
									
										
											BIN
										
									
								
								assets/file.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 768 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/final_cloud.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 89 KiB | 
							
								
								
									
										10
									
								
								assets/gui_transparent.fragment
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,10 @@ | |||||||
|  | precision lowp float; | ||||||
|  | 
 | ||||||
|  | uniform sampler2D Texture; | ||||||
|  | varying vec2 texCoord; | ||||||
|  | 
 | ||||||
|  | void main()  | ||||||
|  | { | ||||||
|  | 	vec4 texColor = texture2D(Texture,texCoord).rgba; | ||||||
|  | 	gl_FragColor =  vec4(texColor.rgb, texColor.a); | ||||||
|  | } | ||||||
							
								
								
									
										11
									
								
								assets/gui_transparent.vertex
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,11 @@ | |||||||
|  | attribute vec3 vPosition; | ||||||
|  | attribute vec2 vTexCoord; | ||||||
|  | varying vec2 texCoord; | ||||||
|  | uniform mat4 ProjectionMatrix; | ||||||
|  | 
 | ||||||
|  | void main()  | ||||||
|  | { | ||||||
|  | 	//480x320 | ||||||
|  | 	gl_Position = ProjectionMatrix * vec4(vPosition.xyz, 1.0); | ||||||
|  | 	texCoord = vTexCoord; | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								assets/gui_transparent_clip.fragment
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,13 @@ | |||||||
|  | precision lowp float; | ||||||
|  | 
 | ||||||
|  | uniform sampler2D Texture; | ||||||
|  | varying vec2 texCoord; | ||||||
|  | varying vec3 vertexPos; | ||||||
|  | 
 | ||||||
|  | void main()  | ||||||
|  | { | ||||||
|  | 	vec4 texColor = texture2D(Texture,texCoord).rgba; | ||||||
|  | 	 | ||||||
|  | 	gl_FragColor =  vec4(texColor.rgb, texColor.a); //day | ||||||
|  | 	 | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								assets/gui_transparent_clip.vertex
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,13 @@ | |||||||
|  | attribute vec3 vPosition; | ||||||
|  | attribute vec2 vTexCoord; | ||||||
|  | varying vec2 texCoord; | ||||||
|  | varying vec3 vertexPos; | ||||||
|  | uniform mat4 ProjectionMatrix; | ||||||
|  | 
 | ||||||
|  | void main()  | ||||||
|  | { | ||||||
|  | 	//480x320 | ||||||
|  | 	gl_Position = ProjectionMatrix * vec4(vPosition.xyz, 1.0); | ||||||
|  | 	vertexPos = vPosition.xyz; | ||||||
|  | 	texCoord = vTexCoord; | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								assets/ice1.lm1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								assets/ice1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 131 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/ice2.lm1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								assets/ice2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 147 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/ice3.lm1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								assets/ice3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 33 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/ice4.lm1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								assets/ice5.lm1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								assets/ice6.lm1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										29
									
								
								assets/ices.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,29 @@ | |||||||
|  | <Ices> | ||||||
|  | 
 | ||||||
|  | <Ice><ModelName>ice1.lm1</ModelName><PosX>0.0</PosX><PosZ>13.0</PosZ><Angle>110</Angle><Scale>2.0</Scale></Ice> | ||||||
|  | <Ice><ModelName>ice2.lm1</ModelName><PosX>-3.0</PosX><PosZ>14.0</PosZ><Angle>70</Angle></Ice> | ||||||
|  | <Ice><ModelName>ice3.lm1</ModelName><PosX>-4.0</PosX><PosZ>15.0</PosZ><Angle>160</Angle><Scale>2.0</Scale></Ice> | ||||||
|  | <Ice><ModelName>ice6.lm1</ModelName><PosX>7.0</PosX><PosZ>13.5</PosZ><Angle>240</Angle></Ice> | ||||||
|  | <Ice><ModelName>ice4.lm1</ModelName><PosX>4.0</PosX><PosZ>15.0</PosZ><Scale>1.4</Scale></Ice> | ||||||
|  | <Ice><ModelName>ice5.lm1</ModelName><PosX>-6.0</PosX><PosZ>14.0</PosZ><Angle>60</Angle></Ice> | ||||||
|  | <Ice><ModelName>ice6.lm1</ModelName><PosX>-1.0</PosX><PosZ>14.0</PosZ></Ice> | ||||||
|  | <Ice><ModelName>ice1.lm1</ModelName><PosX>5.0</PosX><PosZ>13.0</PosZ><Scale>1.3</Scale></Ice> | ||||||
|  | <Ice><ModelName>ice3.lm1</ModelName><PosX>-5.0</PosX><PosZ>15.0</PosZ><Angle>30</Angle></Ice> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <Ice><ModelName>ice6.lm1</ModelName><PosX>9.0</PosX><PosZ>12.0</PosZ></Ice> | ||||||
|  | <Ice><ModelName>ice4.lm1</ModelName><PosX>11.0</PosX><PosZ>11.0</PosZ><Angle>130</Angle><Scale>2.1</Scale></Ice> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <Ice><ModelName>ice4.lm1</ModelName><PosX>13.0</PosX><PosZ>10.0</PosZ><Angle>240</Angle><Scale>1.5</Scale></Ice> | ||||||
|  | 
 | ||||||
|  | <Ice><ModelName>ice1.lm1</ModelName><PosX>14.0</PosX><PosZ>6.0</PosZ></Ice> | ||||||
|  | <Ice><ModelName>ice2.lm1</ModelName><PosX>16.0</PosX><PosZ>4.5</PosZ><Scale>1.8</Scale></Ice> | ||||||
|  | <Ice><ModelName>ice3.lm1</ModelName><PosX>18.0</PosX><PosZ>2.0</PosZ><Angle>340</Angle></Ice> | ||||||
|  | 
 | ||||||
|  | <Ice><ModelName>ice4.lm1</ModelName><PosX>17.0</PosX><PosZ>2.0</PosZ><Scale>2.0</Scale></Ice> | ||||||
|  | <Ice><ModelName>ice2.lm1</ModelName><PosX>18.0</PosX><PosZ>-1.5</PosZ><Angle>60</Angle><Scale>1.5</Scale></Ice> | ||||||
|  | <Ice><ModelName>ice1.lm1</ModelName><PosX>15.0</PosX><PosZ>-5.5</PosZ><Angle>130</Angle><Scale>2.0</Scale></Ice> | ||||||
|  | <Ice><ModelName>ice5.lm1</ModelName><PosX>12.0</PosX><PosZ>-8.0</PosZ><Angle>160</Angle></Ice> | ||||||
|  | 
 | ||||||
|  | </Ices> | ||||||
							
								
								
									
										
											BIN
										
									
								
								assets/mountain.lm1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								assets/mountain.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.2 MiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/sky.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 385 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/sky_night.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/snow.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.2 KiB | 
							
								
								
									
										56
									
								
								assets/test_norm.fragment
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,56 @@ | |||||||
|  | precision lowp float; | ||||||
|  | 
 | ||||||
|  | uniform sampler2D Texture; | ||||||
|  | uniform sampler2D NormalMap; | ||||||
|  | uniform vec3 CamPos; | ||||||
|  | uniform float WaterScale; | ||||||
|  | varying vec2 texCoord; | ||||||
|  | uniform float Time; | ||||||
|  | 
 | ||||||
|  | void main()  | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 	vec2 localTexCoord = texCoord; | ||||||
|  | 
 | ||||||
|  | 	vec3 camVec = CamPos.xyz; | ||||||
|  | 	float len = length(camVec); | ||||||
|  | 	float squeeze = 0.5*(len / CamPos.y ); | ||||||
|  | 	 | ||||||
|  | 	squeeze = min(squeeze, 4.0); | ||||||
|  | 	 | ||||||
|  | 	//if (squeeze>15.0) squeeze = 15.0; | ||||||
|  | 	 | ||||||
|  | 	vec3 v3 = vec3(0.0,1.0,0.0); | ||||||
|  | 	vec3 v2 = vec3(1.0,0.0,0.0); | ||||||
|  | 	vec3 v1 = vec3(0.0,0.0,1.0); | ||||||
|  | 	 | ||||||
|  | 	mat3 rot; | ||||||
|  | 
 | ||||||
|  | 	rot[0] = v1; | ||||||
|  | 	rot[1] = v2; | ||||||
|  | 	rot[2] = v3; | ||||||
|  | 	 | ||||||
|  | 	float sinx = 0.025*sin(Time+localTexCoord.x*2.0); | ||||||
|  | 	 | ||||||
|  | 	vec3 NVec1 = texture2D(NormalMap, vec2(-Time*0.04 + localTexCoord.x*WaterScale + sinx, -Time*0.04 + squeeze*localTexCoord.y*WaterScale - sinx)).rgb; | ||||||
|  | 	vec3 NVec2 = texture2D(NormalMap, vec2( Time*0.04 + squeeze*localTexCoord.y*WaterScale - sinx, -Time*0.04 + (1.0-localTexCoord.x)*WaterScale + sinx)).rgb; | ||||||
|  | 	 | ||||||
|  | 	NVec1 = (NVec1 -0.5) * 2.0; | ||||||
|  | 	NVec2 = (NVec2 -0.5) * 2.0; | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	vec3 NVec = 0.5*NVec1 + 0.5*NVec2; | ||||||
|  | 	NVec = rot * NVec; | ||||||
|  | 	 | ||||||
|  | 	float d = 1.0/(len+0.05); | ||||||
|  | 	 | ||||||
|  | 	d = min(d, 2.0); | ||||||
|  | 	 | ||||||
|  | 	localTexCoord.x = max(min(localTexCoord.x + d * NVec.x, 1.0), 0.0); | ||||||
|  | 	localTexCoord.y = max(min(localTexCoord.y - d * NVec.z, 1.0), 0.0); | ||||||
|  | 	 | ||||||
|  | 	vec4 specular = vec4(0.8, 0.8, 0.8, 1.0)* (1.0-pow(max(dot(vec3(0.0,1.0,0.0), normalize(NVec)),0.0),2.0)); | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | 	gl_FragColor =  texture2D(Texture, localTexCoord).rgba + specular + vec4(0.0, 0.05, 0.1, 0.0); | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								assets/test_norm.vertex
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,12 @@ | |||||||
|  | attribute vec3 vPosition; | ||||||
|  | attribute vec3 Normal; | ||||||
|  | attribute vec2 vTexCoord; | ||||||
|  | varying vec2 texCoord; | ||||||
|  | uniform mat4 ProjectionMatrix; | ||||||
|  | 
 | ||||||
|  | void main()  | ||||||
|  | { | ||||||
|  | 	//480x320 | ||||||
|  | 	gl_Position = ProjectionMatrix * vec4(vPosition.xyz, 1.0); | ||||||
|  | 	texCoord = vTexCoord; | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								assets/test_parallax.fragment
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,34 @@ | |||||||
|  | precision lowp float; | ||||||
|  | 
 | ||||||
|  | uniform sampler2D Texture; | ||||||
|  | uniform sampler2D NormalMap; | ||||||
|  | uniform vec3 LightDirection; | ||||||
|  | varying vec2 texCoord; | ||||||
|  | 
 | ||||||
|  | varying vec3 camVec; | ||||||
|  | varying vec3 normVec; | ||||||
|  | 
 | ||||||
|  | void main()  | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 	vec3 cVec = normalize(camVec); | ||||||
|  | 	 | ||||||
|  | 	float parallax = 0.035; | ||||||
|  | 
 | ||||||
|  | 	//double refinement | ||||||
|  | 	float height = texture2D(NormalMap, texCoord.xy).a; | ||||||
|  | 	float offset = parallax * (2.0 * height - 1.0); | ||||||
|  | 	vec2 parallaxTexCoord = texCoord.xy + offset * cVec.xy; | ||||||
|  | 	height += texture2D(NormalMap, parallaxTexCoord).a; | ||||||
|  | 	 | ||||||
|  | 	offset = parallax * (height - 1.0); | ||||||
|  | 	 | ||||||
|  | 	parallaxTexCoord = texCoord.xy + offset * cVec.xy; | ||||||
|  | 	 | ||||||
|  | 	vec3 nvec = normalize(normVec); | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	float cosf = max(0.0, dot(nvec, -LightDirection)); | ||||||
|  | 	 | ||||||
|  | 	gl_FragColor =  vec4((texture2D(Texture, parallaxTexCoord).rgb * (cosf * 0.75 + 0.25)), 1.0); | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								assets/test_parallax.vertex
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,30 @@ | |||||||
|  | attribute vec3 vPosition; | ||||||
|  | attribute vec3 Normal; | ||||||
|  | attribute vec3 Tangent; | ||||||
|  | attribute vec3 Binormal; | ||||||
|  | attribute vec2 vTexCoord; | ||||||
|  | 
 | ||||||
|  | uniform mat4 ProjectionMatrix; | ||||||
|  | uniform vec3 CamPos; | ||||||
|  | 
 | ||||||
|  | varying vec2 texCoord; | ||||||
|  | varying vec3 camVec; | ||||||
|  | varying vec3 normVec; | ||||||
|  | 
 | ||||||
|  | void main()  | ||||||
|  | { | ||||||
|  | 	//480x320 | ||||||
|  | 	gl_Position = ProjectionMatrix * vec4(vPosition.xyz, 1.0); | ||||||
|  | 	texCoord = vTexCoord; | ||||||
|  | 	 | ||||||
|  | 	vec3 cVec = (CamPos - vPosition.xyz); | ||||||
|  | 	 | ||||||
|  | 	mat3 rot; | ||||||
|  | 	rot[0] = Tangent; | ||||||
|  | 	rot[1] = Binormal; | ||||||
|  | 	rot[2] = Normal; | ||||||
|  | 	 | ||||||
|  | 	camVec =  cVec * rot; | ||||||
|  | 	 | ||||||
|  | 	normVec = Normal; | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								assets/test_simplelight.fragment
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,26 @@ | |||||||
|  | precision lowp float; | ||||||
|  | 
 | ||||||
|  | uniform sampler2D Texture; | ||||||
|  | uniform sampler2D NormalMap; | ||||||
|  | uniform vec3 LightDirection; | ||||||
|  | uniform float TimeOfDayCoef1; | ||||||
|  | uniform float TimeOfDayCoef2; | ||||||
|  | uniform vec3 TimeOfDayColor; | ||||||
|  | varying vec2 texCoord; | ||||||
|  | 
 | ||||||
|  | varying vec3 camVec; | ||||||
|  | varying vec3 normVec; | ||||||
|  | 
 | ||||||
|  | void main()  | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 	vec3 nvec = normalize(normVec); | ||||||
|  | 	 | ||||||
|  | 	float cosf = max(0.0, dot(nvec, -LightDirection)); | ||||||
|  | 	 | ||||||
|  | 	//gl_FragColor =  vec4((texture2D(Texture, texCoord).rgb * (cosf * 0.75 + 0.25)), 1.0); //day | ||||||
|  | 	//gl_FragColor =  vec4((texture2D(Texture, texCoord).rgb * (cosf * 0.5 + 0.25)), 1.0); //twilight | ||||||
|  | 	//gl_FragColor =  vec4(((texture2D(Texture, texCoord).rgb + vec3(0.0, 0.1, 0.2)) * (0.4)), 1.0); | ||||||
|  | 	 | ||||||
|  | 	gl_FragColor =  vec4(((texture2D(Texture, texCoord).rgb + TimeOfDayColor) * (cosf * TimeOfDayCoef1 + TimeOfDayCoef2)), 1.0); | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								assets/test_simplelight.vertex
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,30 @@ | |||||||
|  | attribute vec3 vPosition; | ||||||
|  | attribute vec3 Normal; | ||||||
|  | attribute vec3 Tangent; | ||||||
|  | attribute vec3 Binormal; | ||||||
|  | attribute vec2 vTexCoord; | ||||||
|  | 
 | ||||||
|  | uniform mat4 ProjectionMatrix; | ||||||
|  | uniform vec3 CamPos; | ||||||
|  | 
 | ||||||
|  | varying vec2 texCoord; | ||||||
|  | varying vec3 camVec; | ||||||
|  | varying vec3 normVec; | ||||||
|  | 
 | ||||||
|  | void main()  | ||||||
|  | { | ||||||
|  | 	//480x320 | ||||||
|  | 	gl_Position = ProjectionMatrix * vec4(vPosition.xyz, 1.0); | ||||||
|  | 	texCoord = vTexCoord; | ||||||
|  | 	 | ||||||
|  | 	vec3 cVec = (CamPos - vPosition.xyz); | ||||||
|  | 	 | ||||||
|  | 	mat3 rot; | ||||||
|  | 	rot[0] = Tangent; | ||||||
|  | 	rot[1] = Binormal; | ||||||
|  | 	rot[2] = Normal; | ||||||
|  | 	 | ||||||
|  | 	camVec =  cVec * rot; | ||||||
|  | 	 | ||||||
|  | 	normVec = Normal; | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								assets/water_nmap.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 126 KiB | 
							
								
								
									
										77
									
								
								jni/Android.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,77 @@ | |||||||
|  | # Copyright (C) 2009 The Android Open Source Project
 | ||||||
|  | #
 | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License");
 | ||||||
|  | # you may not use this file except in compliance with the License.
 | ||||||
|  | # You may obtain a copy of the License at
 | ||||||
|  | #
 | ||||||
|  | #      http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  | #
 | ||||||
|  | # Unless required by applicable law or agreed to in writing, software
 | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS,
 | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||||
|  | # See the License for the specific language governing permissions and
 | ||||||
|  | # limitations under the License.
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | LPATH := $(call my-dir) | ||||||
|  | 
 | ||||||
|  | ENGINE_PATH = $(SalmonEnginePathCygwin) | ||||||
|  | 
 | ||||||
|  | BOOST_PATH = $(LibsPathCygwin)/boost_1_52_0 | ||||||
|  | 
 | ||||||
|  | OGG_PATH = $(LibsPathCygwin)/libogg-1.3.0 | ||||||
|  | 
 | ||||||
|  | VORBIS_PATH = $(LibsPathCygwin)/libvorbis-1.3.2 | ||||||
|  | 
 | ||||||
|  | SQUIRREL_PATH = $(LibsPathCygwin)/sqplus | ||||||
|  | 
 | ||||||
|  | LIBPNG_PATH = $(LibsPathCygwin)/libpng_1.4.1_android | ||||||
|  | 
 | ||||||
|  | ZIP_PATH = $(LibsPathCygwin)/julienr-libzip-android/jni | ||||||
|  | 
 | ||||||
|  | #====== ENGINE AND LIBS =====================
 | ||||||
|  | 
 | ||||||
|  | include $(ENGINE_PATH)/Android_Salmon_Engine.mk | ||||||
|  | 
 | ||||||
|  | #================= THE GAME =======================
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | LOCAL_PATH:= $(LPATH) | ||||||
|  | 
 | ||||||
|  | include $(CLEAR_VARS) | ||||||
|  | 
 | ||||||
|  | LOCAL_CFLAGS := -DTARGET_ANDROID -DNOSOUND -std=gnu++11 --std=c++11 | ||||||
|  | LOCAL_STATIC_LIBRARIES := boost | ||||||
|  | LOCAL_STATIC_LIBRARIES += squirrel | ||||||
|  | LOCAL_STATIC_LIBRARIES += png_lib | ||||||
|  | LOCAL_STATIC_LIBRARIES += zip | ||||||
|  | LOCAL_SHARED_LIBRARIES := SalmonEngine | ||||||
|  | LOCAL_SHARED_LIBRARIES += gnustl_shared | ||||||
|  | LOCAL_C_INCLUDES := $(ENGINE_PATH) | ||||||
|  | LOCAL_C_INCLUDES += $(BOOST_PATH) | ||||||
|  | LOCAL_C_INCLUDES += $(VORBIS_PATH)/include | ||||||
|  | LOCAL_C_INCLUDES += $(VORBIS_PATH)/include/vorbis | ||||||
|  | LOCAL_C_INCLUDES += $(VORBIS_PATH)/lib | ||||||
|  | LOCAL_C_INCLUDES += $(VORBIS_PATH)/lib/books | ||||||
|  | LOCAL_C_INCLUDES += $(VORBIS_PATH)/lib/modes | ||||||
|  | LOCAL_C_INCLUDES += $(OGG_PATH)/include | ||||||
|  | LOCAL_C_INCLUDES += $(OGG_PATH)/include/ogg | ||||||
|  | LOCAL_C_INCLUDES += $(SQUIRREL_PATH)/include | ||||||
|  | LOCAL_C_INCLUDES += $(SQUIRREL_PATH)/sqplus | ||||||
|  | LOCAL_C_INCLUDES += $(SQUIRREL_PATH)/squirrel | ||||||
|  | LOCAL_C_INCLUDES += $(SQUIRREL_PATH)/sqstdlib | ||||||
|  | LOCAL_C_INCLUDES += $(LIBPNG_PATH) | ||||||
|  | LOCAL_C_INCLUDES += $(ZIP_PATH) | ||||||
|  | LOCAL_MODULE    := SalmonWallpaper | ||||||
|  | LOCAL_SRC_FILES := main_code.cpp | ||||||
|  | LOCAL_SRC_FILES += android_api.cpp | ||||||
|  | 
 | ||||||
|  | LOCAL_LDLIBS    := -lGLESv2 | ||||||
|  | LOCAL_LDLIBS    += -llog -Wl | ||||||
|  | 
 | ||||||
|  | #debug
 | ||||||
|  | #LOCAL_CFLAGS += -g -ggdb -O0
 | ||||||
|  | #LOCAL_LDLIBS    += -g -ggdb
 | ||||||
|  | 
 | ||||||
|  | include $(BUILD_SHARED_LIBRARY) | ||||||
							
								
								
									
										3
									
								
								jni/Application.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,3 @@ | |||||||
|  | APP_STL  := gnustl_shared | ||||||
|  | APP_CPPFLAGS += -fexceptions | ||||||
|  | APP_CPPFLAGS += -frtti | ||||||
							
								
								
									
										49
									
								
								jni/android_api.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,49 @@ | |||||||
|  | #include "android_api.h" | ||||||
|  | 
 | ||||||
|  | #include "main_code.h" | ||||||
|  | #include "boost\thread.hpp" | ||||||
|  | 
 | ||||||
|  | TAndroidApplication* Application = NULL; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | float lastOffsetX = 0.5f; | ||||||
|  | 
 | ||||||
|  | const float CONST_ANGLE_SHIFT = 45.f; | ||||||
|  | 
 | ||||||
|  | int TimeOfDayPref = 0; | ||||||
|  | bool SnowPref = false; | ||||||
|  | 
 | ||||||
|  | bool OffsetChanged = false; | ||||||
|  | 
 | ||||||
|  | JNIEXPORT void JNICALL Java_fishrungames_mountainwallpaper_JniWrapper_SetTimeOfDayPref(JNIEnv * env, jobject obj, jint timeofday) | ||||||
|  | { | ||||||
|  | 	TimeOfDayPref = timeofday; | ||||||
|  | } | ||||||
|  | JNIEXPORT void JNICALL Java_fishrungames_mountainwallpaper_JniWrapper_SetSnowPref(JNIEnv * env, jobject obj, jboolean snow) | ||||||
|  | { | ||||||
|  | 	SnowPref = snow; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | JNIEXPORT void JNICALL Java_fishrungames_mountainwallpaper_JniWrapper_Init(JNIEnv * env, jobject obj,  jint width, jint height) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 	Application = JniInitApp<TAndroidApplication>(width, height, 800.f, 480.f); | ||||||
|  | 	 | ||||||
|  | 	boost::get<TPanoramicCamera>(Renderer->Camera).SetAlpha((lastOffsetX) * pi / 180.f); | ||||||
|  | 	Application->SkyTexShift = lastOffsetX*0.01f; | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | JNIEXPORT void JNICALL Java_fishrungames_mountainwallpaper_JniWrapper_SetOffset(JNIEnv * env, jobject obj, jfloat offsetX, jfloat offsetY) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 	if (Renderer != NULL) | ||||||
|  | 	{ | ||||||
|  | 		OffsetChanged = true; | ||||||
|  | 		Application->SkyTexShift = offsetX*0.01f; | ||||||
|  | 		lastOffsetX = offsetX; | ||||||
|  | 		boost::get<TPanoramicCamera>(Renderer->Camera).SetAlpha((lastOffsetX) * pi / 180.f); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								jni/android_api.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,30 @@ | |||||||
|  | #ifndef ANDROID_API_H_INCLUDED | ||||||
|  | #define ANDROID_API_H_INCLUDED | ||||||
|  | 
 | ||||||
|  | #include <jni.h> | ||||||
|  | #include <android/log.h> | ||||||
|  | 
 | ||||||
|  | #include <GLES/gl.h> | ||||||
|  | #include <GLES2/gl2.h> | ||||||
|  | #include <GLES2/gl2ext.h> | ||||||
|  | 
 | ||||||
|  | #include "boost/shared_ptr.hpp" | ||||||
|  | 
 | ||||||
|  | #include "main_code.h" | ||||||
|  | 
 | ||||||
|  | using namespace SE; | ||||||
|  | 
 | ||||||
|  | extern "C" { | ||||||
|  | 
 | ||||||
|  | 	JNIEXPORT void JNICALL Java_fishrungames_mountainwallpaper_JniWrapper_SetTimeOfDayPref(JNIEnv * env, jobject obj, jint timeofday); | ||||||
|  | 	 | ||||||
|  | 	JNIEXPORT void JNICALL Java_fishrungames_mountainwallpaper_JniWrapper_SetSnowPref(JNIEnv * env, jobject obj, jboolean snow); | ||||||
|  | 	 | ||||||
|  | 	JNIEXPORT void JNICALL Java_fishrungames_mountainwallpaper_JniWrapper_Init(JNIEnv * env, jobject obj,  jint width, jint height); | ||||||
|  |      | ||||||
|  | 	JNIEXPORT void JNICALL Java_fishrungames_mountainwallpaper_JniWrapper_SetOffset(JNIEnv * env, jobject obj, jfloat offsetX, jfloat offsetY); | ||||||
|  | 
 | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
							
								
								
									
										550
									
								
								jni/main_code.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,550 @@ | |||||||
|  | #include "main_code.h" | ||||||
|  | #ifdef TARGET_ANDROID | ||||||
|  | #include "android_api.h" | ||||||
|  | #endif | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <math.h> | ||||||
|  | #include <time.h> | ||||||
|  | 
 | ||||||
|  | #include "include/Engine.h" | ||||||
|  | 
 | ||||||
|  | #include "main_code.h" | ||||||
|  | 
 | ||||||
|  | bool makeShot = true; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | extern int TimeOfDayPref; | ||||||
|  | extern bool SnowPref; | ||||||
|  | 
 | ||||||
|  | extern float lastOffsetX; | ||||||
|  | 
 | ||||||
|  | #ifdef TARGET_WIN32 | ||||||
|  | int TimeOfDayPref = 0; | ||||||
|  | bool SnowPref = false; | ||||||
|  | 
 | ||||||
|  | #else | ||||||
|  | extern int TimeOfDayPref; | ||||||
|  | extern bool SnowPref; | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | boost::mutex m2; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class LoadingQueueVisitor : public boost::static_visitor<void> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     void operator()(boost::function<cardinal()> f) const | ||||||
|  |     { | ||||||
|  |         f(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     void operator()(boost::function<bool()> f) const | ||||||
|  |     { | ||||||
|  |         f(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 	void operator()(boost::function<void()> f) const | ||||||
|  |     { | ||||||
|  |         f(); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | TAndroidApplication::TAndroidApplication() | ||||||
|  | 	: TApplication() | ||||||
|  | 	, Inited(false) | ||||||
|  | 	, Loaded(false) | ||||||
|  | 	, LiteModel(NULL) | ||||||
|  | 	, WaterTimer(0) | ||||||
|  | 	, SnowTimer(0) | ||||||
|  | 	, CloudTimer(0) | ||||||
|  | 	, SkyTexShift(0) | ||||||
|  | 	, WaveDir(false) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::Serialize(boost::property_tree::ptree& propertyTree) | ||||||
|  | { | ||||||
|  | 	BOOST_FOREACH(boost::property_tree::ptree::value_type &v, propertyTree.get_child("Ices")) | ||||||
|  | 	{ | ||||||
|  | 
 | ||||||
|  | 		std::string modelName = v.second.get<std::string>("ModelName"); | ||||||
|  | 		float posx = v.second.get<float>("PosX"); | ||||||
|  | 		float posz = v.second.get<float>("PosZ"); | ||||||
|  | 
 | ||||||
|  | 		float angle = v.second.get<float>("Angle", 0.f); | ||||||
|  | 		float scale = v.second.get<float>("Scale", 1.f); | ||||||
|  | 
 | ||||||
|  | 		mat3 m(vec4(0, cos(angle*pi/360.f), 0, sin(angle*pi/360.f))); | ||||||
|  | 
 | ||||||
|  | 		IceModel.push_back(TLiteModel()); | ||||||
|  | 		IceModel[IceModel.size()-1].LoadModel(modelName); | ||||||
|  | 		IceModel[IceModel.size()-1].RotateModel(m); | ||||||
|  | 		IceModel[IceModel.size()-1].ScaleModel(scale); | ||||||
|  | 		IceModel[IceModel.size()-1].MoveModel(vec3(posx, 0, posz)); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		IceModel[IceModel.size()-1].UpdateVBO(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::LoadModels() | ||||||
|  | { | ||||||
|  | 	mat3 m(vec4(0,1*sin(pi/8 + pi/2),0,1*cos(pi/8 + pi/2))); | ||||||
|  | 	 | ||||||
|  | 	LiteModel = new TLiteModel; | ||||||
|  | 	LiteModel->LoadModel("mountain.lm1"); | ||||||
|  | 	LiteModel->ScaleModel(0.5f); | ||||||
|  | 	LiteModel->RotateModel(m); | ||||||
|  | 	LiteModel->MoveModel(vec3(0, 0, 0)); | ||||||
|  | 	LiteModel->UpdateVBO(); | ||||||
|  | 
 | ||||||
|  | 	std::shared_ptr<boost::property_tree::ptree> p = FileToPropertyTree("ices.xml"); | ||||||
|  | 
 | ||||||
|  | 	Serialize(*p); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::AddFrameBuffers() | ||||||
|  | { | ||||||
|  | 	ResourceManager->FrameManager.AddFrameRenderBuffer("WaterFrame", 256, 256); | ||||||
|  | 	ResourceManager->FrameManager.AddFrameRenderBuffer("ScreenshotFrame", 512, 512); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::DrawSceneWithoutWater(bool inv) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	Renderer->PushProjectionMatrix(1,1); | ||||||
|  | 	Renderer->LoadIdentity(); | ||||||
|  | 
 | ||||||
|  | 	if (inv) | ||||||
|  | 	{ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		if (TimeOfDayPref == 2) | ||||||
|  | 		{ | ||||||
|  | 			glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["sky_night.png"]); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["sky.png"]); | ||||||
|  | 		} | ||||||
|  | 		Renderer->DrawRect(vec2(0.0f, 0.56f), vec2(1.f, 0.f), vec2(0.5f + SkyTexShift, 0.f), vec2(1.f + SkyTexShift, 1.f)); | ||||||
|  | 
 | ||||||
|  | 		if (TimeOfDayPref == 1) | ||||||
|  | 		{ | ||||||
|  | 			glClear(GL_DEPTH_BUFFER_BIT); | ||||||
|  | 			glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["final_cloud.png"]); | ||||||
|  | 			Renderer->DrawRect(vec2(0.0f, 0.56f), vec2(4.f, 0.f), vec2(0.0f + SkyTexShift + CloudTimer, 0.f), vec2(1.f + SkyTexShift + CloudTimer, 0.5f)); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		if (TimeOfDayPref == 2) | ||||||
|  | 		{ | ||||||
|  | 			glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["sky_night.png"]); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["sky.png"]); | ||||||
|  | 		} | ||||||
|  | 		Renderer->DrawRect(vec2(0.0f, 0.54f), vec2(1.f, 1.f), vec2(0.5f + SkyTexShift, 0.f), vec2(1.f + SkyTexShift, 1.f)); | ||||||
|  | 
 | ||||||
|  | 		if (TimeOfDayPref == 1) | ||||||
|  | 		{ | ||||||
|  | 			glClear(GL_DEPTH_BUFFER_BIT); | ||||||
|  | 			glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["final_cloud.png"]); | ||||||
|  | 			Renderer->DrawRect(vec2(0.0f, 0.54f), vec2(4.f, 1.f), vec2(0.0f + SkyTexShift + CloudTimer, 0.f), vec2(1.f + SkyTexShift + CloudTimer, 0.5f)); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	Renderer->PopProjectionMatrix(); | ||||||
|  | 
 | ||||||
|  | 	glClear(GL_DEPTH_BUFFER_BIT); | ||||||
|  | 	Renderer->SetGLCamView(); | ||||||
|  | 
 | ||||||
|  | 	if (inv) | ||||||
|  | 	{ | ||||||
|  | 		Renderer->TranslateMatrix(vec3(0,0.1f,0)); | ||||||
|  | 		Renderer->ScaleMatrix(vec3(1, -1, 1)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	Renderer->PushShader("SimplelightShader"); | ||||||
|  | 
 | ||||||
|  | 	vec3 dayColor = vec3(0,0,0); | ||||||
|  | 	vec3 nightColor = vec3(0, 0.1f, 0.2f); | ||||||
|  | 
 | ||||||
|  | 	if (TimeOfDayPref == 0) | ||||||
|  | 	{ | ||||||
|  | 		RenderUniform3fv("TimeOfDayColor", dayColor.v); | ||||||
|  | 		RenderUniform1f("TimeOfDayCoef1", 0.75f); | ||||||
|  | 		RenderUniform1f("TimeOfDayCoef2", 0.25f); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 		if (TimeOfDayPref == 1) | ||||||
|  | 		{ | ||||||
|  | 			RenderUniform3fv("TimeOfDayColor", dayColor.v); | ||||||
|  | 			RenderUniform1f("TimeOfDayCoef1", 0.5f); | ||||||
|  | 			RenderUniform1f("TimeOfDayCoef2", 0.25f); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			RenderUniform3fv("TimeOfDayColor", nightColor.v); | ||||||
|  | 			RenderUniform1f("TimeOfDayCoef1", 0.0f); | ||||||
|  | 			RenderUniform1f("TimeOfDayCoef2", 0.4f); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		 | ||||||
|  | 		Renderer->PushPerspectiveProjectionMatrix(pi/6, Renderer->GetMatrixWidth() / Renderer->GetMatrixHeight(), 1.f, 450.f); | ||||||
|  | 
 | ||||||
|  | 		LiteModel->DrawVBO(); | ||||||
|  | 
 | ||||||
|  | 		for (int i=0; i<IceModel.size(); i++) | ||||||
|  | 		{ | ||||||
|  | 			IceModel[i].DrawVBO(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		Renderer->PopProjectionMatrix(); | ||||||
|  | 
 | ||||||
|  | 		Renderer->PopShader(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::DrawSnow() | ||||||
|  | { | ||||||
|  | 	 | ||||||
|  | 		Renderer->PushProjectionMatrix(1,1); | ||||||
|  | 
 | ||||||
|  | 		Renderer->LoadIdentity(); | ||||||
|  | 
 | ||||||
|  | 		const float multiply_x = 4; | ||||||
|  | 		const float multiply_y = 2; | ||||||
|  | 
 | ||||||
|  | 		Renderer->DrawRect(vec2(0, 0), vec2(1.f, 1.f), vec2(-SkyTexShift, SnowTimer), vec2(multiply_x - SkyTexShift, multiply_y + SnowTimer)); | ||||||
|  | 		glClear(GL_DEPTH_BUFFER_BIT); | ||||||
|  | 		Renderer->DrawRect(vec2(0, 0), vec2(1.f, 1.f), vec2(SnowTimer*0.7f+0.3f - SkyTexShift, SnowTimer+0.7f), vec2(multiply_x - SkyTexShift + SnowTimer*0.7f+0.3f, multiply_y + SnowTimer+0.7f)); | ||||||
|  | 		glClear(GL_DEPTH_BUFFER_BIT); | ||||||
|  | 		Renderer->DrawRect(vec2(0, 0), vec2(1.f, 1.f), vec2(SnowTimer*0.4f+0.7f - SkyTexShift, SnowTimer+0.3f), vec2(multiply_x - SkyTexShift + SnowTimer*0.4f+0.7f, multiply_y + SnowTimer+0.3f)); | ||||||
|  | 
 | ||||||
|  | 		Renderer->PopProjectionMatrix(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::DrawAllScene(bool toScreen) | ||||||
|  | { | ||||||
|  | 	glClearColor(0.f, 0.f, 0.f, 1.0f); | ||||||
|  | 	//glClearColor(1.f, 1.f, 1.f, 1.0f);
 | ||||||
|  | 	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); | ||||||
|  | 
 | ||||||
|  | 	Renderer->PushMatrix(); | ||||||
|  | 	Renderer->SetGLCamView(); | ||||||
|  | 
 | ||||||
|  | 	Renderer->PushShader("ClipShader"); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	Renderer->SwitchToFrameBuffer("WaterFrame"); | ||||||
|  | 	Renderer->SetGLCamView(); | ||||||
|  | 	Renderer->ScaleMatrix(vec3(1, -1, 1)); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); | ||||||
|  | 
 | ||||||
|  | 	DrawSceneWithoutWater(true); | ||||||
|  | 
 | ||||||
|  | 	Renderer->ScaleMatrix(vec3(1, -1, 1)); | ||||||
|  | 
 | ||||||
|  | 	if (toScreen) | ||||||
|  | 	{ | ||||||
|  | 		Renderer->SwitchToScreen(); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		Renderer->SwitchToFrameBuffer("ScreenshotFrame"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	Renderer->SetGLCamView(); | ||||||
|  | 
 | ||||||
|  | 	Renderer->PushShader("NormShader"); | ||||||
|  | 	RenderUniform1f("Time", WaterTimer); | ||||||
|  | 	if (Renderer->GetScreenWidth() < 600) | ||||||
|  | 	{ | ||||||
|  | 		RenderUniform1f("WaterScale", 0.7f); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		RenderUniform1f("WaterScale", 1.f); | ||||||
|  | 	} | ||||||
|  | 	glActiveTexture(GL_TEXTURE1); | ||||||
|  | 	glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["water_nmap.png"]); | ||||||
|  | 	glActiveTexture(GL_TEXTURE0); | ||||||
|  | 	if (toScreen) | ||||||
|  | 	{ | ||||||
|  | 	Renderer->SetFullScreenViewport(); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		Renderer->SetFrameViewport("ScreenshotFrame"); | ||||||
|  | 	} | ||||||
|  | 	Renderer->DrawFramePartScreen("WaterFrame", vec2(0, 0), vec2(1.f, 0.54f)); | ||||||
|  | 	Renderer->PopShader(); | ||||||
|  | 
 | ||||||
|  | 	glClear(GL_DEPTH_BUFFER_BIT); | ||||||
|  | 
 | ||||||
|  | 	Renderer->SetGLCamView(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	DrawSceneWithoutWater(false); | ||||||
|  | 
 | ||||||
|  | 	glClear(GL_DEPTH_BUFFER_BIT); | ||||||
|  | 
 | ||||||
|  | 	glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["snow.png"]); | ||||||
|  | 
 | ||||||
|  | 	if (SnowPref) | ||||||
|  | 	{ | ||||||
|  | 		DrawSnow(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	Renderer->PopShader(); | ||||||
|  | 
 | ||||||
|  | 	Renderer->PopMatrix(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::InnerInit() | ||||||
|  | { | ||||||
|  | 	m2.lock(); | ||||||
|  | 
 | ||||||
|  | 	CheckGlError(); | ||||||
|  | 
 | ||||||
|  | 	glEnable(GL_BLEND); | ||||||
|  | 
 | ||||||
|  | 	*Console<<"Inner init go!\n"; | ||||||
|  | 
 | ||||||
|  | #ifdef TARGET_ANDROID | ||||||
|  | 	ResourceManager->PathToResources = ""; | ||||||
|  | #endif | ||||||
|  | #ifdef TARGET_WIN32 | ||||||
|  | 	ResourceManager->PathToResources = "../../assets/"; | ||||||
|  | #endif | ||||||
|  | 	ResourceManager->ShaderManager.AddShader("DefaultShader", "gui_transparent.vertex", "gui_transparent.fragment"); | ||||||
|  | 	Renderer->PushShader("DefaultShader"); | ||||||
|  | 	 | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TShaderManager::AddShader, &(ResourceManager->ShaderManager), "ClipShader", "gui_transparent_clip.vertex", "gui_transparent_clip.fragment"))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TShaderManager::AddShader, &(ResourceManager->ShaderManager), "NormShader", "test_norm.vertex", "test_norm.fragment"))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TShaderManager::AddShader, &(ResourceManager->ShaderManager), "ParallaxShader", "test_parallax.vertex", "test_parallax.fragment"))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TShaderManager::AddShader, &(ResourceManager->ShaderManager), "SimplelightShader", "test_simplelight.vertex", "test_simplelight.fragment"))); | ||||||
|  | 	 | ||||||
|  | 	if (IsFileExistsInUserData("file.bmp")) | ||||||
|  | 	{ | ||||||
|  | 		ResourceManager->TexList.AddTextureFromUserdata("file.bmp", "ScreenshotTexture"); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		ResourceManager->TexList.AddTexture("file.bmp", "ScreenshotTexture"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	LoadingQueue.push_back(boost::function<cardinal()>(boost::bind(&TTextureListClass::AddTexture, &(ResourceManager->TexList), "console_bkg.bmp", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<cardinal()>(boost::bind(&TTextureListClass::AddTexture, &(ResourceManager->TexList), "water_nmap.png", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<cardinal()>(boost::bind(&TTextureListClass::AddTexture, &(ResourceManager->TexList), "sky.png", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<cardinal()>(boost::bind(&TTextureListClass::AddTexture, &(ResourceManager->TexList), "sky_night.png", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<cardinal()>(boost::bind(&TTextureListClass::AddTexture, &(ResourceManager->TexList), "snow.png", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<cardinal()>(boost::bind(&TTextureListClass::AddTexture, &(ResourceManager->TexList), "final_cloud.png", ""))); | ||||||
|  | 
 | ||||||
|  | 	 | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TModelManager::AddLiteModel, &(ResourceManager->ModelManager), "mountain.lm1", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TModelManager::AddLiteModel, &(ResourceManager->ModelManager), "ice1.lm1", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TModelManager::AddLiteModel, &(ResourceManager->ModelManager), "ice2.lm1", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TModelManager::AddLiteModel, &(ResourceManager->ModelManager), "ice3.lm1", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TModelManager::AddLiteModel, &(ResourceManager->ModelManager), "ice4.lm1", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TModelManager::AddLiteModel, &(ResourceManager->ModelManager), "ice5.lm1", ""))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<bool()>(boost::bind(&TModelManager::AddLiteModel, &(ResourceManager->ModelManager), "ice6.lm1", ""))); | ||||||
|  | 	 | ||||||
|  | 	LoadingQueue.push_back(boost::function<void()>(boost::bind(&TAndroidApplication::LoadModels, this))); | ||||||
|  | 	LoadingQueue.push_back(boost::function<void()>(boost::bind(&TAndroidApplication::AddFrameBuffers, this))); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	//LoadModels();
 | ||||||
|  | 	 | ||||||
|  | 	CheckGlError(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	boost::get<TPanoramicCamera>(Renderer->Camera).MovePhi(pi/32); | ||||||
|  | 
 | ||||||
|  | 	 | ||||||
|  | 	if (Renderer->GetScreenWidth() > Renderer->GetScreenHeight()) | ||||||
|  | 	{ | ||||||
|  | 		boost::get<TPanoramicCamera>(Renderer->Camera).MoveDist(30.f); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		boost::get<TPanoramicCamera>(Renderer->Camera).MoveDist(45.f); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	boost::get<TPanoramicCamera>(Renderer->Camera).CalcCamVec(); | ||||||
|  | 
 | ||||||
|  | 	CheckGlError(); | ||||||
|  | 
 | ||||||
|  | 	ResourceManager->LightManager.SetLightOn(); | ||||||
|  | 
 | ||||||
|  | 	ResourceManager->LightManager.SetLightDirection(vec3(1, -1, 0)); | ||||||
|  | 
 | ||||||
|  | 	//AddFrameBuffers();
 | ||||||
|  | 
 | ||||||
|  | 	//Renderer->SetPerspectiveFullScreenViewport();
 | ||||||
|  | 
 | ||||||
|  | 	if (Renderer->GetScreenWidth() < Renderer->GetScreenHeight()) | ||||||
|  | 	{ | ||||||
|  | 		Renderer->SetMatrixWidth(480); | ||||||
|  | 		Renderer->SetMatrixHeight(800); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	Renderer->PushPerspectiveProjectionMatrix(pi/6, Renderer->GetMatrixWidth() / Renderer->GetMatrixHeight(), 1.f, 400.f); | ||||||
|  | 
 | ||||||
|  | 	*Console<<"Inner init end!\n"; | ||||||
|  | 
 | ||||||
|  | 	m2.unlock(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::InnerDeinit() | ||||||
|  | { | ||||||
|  | 	m2.lock(); | ||||||
|  | 	Inited = false; | ||||||
|  | 	Loaded = false; | ||||||
|  | 
 | ||||||
|  | 	makeShot = true; | ||||||
|  | 	LoadingQueue.clear(); | ||||||
|  | 	 | ||||||
|  | 	if (LiteModel != NULL) | ||||||
|  | 	{ | ||||||
|  | 		LiteModel->FreeModel(); | ||||||
|  | 		delete LiteModel; | ||||||
|  | 		LiteModel = NULL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	IceModel.clear(); | ||||||
|  | 
 | ||||||
|  | 	SimpleLand = std::shared_ptr<TSimpleLandClass>(); | ||||||
|  | 	SimpleLandInv = std::shared_ptr<TSimpleLandClass>(); | ||||||
|  | 	m2.unlock(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::InnerDraw() | ||||||
|  | { | ||||||
|  | 	m2.lock(); | ||||||
|  | 	if (!Loaded) | ||||||
|  | 	{ | ||||||
|  | 		glClearColor(0.f, 0.f, 0.f, 1.0f); | ||||||
|  | 		glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); | ||||||
|  | 		glBindTexture(GL_TEXTURE_2D, ResourceManager->TexList["ScreenshotTexture"]); | ||||||
|  | 		Renderer->PushProjectionMatrix(1,1); | ||||||
|  | 		Renderer->LoadIdentity(); | ||||||
|  | 		Renderer->DrawRect(vec2(0, 0), vec2(1.f, 1.f)); | ||||||
|  | 		Renderer->PopProjectionMatrix(); | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	DrawAllScene(true); | ||||||
|  | 	 | ||||||
|  | 	if (makeShot) | ||||||
|  | 	{ | ||||||
|  | 		makeShot = false; | ||||||
|  | 
 | ||||||
|  | 		Renderer->SwitchToFrameBuffer("ScreenshotFrame"); | ||||||
|  | 
 | ||||||
|  | 		DrawAllScene(false); | ||||||
|  | 
 | ||||||
|  | 		ResourceManager->TexList.SaveTexDataToPlainBmpToUserData("file.bmp", ResourceManager->FrameManager.ReadFromBufferToTexData("ScreenshotFrame")); | ||||||
|  | 
 | ||||||
|  | 		Renderer->SwitchToScreen(); | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
|  | 	} | ||||||
|  | 	m2.unlock(); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::InnerUpdate(cardinal dt) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 	if (!Loaded) | ||||||
|  | 	{ | ||||||
|  | 
 | ||||||
|  | 		boost::apply_visitor( LoadingQueueVisitor(), *LoadingQueue.begin() ); | ||||||
|  | 		LoadingQueue.erase(LoadingQueue.begin()); | ||||||
|  | 
 | ||||||
|  | 		if (LoadingQueue.size() == 0) | ||||||
|  | 		{ | ||||||
|  | 			Loaded = true; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	if (WaveDir) | ||||||
|  | 	{ | ||||||
|  | 		WaterTimer += dt/1000.f; | ||||||
|  | 		if (WaterTimer >= 10 * pi) | ||||||
|  | 		{ | ||||||
|  | 			WaveDir = false; | ||||||
|  | 			WaterTimer = 10 * pi; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		WaterTimer -= dt/1000.f; | ||||||
|  | 		if (WaterTimer < 0) | ||||||
|  | 		{ | ||||||
|  | 			WaveDir = true; | ||||||
|  | 			WaterTimer = 0; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	CloudTimer += dt / 60000.f; | ||||||
|  | 
 | ||||||
|  | 	while (CloudTimer >= 1.f) | ||||||
|  | 	{ | ||||||
|  | 		CloudTimer -= 1.f; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	SnowTimer += dt/3000.f; | ||||||
|  | 
 | ||||||
|  | 	while (SnowTimer > 10.f) | ||||||
|  | 	{ | ||||||
|  | 		SnowTimer -= 10.f; | ||||||
|  | 	} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::InnerOnMove(vec2 shift) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 	shift = vec2(shift.v[0]*Renderer->GetMatrixWidth()/static_cast<float>(Renderer->GetScreenWidth()), shift.v[1]*Renderer->GetMatrixHeight()/static_cast<float>(Renderer->GetScreenHeight())); | ||||||
|  | 	 | ||||||
|  | 	boost::get<TPanoramicCamera>(Renderer->Camera).MoveAlpha(-pi*shift.v[0]*0.1f); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TAndroidApplication::OnMouseDown(TMouseState& mouseState) | ||||||
|  | { | ||||||
|  | 	 | ||||||
|  | } | ||||||
							
								
								
									
										90
									
								
								jni/main_code.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,90 @@ | |||||||
|  | #ifndef GL_CODE_H_INCLUDED | ||||||
|  | #define GL_CODE_H_INCLUDED | ||||||
|  | 
 | ||||||
|  | #ifdef TARGET_ANDROID | ||||||
|  | //#include "android_api.h"
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <math.h> | ||||||
|  | 
 | ||||||
|  | #ifdef TARGET_ANDROID | ||||||
|  | #include <GLES/gl.h> | ||||||
|  | #include <GLES2/gl2.h> | ||||||
|  | #include <GLES2/gl2ext.h> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "boost/shared_ptr.hpp" | ||||||
|  | #include "boost/thread/thread.hpp" | ||||||
|  | #include "boost/asio.hpp" | ||||||
|  | #include "boost/signal.hpp" | ||||||
|  | #include "boost/assign.hpp" | ||||||
|  | #include "boost/variant.hpp" | ||||||
|  | #include "boost/function.hpp" | ||||||
|  | #include "boost/bind.hpp" | ||||||
|  | 
 | ||||||
|  | #include "include/Engine.h" | ||||||
|  | 
 | ||||||
|  | using namespace SE; | ||||||
|  | 
 | ||||||
|  | class TAndroidApplication : public TApplication, public TSerializeInterface | ||||||
|  | { | ||||||
|  | protected: | ||||||
|  | 
 | ||||||
|  | 	void LoadModels(); | ||||||
|  | 	void AddFrameBuffers(); | ||||||
|  | 	 | ||||||
|  | public: | ||||||
|  | 	bool Inited; | ||||||
|  | 	bool Loaded; | ||||||
|  | 	 | ||||||
|  | 	std::vector<boost::variant<boost::function<cardinal()>, boost::function<bool()>, boost::function<void()> > > LoadingQueue; | ||||||
|  | 	 | ||||||
|  | 	TLiteModel* LiteModel; | ||||||
|  | 
 | ||||||
|  | 	float WaterTimer; | ||||||
|  | 	float SnowTimer; | ||||||
|  | 	float CloudTimer; | ||||||
|  | 	float SkyTexShift; | ||||||
|  | 	bool WaveDir; | ||||||
|  | 	 | ||||||
|  | 	std::vector<TLiteModel> IceModel; | ||||||
|  | 	 | ||||||
|  | 	std::shared_ptr<TSimpleLandClass> SimpleLand; | ||||||
|  | 	 | ||||||
|  | 	std::shared_ptr<TSimpleLandClass> SimpleLandInv; | ||||||
|  | 
 | ||||||
|  | 	TAndroidApplication(); | ||||||
|  | 	 | ||||||
|  |      virtual void InnerInit(); | ||||||
|  |      | ||||||
|  |      virtual void InnerDeinit(); | ||||||
|  | 	 | ||||||
|  | 	 virtual void InnerDraw(); | ||||||
|  | 	 | ||||||
|  | 	 virtual void InnerUpdate(cardinal dt); | ||||||
|  | 	  | ||||||
|  | 	 virtual void InnerOnMove(vec2 shift); | ||||||
|  | 
 | ||||||
|  | 	 virtual void OnMouseDown(TMouseState& mouseState); | ||||||
|  | 
 | ||||||
|  | 	bool IsInited() { return Inited; } | ||||||
|  | 	 | ||||||
|  | 	void DrawSceneWithoutWater(bool inv); | ||||||
|  | 	void DrawSnow(); | ||||||
|  | 	void DrawAllScene(bool toScreen); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	virtual void Serialize(boost::property_tree::ptree& propertyTree); | ||||||
|  | 
 | ||||||
|  | 	//void DrawSceneWithoutWaterFrame();
 | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //static void checkGlError(const std::string& op);
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
							
								
								
									
										
											BIN
										
									
								
								res/drawable-hdpi/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										
											BIN
										
									
								
								res/drawable-ldpi/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								res/drawable-mdpi/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 5.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								res/drawable/notificon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 32 KiB | 
							
								
								
									
										
											BIN
										
									
								
								res/drawable/thumb.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 28 KiB | 
							
								
								
									
										7
									
								
								res/layout/main.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,7 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     android:orientation="vertical" | ||||||
|  |     android:layout_width="fill_parent" | ||||||
|  |     android:layout_height="fill_parent" | ||||||
|  |     > | ||||||
|  | </LinearLayout> | ||||||
							
								
								
									
										10
									
								
								res/layout/prefliste.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,10 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <LinearLayout | ||||||
|  |   xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |   android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent"> | ||||||
|  | <RelativeLayout android:id="@+id/LinearLayout01" android:layout_height="wrap_content" android:layout_width="fill_parent"><ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon" android:layout_alignParentLeft="true" android:layout_marginLeft="3dp"></ImageView> | ||||||
|  | </RelativeLayout> | ||||||
|  | <ListView android:layout_width="fill_parent" android:id="@+id/android:list" android:layout_height="wrap_content"></ListView> | ||||||
|  | <TextView android:layout_width="fill_parent" android:id="@+id/android:text_feedback" android:padding="20px" android:text="@string/feedback" android:layout_height="wrap_content"></TextView> | ||||||
|  | 
 | ||||||
|  | </LinearLayout> | ||||||
							
								
								
									
										22
									
								
								res/values-cs/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,22 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  | 	<string name="app_name">Horská odražené</string> | ||||||
|  | 	<string name="description">Horská odráží ve vodě, s účinkem sněhu</string> | ||||||
|  | 	<string name="feedback">Pokud dojde k chybě aplikace, prosím, kontaktujte mě: mephi1984@gmail.com</string> | ||||||
|  | 
 | ||||||
|  | 	<string name="p_snow">Sněžení</string> | ||||||
|  | 	<string name="p_snow_on">Sněžení je zapnuta</string> | ||||||
|  | 	<string name="p_snow_off">Sněžení je vypnutý</string> | ||||||
|  | 	 | ||||||
|  | 	<string name="p_timeofday">Denní čas</string> | ||||||
|  | 	<string name="p_stimeofday">Vyberte si čas dne</string> | ||||||
|  | 		 | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_id"> | ||||||
|  | 		<item>Den</item> | ||||||
|  | 		<item>Přeháňky den</item> | ||||||
|  | 		<item>Noc</item> | ||||||
|  | 	</string-array> | ||||||
|  | 	 | ||||||
|  | </resources> | ||||||
|  | 
 | ||||||
							
								
								
									
										22
									
								
								res/values-de/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,22 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  | 	<string name="app_name">Reflektierte Berg</string> | ||||||
|  | 	<string name="description">Berg spiegelt sich im Wasser, mit dem Effekt der Schnee</string> | ||||||
|  | 	<string name="feedback">Wenn die Anwendung abstürzt, bitte kontaktieren Sie mich: mephi1984@gmail.com</string> | ||||||
|  | 
 | ||||||
|  | 	<string name="p_snow">Schneefall</string> | ||||||
|  | 	<string name="p_snow_on">Schneefall ist eingeschaltet</string> | ||||||
|  | 	<string name="p_snow_off">Schneefall ausgeschaltet</string> | ||||||
|  | 	 | ||||||
|  | 	<string name="p_timeofday">Zeit des Tages</string> | ||||||
|  | 	<string name="p_stimeofday">Wählen Sie die Zeit des Tages</string> | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_id"> | ||||||
|  | 		<item>Day</item> | ||||||
|  | 		<item>Bewölkten Day</item> | ||||||
|  | 		<item>Night</item> | ||||||
|  | 	</string-array> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | </resources> | ||||||
|  | 
 | ||||||
							
								
								
									
										23
									
								
								res/values-es/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,23 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  | 	<string name="app_name">Montaña que se refleja</string> | ||||||
|  | 	<string name="description">Montaña que se refleja en el agua con efectos nevada</string> | ||||||
|  | 	<string name="feedback">Si la aplicación se bloquea, por favor póngase en contacto conmigo: mephi1984@gmail.com</string> | ||||||
|  | 
 | ||||||
|  | 	<string name="p_snow">Las nevadas</string> | ||||||
|  | 	<string name="p_snow_on">Las nevadas se enciende</string> | ||||||
|  | 	<string name="p_snow_off">Las nevadas se apaga</string> | ||||||
|  | 	 | ||||||
|  | 	<string name="p_timeofday">La hora del día</string> | ||||||
|  | 	<string name="p_stimeofday">Elija la hora del día</string> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_id"> | ||||||
|  | 		<item>Día</item> | ||||||
|  | 		<item>Día nublado</item> | ||||||
|  | 		<item>Noche</item> | ||||||
|  | 	</string-array> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | </resources> | ||||||
|  | 
 | ||||||
							
								
								
									
										22
									
								
								res/values-fr/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,22 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  | 	<string name="app_name">Montagne réfléchie</string> | ||||||
|  | 	<string name="description">Montagne reflète dans l\'eau avec des effets des chutes de neige</string> | ||||||
|  | 	<string name="feedback">Si l\'application se bloque, s\'il vous plaît contactez-moi : mephi1984@gmail.com</string> | ||||||
|  | 
 | ||||||
|  | 	<string name="p_snow">Chutes de neige</string> | ||||||
|  | 	<string name="p_snow_on">Chutes de neige est en marche</string> | ||||||
|  | 	<string name="p_snow_off">Chutes de neige est éteint</string> | ||||||
|  | 	 | ||||||
|  | 	<string name="p_timeofday">L\'heure du jour</string> | ||||||
|  | 	<string name="p_stimeofday">Choisissez le moment de la journée</string> | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_id"> | ||||||
|  | 		<item>Jour</item> | ||||||
|  | 		<item>Temps nuageux</item> | ||||||
|  | 		<item>Nuit</item> | ||||||
|  | 	</string-array> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | </resources> | ||||||
|  | 
 | ||||||
							
								
								
									
										30
									
								
								res/values-it/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,30 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  | 	<string name="app_name">Montagna riflessa</string> | ||||||
|  | 	<string name="description">Montagna riflessa nell\'acqua, con l\'effetto di neve</string> | ||||||
|  | 	<string name="feedback">Se l\'applicazione si blocca, si prega di contattare me: mephi1984@gmail.com</string> | ||||||
|  | 
 | ||||||
|  | 	<string name="p_snow">Nevicate</string> | ||||||
|  | 	<string name="p_snow_on">Nevicate si accende</string> | ||||||
|  | 	<string name="p_snow_off">Nevicata è spento</string> | ||||||
|  | 	 | ||||||
|  | 	<string name="p_timeofday">Il momento della giornata</string> | ||||||
|  | 	<string name="p_stimeofday">Scegliere il momento della giornata</string> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_id"> | ||||||
|  | 		<item>Giorno</item> | ||||||
|  | 		<item>Giornata nuvolosa</item> | ||||||
|  | 		<item>Notte</item> | ||||||
|  | 	</string-array> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_value"> | ||||||
|  | 		<item>0</item> | ||||||
|  | 		<item>1</item> | ||||||
|  | 		<item>2</item> | ||||||
|  | 	</string-array> | ||||||
|  | 	 | ||||||
|  | </resources> | ||||||
|  | 
 | ||||||
							
								
								
									
										22
									
								
								res/values-nl/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,22 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  | 	<string name="app_name">Reflected berg</string> | ||||||
|  | 	<string name="description">Mountain weerspiegeld in het water met sneeuwval effecten</string> | ||||||
|  | 	<string name="feedback">Als de toepassing crasht, neem dan contact met mij op: mephi1984@gmail.com</string> | ||||||
|  | 
 | ||||||
|  | 	<string name="p_snow">Sneeuwval</string> | ||||||
|  | 	<string name="p_snow_on">Sneeuwval is ingeschakeld</string> | ||||||
|  | 	<string name="p_snow_off">Sneeuwval is uitgeschakeld</string> | ||||||
|  | 	 | ||||||
|  | 	<string name="p_timeofday">Tijd van de dag</string> | ||||||
|  | 	<string name="p_stimeofday">Kies de tijd van de dag</string> | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_id"> | ||||||
|  | 		<item>Dag</item> | ||||||
|  | 		<item>Bewolkte dag</item> | ||||||
|  | 		<item>Nacht</item> | ||||||
|  | 	</string-array> | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | </resources> | ||||||
|  | 
 | ||||||
							
								
								
									
										23
									
								
								res/values-pt/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,23 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  | 	<string name="app_name">Montanha refletidas</string> | ||||||
|  | 	<string name="description">Montanha refletida na água com efeitos queda de neve</string> | ||||||
|  | 	<string name="feedback">Se o aplicativo falha, por favor contacte-me: mephi1984@gmail.com</string> | ||||||
|  | 
 | ||||||
|  | 	<string name="p_snow">Queda de neve</string> | ||||||
|  | 	<string name="p_snow_on">Neve está ligado</string> | ||||||
|  | 	<string name="p_snow_off">Neve está desligado</string> | ||||||
|  | 	 | ||||||
|  | 	<string name="p_timeofday">Hora do dia</string> | ||||||
|  | 	<string name="p_stimeofday">Escolha a hora do dia</string> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_id"> | ||||||
|  | 		<item>Dia</item> | ||||||
|  | 		<item>Dia nublado</item> | ||||||
|  | 		<item>Noite</item> | ||||||
|  | 	</string-array> | ||||||
|  | 
 | ||||||
|  | 	 | ||||||
|  | </resources> | ||||||
|  | 
 | ||||||
							
								
								
									
										23
									
								
								res/values-ru/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,23 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  | 	<string name="app_name">Отраженная гора</string> | ||||||
|  | 	<string name="description">Гора, отраженная в воде, с эффектом снегопада</string> | ||||||
|  | 	<string name="feedback">Если приложение падает, пожалуйста, свяжитесь со мною: mephi1984@gmail.com</string> | ||||||
|  | 
 | ||||||
|  | 	<string name="p_snow">Снегопад</string> | ||||||
|  | 	<string name="p_snow_on">Снегопад включен</string> | ||||||
|  | 	<string name="p_snow_off">Снегопад выключен</string> | ||||||
|  | 	 | ||||||
|  | 	<string name="p_timeofday">Время суток</string> | ||||||
|  | 	<string name="p_stimeofday">Выберите время суток</string> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_id"> | ||||||
|  | 		<item>День</item> | ||||||
|  | 		<item>Облачный день</item> | ||||||
|  | 		<item>Ночь</item> | ||||||
|  | 	</string-array> | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | </resources> | ||||||
|  | 
 | ||||||
							
								
								
									
										43
									
								
								res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,43 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  | 	<string name="app_name">Reflected mountain</string> | ||||||
|  | 	<string name="description">Mountain reflected in the water with snow effects</string> | ||||||
|  | 	<string name="feedback">If wallpaper crashes or something else goes wrong, please, contact with me: mephi1984@gmail.com</string> | ||||||
|  | 
 | ||||||
|  | 	<string name="p_snow">Snow</string> | ||||||
|  | 	<string name="p_snow_on">Snow is on</string> | ||||||
|  | 	<string name="p_snow_off">Snow is off</string> | ||||||
|  | 	 | ||||||
|  | 	<string name="p_timeofday">Time of day</string> | ||||||
|  | 	<string name="p_stimeofday">Choose time of day to display</string> | ||||||
|  | 	 | ||||||
|  | 	<declare-styleable name="Wallpaper"> | ||||||
|  | 		<!-- | ||||||
|  | 			Component name of an activity that allows the user to modify the | ||||||
|  | 			current settings for this wallpaper. | ||||||
|  | 		--> | ||||||
|  | 		<attr name="settingsActivity" format="reference" /> | ||||||
|  | 		<!-- Reference to a the wallpaper's thumbnail bitmap. --> | ||||||
|  | 		<attr name="thumbnail" format="reference" /> | ||||||
|  | 		<!-- Name of the author of this component, e.g. Google. --> | ||||||
|  | 		<attr name="author" format="reference" /> | ||||||
|  | 		<!-- Short description of the component's purpose or behavior. --> | ||||||
|  | 		<attr name="description" format="reference" /> | ||||||
|  | 	</declare-styleable> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_id"> | ||||||
|  | 		<item>Day</item> | ||||||
|  | 		<item>Cloudy day</item> | ||||||
|  | 		<item>Night</item> | ||||||
|  | 	</string-array> | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	<string-array name="timeofday_value"> | ||||||
|  | 		<item>0</item> | ||||||
|  | 		<item>1</item> | ||||||
|  | 		<item>2</item> | ||||||
|  | 	</string-array> | ||||||
|  | 	 | ||||||
|  | </resources> | ||||||
|  | 
 | ||||||
							
								
								
									
										13
									
								
								res/xml/preferences.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,13 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <PreferenceScreen android:title="Main" | ||||||
|  | 	xmlns:android="http://schemas.android.com/apk/res/android"> | ||||||
|  | 	 | ||||||
|  | 	<ListPreference | ||||||
|  | 			android:key="Timeofday" android:summary="@string/p_stimeofday" | ||||||
|  | 			android:title="@string/p_timeofday" android:entries="@array/timeofday_id" | ||||||
|  | 			android:entryValues="@array/timeofday_value" android:defaultValue="0"/> | ||||||
|  | 			<CheckBoxPreference android:summaryOn="@string/p_snow_on" | ||||||
|  | 			android:key="Snow" android:title="@string/p_snow" | ||||||
|  | 			android:summaryOff="@string/p_snow_off" android:defaultValue="false" /> | ||||||
|  | 
 | ||||||
|  | </PreferenceScreen> | ||||||
							
								
								
									
										6
									
								
								res/xml/wallpaper.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,6 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <wallpaper  | ||||||
|  |     xmlns:android="http://schemas.android.com/apk/res/android"   | ||||||
|  |     android:thumbnail="@drawable/thumb"  | ||||||
|  |     android:description="@string/description" | ||||||
|  |     android:settingsActivity="fishrungames.mountainwallpaper.Prefs"/> | ||||||
							
								
								
									
										960
									
								
								src/fishrungames/mountainwallpaper/GLWallpaperService.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,960 @@ | |||||||
|  | package fishrungames.mountainwallpaper; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import fishrungames.mountainwallpaper.BaseConfigChooser.ComponentSizeChooser; | ||||||
|  | import fishrungames.mountainwallpaper.BaseConfigChooser.SimpleEGLConfigChooser; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Calendar; | ||||||
|  | 
 | ||||||
|  | import javax.microedition.khronos.egl.EGL10; | ||||||
|  | import javax.microedition.khronos.egl.EGLConfig; | ||||||
|  | import javax.microedition.khronos.egl.EGLContext; | ||||||
|  | import javax.microedition.khronos.egl.EGLDisplay; | ||||||
|  | import javax.microedition.khronos.egl.EGLSurface; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import android.service.wallpaper.WallpaperService; | ||||||
|  | import android.util.Log; | ||||||
|  | import android.view.SurfaceHolder; | ||||||
|  | 
 | ||||||
|  | import fishrungames.engine.EngineWrapper; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | public class GLWallpaperService extends WallpaperService { | ||||||
|  | 	private static final String TAG = "GLWallpaperService"; | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public Engine onCreateEngine() { | ||||||
|  | 		return new GLEngine(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public class GLEngine extends Engine { | ||||||
|  | 		public final static int RENDERMODE_WHEN_DIRTY = 0; | ||||||
|  | 		public final static int RENDERMODE_CONTINUOUSLY = 1; | ||||||
|  | 
 | ||||||
|  | 		private GLThread mGLThread; | ||||||
|  | 		private EGLConfigChooser mEGLConfigChooser; | ||||||
|  | 		private EGLContextFactory mEGLContextFactory; | ||||||
|  | 		private EGLWindowSurfaceFactory mEGLWindowSurfaceFactory; | ||||||
|  | 		 | ||||||
|  | 		private int mDebugFlags; | ||||||
|  | 
 | ||||||
|  | 		public GLEngine() { | ||||||
|  | 			super(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onVisibilityChanged(boolean visible) { | ||||||
|  | 			if (visible) { | ||||||
|  | 				onResume(); | ||||||
|  | 			} else { | ||||||
|  | 				onPause(); | ||||||
|  | 			} | ||||||
|  | 			super.onVisibilityChanged(visible); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onCreate(SurfaceHolder surfaceHolder) { | ||||||
|  | 			super.onCreate(surfaceHolder); | ||||||
|  | 			// Log.d(TAG, "GLEngine.onCreate()"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onDestroy() { | ||||||
|  | 			super.onDestroy(); | ||||||
|  | 			// Log.d(TAG, "GLEngine.onDestroy()"); | ||||||
|  | 			mGLThread.requestExitAndWait(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onSurfaceChanged(SurfaceHolder holder, int format, | ||||||
|  | 				int width, int height) { | ||||||
|  | 			// Log.d(TAG, "onSurfaceChanged()"); | ||||||
|  | 			 | ||||||
|  | 
 | ||||||
|  | 			 | ||||||
|  | 			mGLThread.onWindowResize(width, height); | ||||||
|  | 			 | ||||||
|  | 			super.onSurfaceChanged(holder, format, width, height); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onSurfaceCreated(SurfaceHolder holder) { | ||||||
|  | 			Log.d(TAG, "onSurfaceCreated()"); | ||||||
|  | 			mGLThread.surfaceCreated(holder); | ||||||
|  | 			super.onSurfaceCreated(holder); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onSurfaceDestroyed(SurfaceHolder holder) { | ||||||
|  | 			Log.d(TAG, "onSurfaceDestroyed()"); | ||||||
|  | 			mGLThread.surfaceDestroyed(); | ||||||
|  | 			super.onSurfaceDestroyed(holder); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		public void setDebugFlags(int debugFlags) { | ||||||
|  | 			mDebugFlags = debugFlags; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public int getDebugFlags() { | ||||||
|  | 			return mDebugFlags; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void setRenderer() { | ||||||
|  | 			checkRenderThreadState(); | ||||||
|  | 			if (mEGLConfigChooser == null) { | ||||||
|  | 				mEGLConfigChooser = new SimpleEGLConfigChooser(true); | ||||||
|  | 			} | ||||||
|  | 			if (mEGLContextFactory == null) { | ||||||
|  | 				//mEGLContextFactory = new DefaultContextFactory(); | ||||||
|  | 				mEGLContextFactory = new ES20ContextFactory(); | ||||||
|  | 			} | ||||||
|  | 			if (mEGLWindowSurfaceFactory == null) { | ||||||
|  | 				mEGLWindowSurfaceFactory = new DefaultWindowSurfaceFactory(); | ||||||
|  | 			} | ||||||
|  | 			mGLThread = new GLThread(mEGLConfigChooser, | ||||||
|  | 					mEGLContextFactory, mEGLWindowSurfaceFactory); | ||||||
|  | 			mGLThread.start(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void setEGLContextFactory(EGLContextFactory factory) { | ||||||
|  | 			checkRenderThreadState(); | ||||||
|  | 			mEGLContextFactory = factory; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void setEGLWindowSurfaceFactory(EGLWindowSurfaceFactory factory) { | ||||||
|  | 			checkRenderThreadState(); | ||||||
|  | 			mEGLWindowSurfaceFactory = factory; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void setEGLConfigChooser(EGLConfigChooser configChooser) { | ||||||
|  | 			checkRenderThreadState(); | ||||||
|  | 			mEGLConfigChooser = configChooser; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void setEGLConfigChooser(boolean needDepth) { | ||||||
|  | 			setEGLConfigChooser(new SimpleEGLConfigChooser(needDepth)); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void setEGLConfigChooser(int redSize, int greenSize, | ||||||
|  | 				int blueSize, int alphaSize, int depthSize, int stencilSize) { | ||||||
|  | 			setEGLConfigChooser(new ComponentSizeChooser(redSize, greenSize, | ||||||
|  | 					blueSize, alphaSize, depthSize, stencilSize)); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void setRenderMode(int renderMode) { | ||||||
|  | 			mGLThread.setRenderMode(renderMode); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public int getRenderMode() { | ||||||
|  | 			return mGLThread.getRenderMode(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void requestRender() { | ||||||
|  | 			mGLThread.requestRender(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void onPause() { | ||||||
|  | 			mGLThread.onPause(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void onResume() { | ||||||
|  | 			mGLThread.onResume(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public void queueEvent(Runnable r) { | ||||||
|  | 			mGLThread.queueEvent(r); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		private void checkRenderThreadState() { | ||||||
|  | 			if (mGLThread != null) { | ||||||
|  | 				throw new IllegalStateException( | ||||||
|  | 						"setRenderer has already been called for this instance."); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // ---------------------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * An interface for customizing the eglCreateContext and eglDestroyContext | ||||||
|  |  * calls. | ||||||
|  |  *  | ||||||
|  |  *  | ||||||
|  |  * This interface must be implemented by clients wishing to call | ||||||
|  |  * {@link GLWallpaperService#setEGLContextFactory(EGLContextFactory)} | ||||||
|  |  */ | ||||||
|  | interface EGLContextFactory { | ||||||
|  | 	EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig); | ||||||
|  | 
 | ||||||
|  | 	void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class DefaultContextFactory implements EGLContextFactory { | ||||||
|  | 
 | ||||||
|  | 	public EGLContext createContext(EGL10 egl, EGLDisplay display, | ||||||
|  | 			EGLConfig config) { | ||||||
|  | 		return egl | ||||||
|  | 				.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, null); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) { | ||||||
|  | 		egl.eglDestroyContext(display, context); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ES20ContextFactory implements EGLContextFactory { | ||||||
|  | 
 | ||||||
|  | 	private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098; | ||||||
|  | 	 | ||||||
|  | 	public EGLContext createContext(EGL10 egl, EGLDisplay display, | ||||||
|  | 			EGLConfig config) { | ||||||
|  | 		 | ||||||
|  | 		 | ||||||
|  | 		int[] attrib_list = | ||||||
|  | 				{ EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE }; | ||||||
|  | 
 | ||||||
|  | 		return egl | ||||||
|  | 				.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, attrib_list); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) { | ||||||
|  | 		egl.eglDestroyContext(display, context); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * An interface for customizing the eglCreateWindowSurface and eglDestroySurface | ||||||
|  |  * calls. | ||||||
|  |  *  | ||||||
|  |  *  | ||||||
|  |  * This interface must be implemented by clients wishing to call | ||||||
|  |  * {@link GLWallpaperService#setEGLWindowSurfaceFactory(EGLWindowSurfaceFactory)} | ||||||
|  |  */ | ||||||
|  | interface EGLWindowSurfaceFactory { | ||||||
|  | 	EGLSurface createWindowSurface(EGL10 egl, EGLDisplay display, | ||||||
|  | 			EGLConfig config, Object nativeWindow); | ||||||
|  | 
 | ||||||
|  | 	void destroySurface(EGL10 egl, EGLDisplay display, EGLSurface surface); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class DefaultWindowSurfaceFactory implements EGLWindowSurfaceFactory { | ||||||
|  | 
 | ||||||
|  | 	public EGLSurface createWindowSurface(EGL10 egl, EGLDisplay display, | ||||||
|  | 			EGLConfig config, Object nativeWindow) { | ||||||
|  | 		// this is a bit of a hack to work around Droid init problems - if you | ||||||
|  | 		// don't have this, it'll get hung up on orientation changes | ||||||
|  | 		EGLSurface eglSurface = null; | ||||||
|  | 		while (eglSurface == null) { | ||||||
|  | 			try { | ||||||
|  | 				eglSurface = egl.eglCreateWindowSurface(display, config, | ||||||
|  | 						nativeWindow, null); | ||||||
|  | 			} catch (Throwable t) { | ||||||
|  | 			} finally { | ||||||
|  | 				if (eglSurface == null) { | ||||||
|  | 					try { | ||||||
|  | 						Thread.sleep(10); | ||||||
|  | 					} catch (InterruptedException t) { | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return eglSurface; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void destroySurface(EGL10 egl, EGLDisplay display, EGLSurface surface) { | ||||||
|  | 		egl.eglDestroySurface(display, surface); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class EglHelper { | ||||||
|  | 
 | ||||||
|  | 	private EGL10 mEgl; | ||||||
|  | 	private EGLDisplay mEglDisplay; | ||||||
|  | 	private EGLSurface mEglSurface; | ||||||
|  | 	private EGLContext mEglContext; | ||||||
|  | 	EGLConfig mEglConfig; | ||||||
|  | 
 | ||||||
|  | 	private EGLConfigChooser mEGLConfigChooser; | ||||||
|  | 	private EGLContextFactory mEGLContextFactory; | ||||||
|  | 	private EGLWindowSurfaceFactory mEGLWindowSurfaceFactory; | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | 	public EglHelper(EGLConfigChooser chooser, | ||||||
|  | 			EGLContextFactory contextFactory, | ||||||
|  | 			EGLWindowSurfaceFactory surfaceFactory) { | ||||||
|  | 		this.mEGLConfigChooser = chooser; | ||||||
|  | 		this.mEGLContextFactory = contextFactory; | ||||||
|  | 		this.mEGLWindowSurfaceFactory = surfaceFactory; | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Initialize EGL for a given configuration spec. | ||||||
|  | 	 *  | ||||||
|  | 	 * @param configSpec | ||||||
|  | 	 */ | ||||||
|  | 	public void start() { | ||||||
|  | 		String instanceId = ""; | ||||||
|  | 		Log.d("EglHelper" + instanceId, "start()"); | ||||||
|  | 		if (mEgl == null) { | ||||||
|  | 			Log.d("EglHelper" + instanceId, "getting new EGL"); | ||||||
|  | 			/* | ||||||
|  | 			 * Get an EGL instance | ||||||
|  | 			 */ | ||||||
|  | 			mEgl = (EGL10) EGLContext.getEGL(); | ||||||
|  | 		} else { | ||||||
|  | 			Log.d("EglHelper" + instanceId, "reusing EGL"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (mEglDisplay == null) { | ||||||
|  | 			Log.d("EglHelper" + instanceId, "getting new display"); | ||||||
|  | 			/* | ||||||
|  | 			 * Get to the default display. | ||||||
|  | 			 */ | ||||||
|  | 			mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); | ||||||
|  | 		} else { | ||||||
|  | 			Log.d("EglHelper" + instanceId, "reusing display"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (mEglConfig == null) { | ||||||
|  | 			Log.d("EglHelper" + instanceId, "getting new config"); | ||||||
|  | 			/* | ||||||
|  | 			 * We can now initialize EGL for that display | ||||||
|  | 			 */ | ||||||
|  | 			int[] version = new int[2]; | ||||||
|  | 			mEgl.eglInitialize(mEglDisplay, version); | ||||||
|  | 			mEglConfig = mEGLConfigChooser.chooseConfig(mEgl, mEglDisplay); | ||||||
|  | 		} else { | ||||||
|  | 			Log.d("EglHelper" + instanceId, "reusing config"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (mEglContext == null) { | ||||||
|  | 			Log.d("EglHelper" + instanceId, "creating new context"); | ||||||
|  | 			/* | ||||||
|  | 			 * Create an OpenGL ES context. This must be done only once, an | ||||||
|  | 			 * OpenGL context is a somewhat heavy object. | ||||||
|  | 			 */ | ||||||
|  | 			mEglContext = mEGLContextFactory.createContext(mEgl, mEglDisplay, | ||||||
|  | 					mEglConfig); | ||||||
|  | 			if (mEglContext == null || mEglContext == EGL10.EGL_NO_CONTEXT) { | ||||||
|  | 				throw new RuntimeException("createContext failed"); | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			Log.d("EglHelper" + instanceId, "reusing context"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		mEglSurface = null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* | ||||||
|  | 	 * React to the creation of a new surface by creating and returning an | ||||||
|  | 	 * OpenGL interface that renders to that surface. | ||||||
|  | 	 */ | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	public void createSurface(SurfaceHolder holder) { | ||||||
|  | 		 | ||||||
|  | 		if (mEglSurface != null && mEglSurface != EGL10.EGL_NO_SURFACE) { | ||||||
|  | 
 | ||||||
|  | 			 | ||||||
|  | 			mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE, | ||||||
|  | 					EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); | ||||||
|  | 			mEGLWindowSurfaceFactory.destroySurface(mEgl, mEglDisplay, | ||||||
|  | 					mEglSurface); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		 | ||||||
|  | 		mEglSurface = mEGLWindowSurfaceFactory.createWindowSurface(mEgl, | ||||||
|  | 				mEglDisplay, mEglConfig, holder); | ||||||
|  | 
 | ||||||
|  | 		if (mEglSurface == null || mEglSurface == EGL10.EGL_NO_SURFACE) { | ||||||
|  | 			throw new RuntimeException("createWindowSurface failed"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	 | ||||||
|  | 		if (!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, | ||||||
|  | 				mEglContext)) { | ||||||
|  | 			//throw new RuntimeException("eglMakeCurrent failed."); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Display the current render surface. | ||||||
|  | 	 *  | ||||||
|  | 	 * @return false if the context has been lost. | ||||||
|  | 	 */ | ||||||
|  | 	public boolean swap() { | ||||||
|  | 		try { | ||||||
|  | 			mEgl.eglSwapBuffers(mEglDisplay, mEglSurface); | ||||||
|  | 		} catch (Exception e) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		return true; | ||||||
|  | 		 | ||||||
|  | 		 | ||||||
|  | 		/* | ||||||
|  | 		 * Always check for EGL_CONTEXT_LOST, which means the context and all | ||||||
|  | 		 * associated data were lost (For instance because the device went to | ||||||
|  | 		 * sleep). We need to sleep until we get a new surface. | ||||||
|  | 		 */ | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void destroySurface() { | ||||||
|  | 		if (mEglSurface != null && mEglSurface != EGL10.EGL_NO_SURFACE) { | ||||||
|  | 			mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE, | ||||||
|  | 					EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); | ||||||
|  | 			mEGLWindowSurfaceFactory.destroySurface(mEgl, mEglDisplay, | ||||||
|  | 					mEglSurface); | ||||||
|  | 			mEglSurface = null; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void finish() { | ||||||
|  | 		if (mEglContext != null) { | ||||||
|  | 			mEGLContextFactory.destroyContext(mEgl, mEglDisplay, mEglContext); | ||||||
|  | 			mEglContext = null; | ||||||
|  | 		} | ||||||
|  | 		if (mEglDisplay != null) { | ||||||
|  | 			mEgl.eglTerminate(mEglDisplay); | ||||||
|  | 			mEglDisplay = null; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class GLThread extends Thread { | ||||||
|  | 	private final static boolean LOG_THREADS = false; | ||||||
|  | 	public final static int DEBUG_CHECK_GL_ERROR = 1; | ||||||
|  | 	public final static int DEBUG_LOG_GL_CALLS = 2; | ||||||
|  | 	 | ||||||
|  | 	private final GLThreadManager sGLThreadManager = new GLThreadManager(); | ||||||
|  | 	private GLThread mEglOwner; | ||||||
|  | 
 | ||||||
|  | 	private EGLConfigChooser mEGLConfigChooser; | ||||||
|  | 	private EGLContextFactory mEGLContextFactory; | ||||||
|  | 	private EGLWindowSurfaceFactory mEGLWindowSurfaceFactory; | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | 	public SurfaceHolder mHolder; | ||||||
|  | 	private boolean mSizeChanged = true; | ||||||
|  | 
 | ||||||
|  | 	// Once the thread is started, all accesses to the following member | ||||||
|  | 	// variables are protected by the sGLThreadManager monitor | ||||||
|  | 	public boolean mDone; | ||||||
|  | 	private boolean mPaused; | ||||||
|  | 	private boolean mHasSurface; | ||||||
|  | 	private boolean mWaitingForSurface; | ||||||
|  | 	private boolean mHaveEgl; | ||||||
|  | 	private int mWidth; | ||||||
|  | 	private int mHeight; | ||||||
|  | 	private int mRenderMode; | ||||||
|  | 	private boolean mRequestRender; | ||||||
|  | 	private boolean mEventsWaiting; | ||||||
|  | 	// End of member variables protected by the sGLThreadManager monitor. | ||||||
|  | 
 | ||||||
|  | 	//private GLWallpaperService.Renderer mRenderer; | ||||||
|  | 	 | ||||||
|  | 	private ArrayList mEventQueue = new ArrayList(); | ||||||
|  | 	private EglHelper mEglHelper; | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	static long lastTimeStamp; | ||||||
|  | 	static boolean gameIsInited = false; | ||||||
|  | 
 | ||||||
|  | 	GLThread(EGLConfigChooser chooser, | ||||||
|  | 			EGLContextFactory contextFactory, | ||||||
|  | 			EGLWindowSurfaceFactory surfaceFactory) { | ||||||
|  | 		super(); | ||||||
|  | 		mDone = false; | ||||||
|  | 		mWidth = 0; | ||||||
|  | 		mHeight = 0; | ||||||
|  | 		mRequestRender = true; | ||||||
|  | 		mRenderMode = GLWallpaperService.GLEngine.RENDERMODE_CONTINUOUSLY; | ||||||
|  | 		 | ||||||
|  | 		this.mEGLConfigChooser = chooser; | ||||||
|  | 		this.mEGLContextFactory = contextFactory; | ||||||
|  | 		this.mEGLWindowSurfaceFactory = surfaceFactory; | ||||||
|  | 		 | ||||||
|  | 		Calendar c = Calendar.getInstance(); | ||||||
|  | 		lastTimeStamp = c.getTimeInMillis(); | ||||||
|  | 		gameIsInited = true; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void run() { | ||||||
|  | 		setName("GLThread " + getId()); | ||||||
|  | 		if (LOG_THREADS) { | ||||||
|  | 			Log.i("GLThread", "starting tid=" + getId()); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		try { | ||||||
|  | 			guardedRun(); | ||||||
|  | 		} catch (InterruptedException e) { | ||||||
|  | 			// fall thru and exit normally | ||||||
|  | 		} finally { | ||||||
|  | 			sGLThreadManager.threadExiting(this); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* | ||||||
|  | 	 * This private method should only be called inside a | ||||||
|  | 	 * synchronized(sGLThreadManager) block. | ||||||
|  | 	 */ | ||||||
|  | 	private void stopEglLocked() { | ||||||
|  | 		if (mHaveEgl) { | ||||||
|  | 			mHaveEgl = false; | ||||||
|  | 			mEglHelper.destroySurface(); | ||||||
|  | 			sGLThreadManager.releaseEglSurface(this); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void guardedRun() throws InterruptedException { | ||||||
|  | 		mEglHelper = new EglHelper(mEGLConfigChooser, mEGLContextFactory, | ||||||
|  | 				mEGLWindowSurfaceFactory/*, mGLWrapper*/); | ||||||
|  | 		try { | ||||||
|  | 			 | ||||||
|  | 			boolean tellRendererSurfaceCreated = true; | ||||||
|  | 			boolean tellRendererSurfaceChanged = true; | ||||||
|  | 
 | ||||||
|  | 			/* | ||||||
|  | 			 * This is our main activity thread's loop, we go until asked to | ||||||
|  | 			 * quit. | ||||||
|  | 			 */ | ||||||
|  | 			while (!isDone()) { | ||||||
|  | 				/* | ||||||
|  | 				 * Update the asynchronous state (window size) | ||||||
|  | 				 */ | ||||||
|  | 				int w = 0; | ||||||
|  | 				int h = 0; | ||||||
|  | 				boolean changed = false; | ||||||
|  | 				boolean needStart = false; | ||||||
|  | 				boolean eventsWaiting = false; | ||||||
|  | 
 | ||||||
|  | 				synchronized (sGLThreadManager) { | ||||||
|  | 					while (true) { | ||||||
|  | 						// Manage acquiring and releasing the SurfaceView | ||||||
|  | 						// surface and the EGL surface. | ||||||
|  | 						if (mPaused) { | ||||||
|  | 							stopEglLocked(); | ||||||
|  | 						} | ||||||
|  | 						if (!mHasSurface) { | ||||||
|  | 							if (!mWaitingForSurface) { | ||||||
|  | 								stopEglLocked(); | ||||||
|  | 								mWaitingForSurface = true; | ||||||
|  | 								sGLThreadManager.notifyAll(); | ||||||
|  | 							} | ||||||
|  | 						} else { | ||||||
|  | 							if (!mHaveEgl) { | ||||||
|  | 								if (sGLThreadManager.tryAcquireEglSurface(this)) { | ||||||
|  | 									mHaveEgl = true; | ||||||
|  | 									mEglHelper.start(); | ||||||
|  | 									mRequestRender = true; | ||||||
|  | 									needStart = true; | ||||||
|  | 								} | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 
 | ||||||
|  | 						// Check if we need to wait. If not, update any state | ||||||
|  | 						// that needs to be updated, copy any state that | ||||||
|  | 						// needs to be copied, and use "break" to exit the | ||||||
|  | 						// wait loop. | ||||||
|  | 
 | ||||||
|  | 						if (mDone) { | ||||||
|  | 							return; | ||||||
|  | 						} | ||||||
|  | 
 | ||||||
|  | 						if (mEventsWaiting) { | ||||||
|  | 							eventsWaiting = true; | ||||||
|  | 							mEventsWaiting = false; | ||||||
|  | 							break; | ||||||
|  | 						} | ||||||
|  | 
 | ||||||
|  | 						if ((!mPaused) | ||||||
|  | 								&& mHasSurface | ||||||
|  | 								&& mHaveEgl | ||||||
|  | 								&& (mWidth > 0) | ||||||
|  | 								&& (mHeight > 0) | ||||||
|  | 								&& (mRequestRender || (mRenderMode == GLWallpaperService.GLEngine.RENDERMODE_CONTINUOUSLY))) { | ||||||
|  | 							changed = mSizeChanged; | ||||||
|  | 							w = mWidth; | ||||||
|  | 							h = mHeight; | ||||||
|  | 							mSizeChanged = false; | ||||||
|  | 							mRequestRender = false; | ||||||
|  | 							if (mHasSurface && mWaitingForSurface) { | ||||||
|  | 								changed = true; | ||||||
|  | 								mWaitingForSurface = false; | ||||||
|  | 								sGLThreadManager.notifyAll(); | ||||||
|  | 							} | ||||||
|  | 							break; | ||||||
|  | 						} | ||||||
|  | 						 | ||||||
|  | 						 | ||||||
|  | 
 | ||||||
|  | 						// By design, this is the only place where we wait(). | ||||||
|  | 
 | ||||||
|  | 						if (LOG_THREADS) { | ||||||
|  | 							Log.i("GLThread", "waiting tid=" + getId()); | ||||||
|  | 						} | ||||||
|  | 						sGLThreadManager.wait(); | ||||||
|  | 					} | ||||||
|  | 				} // end of synchronized(sGLThreadManager) | ||||||
|  | 
 | ||||||
|  | 				/* | ||||||
|  | 				 * Handle queued events | ||||||
|  | 				 */ | ||||||
|  | 				if (eventsWaiting) { | ||||||
|  | 					Runnable r; | ||||||
|  | 					while ((r = getEvent()) != null) { | ||||||
|  | 						r.run(); | ||||||
|  | 						if (isDone()) { | ||||||
|  | 							return; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 					// Go back and see if we need to wait to render. | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				if (needStart) { | ||||||
|  | 					tellRendererSurfaceCreated = true; | ||||||
|  | 					changed = true; | ||||||
|  | 				} | ||||||
|  | 				if (changed) { | ||||||
|  | 					mEglHelper.createSurface(mHolder); | ||||||
|  | 					tellRendererSurfaceChanged = true; | ||||||
|  | 				} | ||||||
|  | 				if (tellRendererSurfaceCreated) { | ||||||
|  | 					 | ||||||
|  | 					tellRendererSurfaceCreated = false; | ||||||
|  | 				} | ||||||
|  | 				 | ||||||
|  | 				if (tellRendererSurfaceChanged) { | ||||||
|  | 					 | ||||||
|  | 					 | ||||||
|  | 					//Xperimental -- VLAD KHOREV | ||||||
|  | 					JniWrapper.Init(w, h); | ||||||
|  | 				 | ||||||
|  | 					tellRendererSurfaceChanged = false; | ||||||
|  | 				} | ||||||
|  | 				 | ||||||
|  | 				 | ||||||
|  | 				if ((w > 0) && (h > 0)) { | ||||||
|  | 					/* draw a frame here */ | ||||||
|  | 					 | ||||||
|  | 					if (gameIsInited) | ||||||
|  | 					{ | ||||||
|  | 						Calendar c = Calendar.getInstance(); | ||||||
|  | 	 | ||||||
|  | 						long currentTimeStamp = c.getTimeInMillis(); | ||||||
|  | 				 | ||||||
|  | 						EngineWrapper.Update(currentTimeStamp - lastTimeStamp); | ||||||
|  | 					 | ||||||
|  | 						lastTimeStamp = currentTimeStamp; | ||||||
|  | 
 | ||||||
|  | 					} | ||||||
|  | 					 | ||||||
|  | 					/* | ||||||
|  | 					 * Once we're done with GL, we need to call swapBuffers() to | ||||||
|  | 					 * instruct the system to display the rendered frame | ||||||
|  | 					 */ | ||||||
|  | 					mEglHelper.swap(); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} finally { | ||||||
|  | 			/* | ||||||
|  | 			 * clean-up everything... | ||||||
|  | 			 */ | ||||||
|  | 			synchronized (sGLThreadManager) { | ||||||
|  | 				stopEglLocked(); | ||||||
|  | 				mEglHelper.finish(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private boolean isDone() { | ||||||
|  | 		synchronized (sGLThreadManager) { | ||||||
|  | 			return mDone; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void setRenderMode(int renderMode) { | ||||||
|  | 		if (!((GLWallpaperService.GLEngine.RENDERMODE_WHEN_DIRTY <= renderMode) && (renderMode <= GLWallpaperService.GLEngine.RENDERMODE_CONTINUOUSLY))) { | ||||||
|  | 			throw new IllegalArgumentException("renderMode"); | ||||||
|  | 		} | ||||||
|  | 		synchronized (sGLThreadManager) { | ||||||
|  | 			mRenderMode = renderMode; | ||||||
|  | 			if (renderMode == GLWallpaperService.GLEngine.RENDERMODE_CONTINUOUSLY) { | ||||||
|  | 				sGLThreadManager.notifyAll(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public int getRenderMode() { | ||||||
|  | 		synchronized (sGLThreadManager) { | ||||||
|  | 			return mRenderMode; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void requestRender() { | ||||||
|  | 		synchronized (sGLThreadManager) { | ||||||
|  | 			mRequestRender = true; | ||||||
|  | 			sGLThreadManager.notifyAll(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void surfaceCreated(SurfaceHolder holder) { | ||||||
|  | 		mHolder = holder; | ||||||
|  | 		synchronized (sGLThreadManager) { | ||||||
|  | 			if (LOG_THREADS) { | ||||||
|  | 				Log.i("GLThread", "surfaceCreated tid=" + getId()); | ||||||
|  | 			} | ||||||
|  | 			mHasSurface = true; | ||||||
|  | 			sGLThreadManager.notifyAll(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void surfaceDestroyed() { | ||||||
|  | 		synchronized (sGLThreadManager) { | ||||||
|  | 			if (LOG_THREADS) { | ||||||
|  | 				Log.i("GLThread", "surfaceDestroyed tid=" + getId()); | ||||||
|  | 			} | ||||||
|  | 			mHasSurface = false; | ||||||
|  | 			sGLThreadManager.notifyAll(); | ||||||
|  | 			while (!mWaitingForSurface && isAlive() && !mDone) { | ||||||
|  | 				try { | ||||||
|  | 					sGLThreadManager.wait(); | ||||||
|  | 				} catch (InterruptedException e) { | ||||||
|  | 					Thread.currentThread().interrupt(); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void onPause() { | ||||||
|  | 		synchronized (sGLThreadManager) { | ||||||
|  | 			mPaused = true; | ||||||
|  | 			sGLThreadManager.notifyAll(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void onResume() { | ||||||
|  | 		synchronized (sGLThreadManager) { | ||||||
|  | 			mPaused = false; | ||||||
|  | 			mRequestRender = true; | ||||||
|  | 			sGLThreadManager.notifyAll(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void onWindowResize(int w, int h) { | ||||||
|  | 		synchronized (sGLThreadManager) { | ||||||
|  | 			mWidth = w; | ||||||
|  | 			mHeight = h; | ||||||
|  | 			mSizeChanged = true; | ||||||
|  | 			sGLThreadManager.notifyAll(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void requestExitAndWait() { | ||||||
|  | 		// don't call this from GLThread thread or it is a guaranteed | ||||||
|  | 		// deadlock! | ||||||
|  | 		synchronized (sGLThreadManager) { | ||||||
|  | 			mDone = true; | ||||||
|  | 			sGLThreadManager.notifyAll(); | ||||||
|  | 		} | ||||||
|  | 		try { | ||||||
|  | 			join(); | ||||||
|  | 		} catch (InterruptedException ex) { | ||||||
|  | 			Thread.currentThread().interrupt(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Queue an "event" to be run on the GL rendering thread. | ||||||
|  | 	 *  | ||||||
|  | 	 * @param r | ||||||
|  | 	 *            the runnable to be run on the GL rendering thread. | ||||||
|  | 	 */ | ||||||
|  | 	public void queueEvent(Runnable r) { | ||||||
|  | 		synchronized (this) { | ||||||
|  | 			mEventQueue.add(r); | ||||||
|  | 			synchronized (sGLThreadManager) { | ||||||
|  | 				mEventsWaiting = true; | ||||||
|  | 				sGLThreadManager.notifyAll(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private Runnable getEvent() { | ||||||
|  | 		synchronized (this) { | ||||||
|  | 			if (mEventQueue.size() > 0) { | ||||||
|  | 				return (Runnable) mEventQueue.remove(0); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private class GLThreadManager { | ||||||
|  | 
 | ||||||
|  | 		public synchronized void threadExiting(GLThread thread) { | ||||||
|  | 			if (LOG_THREADS) { | ||||||
|  | 				Log.i("GLThread", "exiting tid=" + thread.getId()); | ||||||
|  | 			} | ||||||
|  | 			thread.mDone = true; | ||||||
|  | 			if (mEglOwner == thread) { | ||||||
|  | 				mEglOwner = null; | ||||||
|  | 			} | ||||||
|  | 			notifyAll(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		/* | ||||||
|  | 		 * Tries once to acquire the right to use an EGL surface. Does not | ||||||
|  | 		 * block. | ||||||
|  | 		 *  | ||||||
|  | 		 * @return true if the right to use an EGL surface was acquired. | ||||||
|  | 		 */ | ||||||
|  | 		public synchronized boolean tryAcquireEglSurface(GLThread thread) { | ||||||
|  | 			if (mEglOwner == thread || mEglOwner == null) { | ||||||
|  | 				mEglOwner = thread; | ||||||
|  | 				notifyAll(); | ||||||
|  | 				return true; | ||||||
|  | 			} | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public synchronized void releaseEglSurface(GLThread thread) { | ||||||
|  | 			if (mEglOwner == thread) { | ||||||
|  | 				mEglOwner = null; | ||||||
|  | 			} | ||||||
|  | 			notifyAll(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | interface EGLConfigChooser { | ||||||
|  | 	EGLConfig chooseConfig(EGL10 egl, EGLDisplay display); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | abstract class BaseConfigChooser implements EGLConfigChooser { | ||||||
|  | 	public BaseConfigChooser(int[] configSpec) { | ||||||
|  | 		mConfigSpec = configSpec; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { | ||||||
|  | 		int[] num_config = new int[1]; | ||||||
|  | 		egl.eglChooseConfig(display, mConfigSpec, null, 0, num_config); | ||||||
|  | 
 | ||||||
|  | 		int numConfigs = num_config[0]; | ||||||
|  | 
 | ||||||
|  | 		if (numConfigs <= 0) { | ||||||
|  | 			throw new IllegalArgumentException("No configs match configSpec"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		EGLConfig[] configs = new EGLConfig[numConfigs]; | ||||||
|  | 		egl.eglChooseConfig(display, mConfigSpec, configs, numConfigs, | ||||||
|  | 				num_config); | ||||||
|  | 		EGLConfig config = chooseConfig(egl, display, configs); | ||||||
|  | 		if (config == null) { | ||||||
|  | 			throw new IllegalArgumentException("No config chosen"); | ||||||
|  | 		} | ||||||
|  | 		return config; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	abstract EGLConfig chooseConfig(EGL10 egl, EGLDisplay display, | ||||||
|  | 			EGLConfig[] configs); | ||||||
|  | 
 | ||||||
|  | 	protected int[] mConfigSpec; | ||||||
|  | 
 | ||||||
|  | 	public static class ComponentSizeChooser extends BaseConfigChooser { | ||||||
|  | 		public ComponentSizeChooser(int redSize, int greenSize, int blueSize, | ||||||
|  | 				int alphaSize, int depthSize, int stencilSize) { | ||||||
|  | 			super(new int[] { EGL10.EGL_RED_SIZE, redSize, | ||||||
|  | 					EGL10.EGL_GREEN_SIZE, greenSize, EGL10.EGL_BLUE_SIZE, | ||||||
|  | 					blueSize, EGL10.EGL_ALPHA_SIZE, alphaSize, | ||||||
|  | 					EGL10.EGL_DEPTH_SIZE, depthSize, EGL10.EGL_STENCIL_SIZE, | ||||||
|  | 					stencilSize, EGL10.EGL_NONE }); | ||||||
|  | 			mValue = new int[1]; | ||||||
|  | 			mRedSize = redSize; | ||||||
|  | 			mGreenSize = greenSize; | ||||||
|  | 			mBlueSize = blueSize; | ||||||
|  | 			mAlphaSize = alphaSize; | ||||||
|  | 			mDepthSize = depthSize; | ||||||
|  | 			mStencilSize = stencilSize; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display, | ||||||
|  | 				EGLConfig[] configs) { | ||||||
|  | 			EGLConfig closestConfig = null; | ||||||
|  | 			int closestDistance = 1000; | ||||||
|  | 			for (EGLConfig config : configs) { | ||||||
|  | 				int d = findConfigAttrib(egl, display, config, | ||||||
|  | 						EGL10.EGL_DEPTH_SIZE, 0); | ||||||
|  | 				int s = findConfigAttrib(egl, display, config, | ||||||
|  | 						EGL10.EGL_STENCIL_SIZE, 0); | ||||||
|  | 				if (d >= mDepthSize && s >= mStencilSize) { | ||||||
|  | 					int r = findConfigAttrib(egl, display, config, | ||||||
|  | 							EGL10.EGL_RED_SIZE, 0); | ||||||
|  | 					int g = findConfigAttrib(egl, display, config, | ||||||
|  | 							EGL10.EGL_GREEN_SIZE, 0); | ||||||
|  | 					int b = findConfigAttrib(egl, display, config, | ||||||
|  | 							EGL10.EGL_BLUE_SIZE, 0); | ||||||
|  | 					int a = findConfigAttrib(egl, display, config, | ||||||
|  | 							EGL10.EGL_ALPHA_SIZE, 0); | ||||||
|  | 					int distance = Math.abs(r - mRedSize) | ||||||
|  | 							+ Math.abs(g - mGreenSize) | ||||||
|  | 							+ Math.abs(b - mBlueSize) | ||||||
|  | 							+ Math.abs(a - mAlphaSize); | ||||||
|  | 					if (distance < closestDistance) { | ||||||
|  | 						closestDistance = distance; | ||||||
|  | 						closestConfig = config; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			return closestConfig; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		private int findConfigAttrib(EGL10 egl, EGLDisplay display, | ||||||
|  | 				EGLConfig config, int attribute, int defaultValue) { | ||||||
|  | 
 | ||||||
|  | 			if (egl.eglGetConfigAttrib(display, config, attribute, mValue)) { | ||||||
|  | 				return mValue[0]; | ||||||
|  | 			} | ||||||
|  | 			return defaultValue; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		private int[] mValue; | ||||||
|  | 		// Subclasses can adjust these values: | ||||||
|  | 		protected int mRedSize; | ||||||
|  | 		protected int mGreenSize; | ||||||
|  | 		protected int mBlueSize; | ||||||
|  | 		protected int mAlphaSize; | ||||||
|  | 		protected int mDepthSize; | ||||||
|  | 		protected int mStencilSize; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * This class will choose a supported surface as close to RGB565 as | ||||||
|  | 	 * possible, with or without a depth buffer. | ||||||
|  | 	 *  | ||||||
|  | 	 */ | ||||||
|  | 	public static class SimpleEGLConfigChooser extends ComponentSizeChooser { | ||||||
|  | 		public SimpleEGLConfigChooser(boolean withDepthBuffer) { | ||||||
|  | 			super(4, 4, 4, 0, withDepthBuffer ? 16 : 0, 0); | ||||||
|  | 			// Adjust target values. This way we'll accept a 4444 or | ||||||
|  | 			// 555 buffer if there's no 565 buffer available. | ||||||
|  | 			mRedSize = 5; | ||||||
|  | 			mGreenSize = 6; | ||||||
|  | 			mBlueSize = 5; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										27
									
								
								src/fishrungames/mountainwallpaper/JniWrapper.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,27 @@ | |||||||
|  | package fishrungames.mountainwallpaper; | ||||||
|  | 
 | ||||||
|  | public class JniWrapper | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 	static | ||||||
|  | 	{ | ||||||
|  | 		System.loadLibrary("SalmonWallpaper"); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public static void LoadLibrary() | ||||||
|  | 	{ | ||||||
|  | 		//To force loading libraries | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public static native void SetTimeOfDayPref(int timeofday); | ||||||
|  | 	 | ||||||
|  | 	public static native void SetSnowPref(boolean snow); | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	public static native void Init(int width, int height); | ||||||
|  | 	 | ||||||
|  | 	public static native void SetOffset(float offsetX, float offsetY); | ||||||
|  | 	 | ||||||
|  | 	public static native void SetOrientation(int isLandscape); | ||||||
|  | 	 | ||||||
|  | } | ||||||
							
								
								
									
										233
									
								
								src/fishrungames/mountainwallpaper/MountainWallpaperService.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,233 @@ | |||||||
|  | package fishrungames.mountainwallpaper; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import android.content.Context; | ||||||
|  | import android.content.Intent; | ||||||
|  | import android.content.SharedPreferences; | ||||||
|  | import android.content.SharedPreferences.OnSharedPreferenceChangeListener; | ||||||
|  | import android.content.pm.ApplicationInfo; | ||||||
|  | import android.content.pm.PackageManager; | ||||||
|  | import android.content.pm.PackageManager.NameNotFoundException; | ||||||
|  | 
 | ||||||
|  | import android.net.ConnectivityManager; | ||||||
|  | 
 | ||||||
|  | import android.os.Handler; | ||||||
|  | import android.preference.PreferenceManager; | ||||||
|  | 
 | ||||||
|  | import android.view.MotionEvent; | ||||||
|  | import android.view.SurfaceHolder; | ||||||
|  | 
 | ||||||
|  | //import com.seb.SLWP.SLWP.GlEngine.DownloadTask; | ||||||
|  | 
 | ||||||
|  | import fishrungames.engine.EngineWrapper; | ||||||
|  | 
 | ||||||
|  | public class MountainWallpaperService extends GLWallpaperService implements | ||||||
|  | 		OnSharedPreferenceChangeListener { | ||||||
|  | 	/* | ||||||
|  | 	 * (non-Javadoc) | ||||||
|  | 	 *  | ||||||
|  | 	 * @see android.app.Service#onLowMemory() | ||||||
|  | 	 */ | ||||||
|  | 	static | ||||||
|  | 	{ | ||||||
|  | 		EngineWrapper.LoadSalmonEngineLibrary(); | ||||||
|  | 		JniWrapper.LoadLibrary(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	public static final long SLEEPTIME = 1000 * 60 * 30; // 30 minutes | ||||||
|  | 	private GlEngine mGle; | ||||||
|  | 	 | ||||||
|  | 	public static Context mContext; | ||||||
|  | 	public static boolean ShowClouds; | ||||||
|  | 	public static boolean TouchRot; | ||||||
|  | 	 | ||||||
|  | 	public static int Bg; | ||||||
|  | 	public static boolean Usebg; | ||||||
|  | 	public static int Tex; | ||||||
|  | 	 | ||||||
|  | 	static long Synctime; | ||||||
|  | 	 | ||||||
|  | 	public boolean Slidedir; | ||||||
|  | 	public boolean Slideplanet; | ||||||
|  | 	public boolean Syncrot; | ||||||
|  | 	public static boolean Randomtex = true; | ||||||
|  | 	public static boolean visible = false; | ||||||
|  | 	 | ||||||
|  | 	public static boolean useCropper = true; | ||||||
|  | 	public static int Cropaspect; | ||||||
|  | 	public static boolean loading = false; | ||||||
|  | 	 | ||||||
|  | 	public static final Handler mHandler = new Handler(); | ||||||
|  | 	public static final int RNDMAP = -1; | ||||||
|  | 	public static boolean destroyed; | ||||||
|  | 	public static String bgfile; | ||||||
|  | 	public ConnectivityManager cm; | ||||||
|  | 	public boolean needresume; | ||||||
|  | 	public boolean fstart; | ||||||
|  | 	public static String[] randlist; | ||||||
|  | 	public int curtexidx = -99; | ||||||
|  | 
 | ||||||
|  | 	static final String ACTION_FOREGROUND = "fishrungames.mountainwallpaper.FOREGROUND"; | ||||||
|  | 	static final String ACTION_BACKGROUND = "fishrungames.mountainwallpaper.BACKGROUND"; | ||||||
|  | 		 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onCreate() { | ||||||
|  | 		// TODO Auto-generated method stub | ||||||
|  | 		super.onCreate(); | ||||||
|  | 		 | ||||||
|  | 		 | ||||||
|  | 		PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this); | ||||||
|  | 
 | ||||||
|  | 		EngineWrapper.SetActivityInstance(this); | ||||||
|  | 		EngineWrapper.SetupEnviroment(); | ||||||
|  | 		 | ||||||
|  | 		String apkFilePath = null; | ||||||
|  | 		ApplicationInfo appInfo = null; | ||||||
|  | 		PackageManager packMgmr = this.getPackageManager(); | ||||||
|  | 		try { | ||||||
|  | 		        appInfo = packMgmr.getApplicationInfo("fishrungames.mountainwallpaper", 0); | ||||||
|  | 		    } catch (NameNotFoundException e) { | ||||||
|  | 		  | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 		 e.printStackTrace(); | ||||||
|  | 		throw new RuntimeException("Unable to locate assets, aborting..."); | ||||||
|  | 		    } | ||||||
|  | 		apkFilePath = appInfo.sourceDir; | ||||||
|  | 		 | ||||||
|  | 		EngineWrapper.SetupApkFilePath(apkFilePath); | ||||||
|  | 		 | ||||||
|  | 		Init(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public int onStartCommand(Intent intent, int flags, int startId) { | ||||||
|  | 		// handleCommand(intent); | ||||||
|  | 		// We want this service to continue running until it is explicitly | ||||||
|  | 		// stopped, so return sticky. | ||||||
|  | 		return START_STICKY; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void Init() { | ||||||
|  | 		try { | ||||||
|  | 			mContext = this; | ||||||
|  | 			cm = (ConnectivityManager) mContext | ||||||
|  | 					.getSystemService(Context.CONNECTIVITY_SERVICE); | ||||||
|  | 			 | ||||||
|  | 		} catch (Exception e) { | ||||||
|  | 			e.printStackTrace(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onDestroy() { | ||||||
|  | 		// TODO Auto-generated method stub | ||||||
|  | 		super.onDestroy(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, | ||||||
|  | 			String key) { | ||||||
|  | 		 | ||||||
|  | 		if (key.compareToIgnoreCase("Timeofday") == 0) | ||||||
|  | 		{ | ||||||
|  | 			int time = Integer.parseInt(sharedPreferences.getString("Timeofday", "0")); | ||||||
|  | 			JniWrapper.SetTimeOfDayPref(time); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		if (key.compareToIgnoreCase("Snow") == 0) { | ||||||
|  | 			 | ||||||
|  | 			JniWrapper.SetSnowPref(sharedPreferences.getBoolean("Snow", false)); | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public Engine onCreateEngine() { | ||||||
|  | 		if (mGle != null) { | ||||||
|  | 			mGle = null; | ||||||
|  | 		} | ||||||
|  | 		try { | ||||||
|  | 			 | ||||||
|  | 			mGle = new GlEngine(); | ||||||
|  | 			 | ||||||
|  | 		} catch (Exception e) { | ||||||
|  | 			return null; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return mGle; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	class GlEngine extends GLEngine { | ||||||
|  | 
 | ||||||
|  | 		public Handler mHandler = new Handler(); | ||||||
|  | 		 | ||||||
|  | 		long NOW; | ||||||
|  | 		 | ||||||
|  | 		@Override | ||||||
|  | 		public void onCreate(SurfaceHolder surfaceHolder) { | ||||||
|  | 			super.onCreate(surfaceHolder); | ||||||
|  | 			try { | ||||||
|  | 				this.setTouchEventsEnabled(true); | ||||||
|  | 				fstart = true; | ||||||
|  | 				setRenderer(); | ||||||
|  | 			} catch (Exception e) { | ||||||
|  | 				e.printStackTrace(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onTouchEvent(MotionEvent e) { | ||||||
|  | 			 | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onOffsetsChanged(float xOffset, float yOffset, | ||||||
|  | 				float xOffsetStep, float yOffsetStep, int xPixelOffset, | ||||||
|  | 				int yPixelOffset) { | ||||||
|  | 			 | ||||||
|  | 			super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, | ||||||
|  | 					xPixelOffset, yPixelOffset); | ||||||
|  | 			 | ||||||
|  | 			JniWrapper.SetOffset(xPixelOffset*xOffsetStep, yPixelOffset*yOffsetStep); | ||||||
|  | 			 | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onVisibilityChanged(boolean visible) { | ||||||
|  | 			// TODO Auto-generated method stub | ||||||
|  | 			super.onVisibilityChanged(visible); | ||||||
|  | 			MountainWallpaperService.visible = visible; | ||||||
|  | 			if (visible) { | ||||||
|  | 
 | ||||||
|  | 			} else { | ||||||
|  | 
 | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onPause() { | ||||||
|  | 			super.onPause(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onResume() { | ||||||
|  | 			 | ||||||
|  | 			super.onResume(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public void onSurfaceChanged(SurfaceHolder holder, int format, | ||||||
|  | 				int width, int height) { | ||||||
|  | 			// TODO Auto-generated method stub | ||||||
|  | 			super.onSurfaceChanged(holder, format, width, height); | ||||||
|  | 			fstart = true; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										72
									
								
								src/fishrungames/mountainwallpaper/Prefs.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,72 @@ | |||||||
|  | package fishrungames.mountainwallpaper; | ||||||
|  | 
 | ||||||
|  | import fishrungames.mountainwallpaper.R; | ||||||
|  | import fishrungames.mountainwallpaper.JniWrapper; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import android.content.Intent; | ||||||
|  | 
 | ||||||
|  | import android.net.Uri; | ||||||
|  | import android.os.Bundle; | ||||||
|  | import android.preference.CheckBoxPreference; | ||||||
|  | import android.preference.ListPreference; | ||||||
|  | import android.preference.Preference; | ||||||
|  | import android.preference.PreferenceActivity; | ||||||
|  | 
 | ||||||
|  | import android.preference.Preference.OnPreferenceChangeListener; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | public class Prefs extends PreferenceActivity implements | ||||||
|  | 		OnPreferenceChangeListener { | ||||||
|  | 
 | ||||||
|  | 	 | ||||||
|  | 	private CheckBoxPreference snowPref; | ||||||
|  | 	private ListPreference timeOfDayPref; | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | 	public static Uri currImageURI; | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected void onCreate(Bundle savedInstanceState) { | ||||||
|  | 		super.onCreate(savedInstanceState); | ||||||
|  | 		setContentView(R.layout.prefliste); | ||||||
|  | 		addPreferencesFromResource(R.xml.preferences); | ||||||
|  | 		 | ||||||
|  | 		 | ||||||
|  | 		snowPref = (CheckBoxPreference)this.getPreferenceManager().findPreference("Snow"); | ||||||
|  | 		timeOfDayPref = (ListPreference) findPreference("Timeofday"); | ||||||
|  | 		 | ||||||
|  | 		if (timeOfDayPref.getKey().compareToIgnoreCase("Timeofday") == 0) | ||||||
|  | 		{ | ||||||
|  | 			JniWrapper.SetTimeOfDayPref(Integer.parseInt((String) timeOfDayPref.getValue())); | ||||||
|  | 			 | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		if (snowPref.getKey().compareToIgnoreCase("Snow") == 0) { | ||||||
|  | 			if (!snowPref.isChecked()) | ||||||
|  | 			{ | ||||||
|  | 				JniWrapper.SetSnowPref(false); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				JniWrapper.SetSnowPref(true); | ||||||
|  | 			} | ||||||
|  | 		}	 | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public boolean onPreferenceChange(Preference preference, Object newValue) { | ||||||
|  | 		 | ||||||
|  | 		return true; | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onActivityResult(int requestCode, int resultCode, Intent data) { | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										5
									
								
								windows/Readme.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,5 @@ | |||||||
|  | Для создания своего проекта на основе этого шаблона нужно: | ||||||
|  | 1) Счекаутить движок с svn куда-нибудь, например C:\Work\Salmon Engine\ | ||||||
|  | 1) Указать в системе переменную окружения SalmonEnginePath с путем к движку, например c:\Work\Salmon Engine\ | ||||||
|  | 2) Скопировать содержимое шаблона в какой-нибудь каталог | ||||||
|  | 3) Запустить Template.sln в Visual C++ 2010 | ||||||
							
								
								
									
										34
									
								
								windows/Template.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,34 @@ | |||||||
|  |  | ||||||
|  | Microsoft Visual Studio Solution File, Format Version 11.00 | ||||||
|  | # Visual C++ Express 2010 | ||||||
|  | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Template", "Template\Template.vcxproj", "{0080A3E1-DFBF-4557-B198-E6D5D7724393}" | ||||||
|  | 	ProjectSection(ProjectDependencies) = postProject | ||||||
|  | 		{48ADCE9F-9539-4D3A-BCFA-C2ABABAF0B20} = {48ADCE9F-9539-4D3A-BCFA-C2ABABAF0B20} | ||||||
|  | 	EndProjectSection | ||||||
|  | EndProject | ||||||
|  | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Salmon Engine", "..\..\..\Engine\Salmon Engine\Salmon Engine.vcxproj", "{48ADCE9F-9539-4D3A-BCFA-C2ABABAF0B20}" | ||||||
|  | EndProject | ||||||
|  | Global | ||||||
|  | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
|  | 		Debug_nosound|Win32 = Debug_nosound|Win32 | ||||||
|  | 		Debug|Win32 = Debug|Win32 | ||||||
|  | 		Release|Win32 = Release|Win32 | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||||
|  | 		{0080A3E1-DFBF-4557-B198-E6D5D7724393}.Debug_nosound|Win32.ActiveCfg = Debug|Win32 | ||||||
|  | 		{0080A3E1-DFBF-4557-B198-E6D5D7724393}.Debug_nosound|Win32.Build.0 = Debug|Win32 | ||||||
|  | 		{0080A3E1-DFBF-4557-B198-E6D5D7724393}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||||
|  | 		{0080A3E1-DFBF-4557-B198-E6D5D7724393}.Debug|Win32.Build.0 = Debug|Win32 | ||||||
|  | 		{0080A3E1-DFBF-4557-B198-E6D5D7724393}.Release|Win32.ActiveCfg = Release|Win32 | ||||||
|  | 		{0080A3E1-DFBF-4557-B198-E6D5D7724393}.Release|Win32.Build.0 = Release|Win32 | ||||||
|  | 		{48ADCE9F-9539-4D3A-BCFA-C2ABABAF0B20}.Debug_nosound|Win32.ActiveCfg = Debug_nosound|Win32 | ||||||
|  | 		{48ADCE9F-9539-4D3A-BCFA-C2ABABAF0B20}.Debug_nosound|Win32.Build.0 = Debug_nosound|Win32 | ||||||
|  | 		{48ADCE9F-9539-4D3A-BCFA-C2ABABAF0B20}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||||
|  | 		{48ADCE9F-9539-4D3A-BCFA-C2ABABAF0B20}.Debug|Win32.Build.0 = Debug|Win32 | ||||||
|  | 		{48ADCE9F-9539-4D3A-BCFA-C2ABABAF0B20}.Release|Win32.ActiveCfg = Release|Win32 | ||||||
|  | 		{48ADCE9F-9539-4D3A-BCFA-C2ABABAF0B20}.Release|Win32.Build.0 = Release|Win32 | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(SolutionProperties) = preSolution | ||||||
|  | 		HideSolutionNode = FALSE | ||||||
|  | 	EndGlobalSection | ||||||
|  | EndGlobal | ||||||
							
								
								
									
										90
									
								
								windows/Template/Template.vcxproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,90 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|  |   <ItemGroup Label="ProjectConfigurations"> | ||||||
|  |     <ProjectConfiguration Include="Debug|Win32"> | ||||||
|  |       <Configuration>Debug</Configuration> | ||||||
|  |       <Platform>Win32</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |     <ProjectConfiguration Include="Release|Win32"> | ||||||
|  |       <Configuration>Release</Configuration> | ||||||
|  |       <Platform>Win32</Platform> | ||||||
|  |     </ProjectConfiguration> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <PropertyGroup Label="Globals"> | ||||||
|  |     <ProjectGuid>{0080A3E1-DFBF-4557-B198-E6D5D7724393}</ProjectGuid> | ||||||
|  |     <RootNamespace>Template</RootNamespace> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>Application</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>true</UseDebugLibraries> | ||||||
|  |     <CharacterSet>NotSet</CharacterSet> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | ||||||
|  |     <ConfigurationType>Application</ConfigurationType> | ||||||
|  |     <UseDebugLibraries>false</UseDebugLibraries> | ||||||
|  |     <WholeProgramOptimization>true</WholeProgramOptimization> | ||||||
|  |     <CharacterSet>NotSet</CharacterSet> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||||||
|  |   <ImportGroup Label="ExtensionSettings"> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||||
|  |     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||||
|  |   </ImportGroup> | ||||||
|  |   <PropertyGroup Label="UserMacros" /> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||||
|  |     <IncludePath>$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;$(SalmonEnginePath)include</IncludePath> | ||||||
|  |     <LibraryPath>$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib;$(SalmonEnginePath)$(Configuration)</LibraryPath> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||||
|  |     <IncludePath>$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;$(SalmonEnginePath)include</IncludePath> | ||||||
|  |     <LibraryPath>$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib;$(SalmonEnginePath)$(Configuration)</LibraryPath> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||||
|  |     <ClCompile> | ||||||
|  |       <WarningLevel>Level3</WarningLevel> | ||||||
|  |       <Optimization>Disabled</Optimization> | ||||||
|  |       <AdditionalIncludeDirectories>$(SalmonEnginePath);$(LibsPath)\boost_1_52_0;$(LibsPath)\libogg-1.3.0\include;$(LibsPath)\libvorbis-1.3.2\include;$(LibsPath)\sqplus\sqplus;$(LibsPath)\sqplus\include;$(LibsPath)\DirectXsdk\Include;$(LibsPath)\lpng1510;..\..\jni</AdditionalIncludeDirectories> | ||||||
|  |       <PreprocessorDefinitions>TARGET_WIN32;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0501;DEBUG</PreprocessorDefinitions> | ||||||
|  |       <DisableSpecificWarnings>4503</DisableSpecificWarnings> | ||||||
|  |     </ClCompile> | ||||||
|  |     <Link> | ||||||
|  |       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||||
|  |       <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;opengl32.lib;glu32.lib;Salmon Engine.lib;libogg_static.lib;libvorbis_static.lib;libvorbisfile_static.lib;zlib.lib;libpng15.lib;sqplusD.lib;squirrelD.lib;sqdbglibD.lib;sqstdlibD.lib;dsound.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||||
|  |       <AdditionalLibraryDirectories>$(LibsPath)\boost_1_52_0\boost_windows\libs_engine\$(Configuration);$(LibsPath)\libogg-1.3.0\win32\VS2010\Win32\$(Configuration);$(LibsPath)\libvorbis-1.3.2\win32\VS2010\Win32\$(Configuration);$(LibsPath)\sqplus\lib;$(LibsPath)\DirectXsdk\Lib\x86;$(LibsPath)\lpng1510\projects\vstudio\Debug Library</AdditionalLibraryDirectories> | ||||||
|  |     </Link> | ||||||
|  |   </ItemDefinitionGroup> | ||||||
|  |   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||||
|  |     <ClCompile> | ||||||
|  |       <WarningLevel>Level3</WarningLevel> | ||||||
|  |       <Optimization>MaxSpeed</Optimization> | ||||||
|  |       <FunctionLevelLinking>true</FunctionLevelLinking> | ||||||
|  |       <IntrinsicFunctions>true</IntrinsicFunctions> | ||||||
|  |       <AdditionalIncludeDirectories>$(SalmonEnginePath);$(LibsPath)\boost_1_52_0;$(LibsPath)\libogg-1.3.0\include;$(LibsPath)\libvorbis-1.3.2\include;$(LibsPath)\sqplus\sqplus;$(LibsPath)\sqplus\include;$(LibsPath)\DirectXsdk\Include;$(LibsPath)\lpng1510;..\..\jni</AdditionalIncludeDirectories> | ||||||
|  |       <PreprocessorDefinitions>TARGET_WIN32;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0501;NDEBUG</PreprocessorDefinitions> | ||||||
|  |       <DisableSpecificWarnings>4503</DisableSpecificWarnings> | ||||||
|  |     </ClCompile> | ||||||
|  |     <Link> | ||||||
|  |       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||||
|  |       <EnableCOMDATFolding>true</EnableCOMDATFolding> | ||||||
|  |       <OptimizeReferences>true</OptimizeReferences> | ||||||
|  |       <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;opengl32.lib;glu32.lib;Salmon Engine.lib;libogg_static.lib;libvorbis_static.lib;libvorbisfile_static.lib;zlib.lib;libpng15.lib;sqplus.lib;squirrel.lib;sqdbglib.lib;sqstdlib.lib;dsound.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||||
|  |       <AdditionalLibraryDirectories>$(LibsPath)\boost_1_52_0\boost_windows\libs_engine\$(Configuration);$(LibsPath)\libogg-1.3.0\win32\VS2010\Win32\$(Configuration);$(LibsPath)\libvorbis-1.3.2\win32\VS2010\Win32\$(Configuration);$(LibsPath)\sqplus\lib;$(LibsPath)\DirectXsdk\Lib\x86;$(LibsPath)\lpng1510\projects\vstudio\Release Library</AdditionalLibraryDirectories> | ||||||
|  |     </Link> | ||||||
|  |   </ItemDefinitionGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ClCompile Include="..\..\jni\main_code.cpp" /> | ||||||
|  |     <ClCompile Include="main.cpp" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ClInclude Include="..\..\jni\main_code.h" /> | ||||||
|  |     <ClInclude Include="main.h" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||||
|  |   <ImportGroup Label="ExtensionTargets"> | ||||||
|  |   </ImportGroup> | ||||||
|  | </Project> | ||||||
							
								
								
									
										30
									
								
								windows/Template/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,30 @@ | |||||||
|  | #include "main.h" | ||||||
|  | 
 | ||||||
|  | #include "main_code.h" | ||||||
|  | 
 | ||||||
|  | int APIENTRY WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst, | ||||||
|  | 	LPSTR lpszCmdLine, int nCmdShow) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 	int width = 800; | ||||||
|  | 	int height = 480; | ||||||
|  | 
 | ||||||
|  | 	if (CreateEngine(width, height)) | ||||||
|  | 	{ | ||||||
|  | 		 | ||||||
|  | 		//MyApplication scope
 | ||||||
|  | 		{ | ||||||
|  | 			TAndroidApplication Application; | ||||||
|  | 
 | ||||||
|  | 			Application.OuterInit(width, height, width, height); | ||||||
|  | 
 | ||||||
|  | 			MainLoop(&Application); | ||||||
|  | 			 | ||||||
|  | 			Application.OuterDeinit(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		DestroyEngine(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								windows/Template/main.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,6 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | /* Path to the engine */ | ||||||
|  | #include "include/Engine.h" | ||||||
|  | 
 | ||||||
|  | #include "main_code.h" | ||||||