Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 1 | // Copyright (C) 2009 The Android Open Source Project |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
| 15 | #pragma version(1) |
| 16 | #pragma stateVertex(PVSky) |
| 17 | #pragma stateFragment(PFBackground) |
Jason Sams | cc92447 | 2009-10-05 14:37:53 -0700 | [diff] [blame] | 18 | #pragma stateStore(PFSBackground) |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 19 | |
Mike Cleron | 70ebeb8 | 2009-11-12 07:49:08 -0800 | [diff] [blame] | 20 | #define LEAVES_TEXTURES_COUNT 8 |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 21 | #define LEAF_SIZE 0.55f |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 22 | #define LEAVES_COUNT 14 |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 23 | |
Romain Guy | f0bb956 | 2009-10-07 12:25:24 -0700 | [diff] [blame] | 24 | float skyOffsetX; |
| 25 | float skyOffsetY; |
Jason Sams | 756f974 | 2009-11-15 10:16:07 -0800 | [diff] [blame] | 26 | float g_DT; |
| 27 | int g_LastTime; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 28 | |
| 29 | struct vert_s { |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 30 | float x; |
| 31 | float y; |
| 32 | float z; |
Jason Sams | d6c1f69 | 2009-10-07 18:08:08 -0700 | [diff] [blame] | 33 | float s; |
| 34 | float t; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 35 | }; |
| 36 | |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 37 | struct drop_s { |
Jason Sams | b344cf4 | 2009-11-06 11:50:42 -0800 | [diff] [blame] | 38 | float ampS; |
| 39 | float ampE; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 40 | float spread; |
Jason Sams | ac8dd7e | 2009-10-22 14:52:02 -0700 | [diff] [blame] | 41 | float spread2; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 42 | float invSpread; |
Jason Sams | ac8dd7e | 2009-10-22 14:52:02 -0700 | [diff] [blame] | 43 | float invSpread2; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 44 | float x; |
| 45 | float y; |
| 46 | }; |
| 47 | struct drop_s gDrops[10]; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 48 | int gMaxDrops; |
| 49 | |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 50 | struct Leaves_s { |
| 51 | float x; |
| 52 | float y; |
| 53 | float scale; |
| 54 | float angle; |
| 55 | float spin; |
| 56 | float u1; |
| 57 | float u2; |
| 58 | float altitude; |
| 59 | float rippled; |
| 60 | float deltaX; |
| 61 | float deltaY; |
| 62 | int newLeaf; |
| 63 | }; |
| 64 | |
| 65 | struct Leaves_s gLeavesStore[LEAVES_COUNT]; |
| 66 | |
| 67 | struct Leaves_s* gLeaves[LEAVES_COUNT]; |
| 68 | |
| 69 | struct Leaves_s* gNextLeaves[LEAVES_COUNT]; |
| 70 | |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 71 | void init() { |
| 72 | int ct; |
| 73 | gMaxDrops = 10; |
| 74 | for (ct=0; ct<gMaxDrops; ct++) { |
Jason Sams | b344cf4 | 2009-11-06 11:50:42 -0800 | [diff] [blame] | 75 | gDrops[ct].ampS = 0; |
| 76 | gDrops[ct].ampE = 0; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 77 | gDrops[ct].spread = 1; |
Jason Sams | ac8dd7e | 2009-10-22 14:52:02 -0700 | [diff] [blame] | 78 | gDrops[ct].spread2 = gDrops[ct].spread * gDrops[ct].spread; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 79 | gDrops[ct].invSpread = 1 / gDrops[ct].spread; |
Jason Sams | ac8dd7e | 2009-10-22 14:52:02 -0700 | [diff] [blame] | 80 | gDrops[ct].invSpread2 = gDrops[ct].invSpread * gDrops[ct].invSpread; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 81 | } |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 82 | } |
| 83 | |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 84 | void initLeaves() { |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 85 | struct Leaves_s *leaf = gLeavesStore; |
Jason Sams | 873e993 | 2009-10-22 14:03:52 -0700 | [diff] [blame] | 86 | float width = State->glWidth * 2; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 87 | float height = State->glHeight; |
| 88 | |
| 89 | int i; |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 90 | for (i = 0; i < LEAVES_COUNT; i ++) { |
| 91 | gLeaves[i] = leaf; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 92 | int sprite = randf(LEAVES_TEXTURES_COUNT); |
Romain Guy | 2d42794 | 2009-10-14 15:43:27 -0700 | [diff] [blame] | 93 | leaf->x = randf2(-width * 0.5f, width * 0.5f); |
| 94 | leaf->y = randf2(-height * 0.5f, height * 0.5f); |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 95 | leaf->scale = randf2(0.4f, 0.5f); |
| 96 | leaf->angle = randf2(0.0f, 360.0f); |
Romain Guy | 2d42794 | 2009-10-14 15:43:27 -0700 | [diff] [blame] | 97 | leaf->spin = degf(randf2(-0.02f, 0.02f)) * 0.25f; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 98 | leaf->u1 = sprite / (float) LEAVES_TEXTURES_COUNT; |
| 99 | leaf->u2 = (sprite + 1) / (float) LEAVES_TEXTURES_COUNT; |
| 100 | leaf->altitude = -1.0f; |
| 101 | leaf->rippled = 1.0f; |
Jason Sams | 756f974 | 2009-11-15 10:16:07 -0800 | [diff] [blame] | 102 | leaf->deltaX = randf2(-0.02f, 0.02f) / 2.0f; |
| 103 | leaf->deltaY = -0.08f * randf2(0.9f, 1.1f) / 2.0f; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 104 | leaf++; |
| 105 | } |
| 106 | } |
| 107 | |
Jason Sams | b344cf4 | 2009-11-06 11:50:42 -0800 | [diff] [blame] | 108 | void updateDrop(int ct) { |
Jason Sams | 756f974 | 2009-11-15 10:16:07 -0800 | [diff] [blame] | 109 | gDrops[ct].spread += 30.f * g_DT; |
Jason Sams | b344cf4 | 2009-11-06 11:50:42 -0800 | [diff] [blame] | 110 | gDrops[ct].spread2 = gDrops[ct].spread * gDrops[ct].spread; |
| 111 | gDrops[ct].invSpread = 1 / gDrops[ct].spread; |
| 112 | gDrops[ct].invSpread2 = gDrops[ct].invSpread * gDrops[ct].invSpread; |
| 113 | gDrops[ct].ampE = gDrops[ct].ampS * gDrops[ct].invSpread; |
| 114 | } |
| 115 | |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 116 | void drop(int x, int y, float s) { |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 117 | int ct; |
| 118 | int iMin = 0; |
| 119 | float minAmp = 10000.f; |
| 120 | for (ct = 0; ct < gMaxDrops; ct++) { |
Jason Sams | b344cf4 | 2009-11-06 11:50:42 -0800 | [diff] [blame] | 121 | if (gDrops[ct].ampE < minAmp) { |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 122 | iMin = ct; |
Jason Sams | b344cf4 | 2009-11-06 11:50:42 -0800 | [diff] [blame] | 123 | minAmp = gDrops[ct].ampE; |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 124 | } |
| 125 | } |
Jason Sams | b344cf4 | 2009-11-06 11:50:42 -0800 | [diff] [blame] | 126 | gDrops[iMin].ampS = s; |
| 127 | gDrops[iMin].spread = 0; |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 128 | gDrops[iMin].x = x; |
| 129 | gDrops[iMin].y = State->meshHeight - y - 1; |
Jason Sams | b344cf4 | 2009-11-06 11:50:42 -0800 | [diff] [blame] | 130 | updateDrop(iMin); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 131 | } |
| 132 | |
| 133 | void generateRipples() { |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 134 | int rippleMapSize = State->rippleMapSize; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 135 | int width = State->meshWidth; |
| 136 | int height = State->meshHeight; |
| 137 | int index = State->rippleIndex; |
Jason Sams | 873e993 | 2009-10-22 14:03:52 -0700 | [diff] [blame] | 138 | float ratio = (float)State->meshWidth / State->glWidth; |
| 139 | float xShift = State->xOffset * ratio * 2; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 140 | |
Jason Sams | 2430b67 | 2009-09-24 13:01:52 -0700 | [diff] [blame] | 141 | float *vertices = loadSimpleMeshVerticesF(NAMED_WaterMesh, 0); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 142 | struct vert_s *vert = (struct vert_s *)vertices; |
| 143 | |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 144 | float fw = 1.0f / width; |
| 145 | float fh = 1.0f / height; |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 146 | int x, y, ct; |
| 147 | struct vert_s *v = vert; |
| 148 | for (y=0; y < height; y++) { |
| 149 | for (x=0; x < width; x++) { |
| 150 | struct drop_s * d = &gDrops[0]; |
| 151 | float z = 0; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 152 | |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 153 | for (ct = 0; ct < gMaxDrops; ct++) { |
| 154 | if (d->ampE > 0.01f) { |
| 155 | float dx = (d->x - xShift) - x; |
| 156 | float dy = d->y - y; |
| 157 | float dist2 = dx*dx + dy*dy; |
| 158 | if (dist2 < d->spread2) { |
| 159 | float dist = sqrtf(dist2); |
| 160 | float a = d->ampE * (dist * d->invSpread); |
| 161 | z += sinf(d->spread - dist) * a; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 162 | } |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 163 | } |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 164 | d++; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 165 | } |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 166 | v->z = z; |
| 167 | v ++; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 168 | } |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 169 | } |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 170 | for (ct = 0; ct < gMaxDrops; ct++) { |
| 171 | updateDrop(ct); |
| 172 | } |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 173 | |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 174 | v = vert; |
| 175 | for (y = 0; y < height; y += 1) { |
| 176 | for (x = 0; x < width; x += 1) { |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 177 | struct vec3_s n1, n2, n3; |
| 178 | vec3Sub(&n1, (struct vec3_s *)&(v+1)->x, (struct vec3_s *)&v->x); |
| 179 | vec3Sub(&n2, (struct vec3_s *)&(v+width)->x, (struct vec3_s *)&v->x); |
| 180 | vec3Cross(&n3, &n1, &n2); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 181 | |
| 182 | // Average of previous normal and N1 x N2 |
| 183 | vec3Sub(&n1, (struct vec3_s *)&(v+width+1)->x, (struct vec3_s *)&v->x); |
| 184 | vec3Cross(&n2, &n1, &n2); |
| 185 | vec3Add(&n3, &n3, &n2); |
Jason Sams | b344cf4 | 2009-11-06 11:50:42 -0800 | [diff] [blame] | 186 | //vec3Norm(&n3); // Not necessary for our constrained mesh. |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 187 | |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 188 | v->s = (float)x * fw + n3.x;// * 0.2; |
| 189 | v->t = (float)y * fh + n3.y;// * 0.2; |
| 190 | v->z = 0; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 191 | v += 1; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 192 | } |
| 193 | } |
| 194 | } |
| 195 | |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 196 | void genLeafDrop(struct Leaves_s *leaf, float amp) { |
| 197 | float nx = (leaf->x + State->glWidth * 0.5f) / State->glWidth; |
| 198 | float ny = (leaf->y + State->glHeight * 0.5f) / State->glHeight; |
| 199 | drop(nx * State->meshWidth, State->meshHeight - ny * State->meshHeight, amp); |
| 200 | |
| 201 | } |
| 202 | |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 203 | int drawLeaf(struct Leaves_s *leaf) { |
Romain Guy | a6d4d98 | 2009-10-15 12:37:13 -0700 | [diff] [blame] | 204 | |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 205 | float x = leaf->x; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 206 | float y = leaf->y; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 207 | |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 208 | float u1 = leaf->u1; |
| 209 | float u2 = leaf->u2; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 210 | |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 211 | float a = leaf->altitude; |
| 212 | float s = leaf->scale; |
| 213 | float r = leaf->angle; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 214 | |
| 215 | float tz = 0.0f; |
| 216 | if (a > 0.0f) { |
| 217 | tz = -a; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 218 | } |
| 219 | |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 220 | float matrix[16]; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 221 | if (a > 0.0f) { |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 222 | |
Mike Cleron | fc6bdef | 2009-11-10 13:31:30 -0800 | [diff] [blame] | 223 | float alpha = 1.0f; |
Mike Cleron | 701a47f | 2009-11-10 12:55:26 -0800 | [diff] [blame] | 224 | if (a >= 0.4f) alpha = 1.0f - (a - 0.4f) / 0.1f; |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 225 | |
Mike Cleron | 701a47f | 2009-11-10 12:55:26 -0800 | [diff] [blame] | 226 | color(0.0f, 0.0f, 0.0f, alpha * 0.15f); |
Romain Guy | a6d4d98 | 2009-10-15 12:37:13 -0700 | [diff] [blame] | 227 | |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 228 | if (State->rotate) { |
Romain Guy | a6d4d98 | 2009-10-15 12:37:13 -0700 | [diff] [blame] | 229 | matrixLoadRotate(matrix, 90.0f, 0.0f, 0.0f, 1.0f); |
| 230 | } else { |
| 231 | matrixLoadIdentity(matrix); |
| 232 | } |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 233 | |
Mike Cleron | 701a47f | 2009-11-10 12:55:26 -0800 | [diff] [blame] | 234 | float shadowOffet = a / 5; |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 235 | |
Mike Cleron | 701a47f | 2009-11-10 12:55:26 -0800 | [diff] [blame] | 236 | matrixTranslate(matrix, (x - State->xOffset * 2) + (shadowOffet / 2), y - shadowOffet, tz); |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 237 | matrixScale(matrix, s, s, 1.0f); |
| 238 | matrixRotate(matrix, r, 0.0f, 0.0f, 1.0f); |
| 239 | vpLoadModelMatrix(matrix); |
| 240 | |
Jason Sams | 873e993 | 2009-10-22 14:03:52 -0700 | [diff] [blame] | 241 | drawQuadTexCoords(-LEAF_SIZE, -LEAF_SIZE, 0, u1, 1.0f, |
| 242 | LEAF_SIZE, -LEAF_SIZE, 0, u2, 1.0f, |
| 243 | LEAF_SIZE, LEAF_SIZE, 0, u2, 0.0f, |
| 244 | -LEAF_SIZE, LEAF_SIZE, 0, u1, 0.0f); |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 245 | |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 246 | color(1.0f, 1.0f, 1.0f, alpha); |
| 247 | } else { |
| 248 | color(1.0f, 1.0f, 1.0f, 1.0f); |
| 249 | } |
| 250 | |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 251 | if (State->rotate) { |
Romain Guy | a6d4d98 | 2009-10-15 12:37:13 -0700 | [diff] [blame] | 252 | matrixLoadRotate(matrix, 90.0f, 0.0f, 0.0f, 1.0f); |
| 253 | } else { |
| 254 | matrixLoadIdentity(matrix); |
| 255 | } |
Jason Sams | 873e993 | 2009-10-22 14:03:52 -0700 | [diff] [blame] | 256 | matrixTranslate(matrix, x - State->xOffset * 2, y, tz); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 257 | matrixScale(matrix, s, s, 1.0f); |
| 258 | matrixRotate(matrix, r, 0.0f, 0.0f, 1.0f); |
| 259 | vpLoadModelMatrix(matrix); |
| 260 | |
Jason Sams | 873e993 | 2009-10-22 14:03:52 -0700 | [diff] [blame] | 261 | drawQuadTexCoords(-LEAF_SIZE, -LEAF_SIZE, 0, u1, 1.0f, |
| 262 | LEAF_SIZE, -LEAF_SIZE, 0, u2, 1.0f, |
| 263 | LEAF_SIZE, LEAF_SIZE, 0, u2, 0.0f, |
| 264 | -LEAF_SIZE, LEAF_SIZE, 0, u1, 0.0f); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 265 | |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 266 | float spin = leaf->spin; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 267 | if (a <= 0.0f) { |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 268 | float rippled = leaf->rippled; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 269 | if (rippled < 0.0f) { |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 270 | genLeafDrop(leaf, 1.5f); |
| 271 | //drop(((x + State->glWidth * 0.5f) / State->glWidth) * meshWidth, |
| 272 | // meshHeight - ((y + State->glHeight * 0.5f) / State->glHeight) * meshHeight, 1); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 273 | spin /= 4.0f; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 274 | leaf->spin = spin; |
| 275 | leaf->rippled = 1.0f; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 276 | } |
Jason Sams | 756f974 | 2009-11-15 10:16:07 -0800 | [diff] [blame] | 277 | leaf->x = x + leaf->deltaX * g_DT; |
| 278 | leaf->y = y + leaf->deltaY * g_DT; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 279 | r += spin; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 280 | leaf->angle = r; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 281 | } else { |
Jason Sams | 756f974 | 2009-11-15 10:16:07 -0800 | [diff] [blame] | 282 | a -= 0.15f * g_DT; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 283 | leaf->altitude = a; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 284 | r += spin * 2.0f; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 285 | leaf->angle = r; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 286 | } |
| 287 | |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 288 | int newLeaf = 0; |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 289 | if (-LEAF_SIZE * s + x > State->glWidth || LEAF_SIZE * s + x < -State->glWidth || |
| 290 | LEAF_SIZE * s + y < -State->glHeight / 2.0f) { |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 291 | |
| 292 | int sprite = randf(LEAVES_TEXTURES_COUNT); |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 293 | leaf->x = randf2(-State->glWidth, State->glWidth); |
| 294 | leaf->y = randf2(-State->glHeight * 0.5f, State->glHeight * 0.5f); |
Jason Sams | 756f974 | 2009-11-15 10:16:07 -0800 | [diff] [blame] | 295 | |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 296 | leaf->scale = randf2(0.4f, 0.5f); |
Mike Cleron | 70ebeb8 | 2009-11-12 07:49:08 -0800 | [diff] [blame] | 297 | leaf->spin = degf(randf2(-0.02f, 0.02f)) * 0.35f; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 298 | leaf->u1 = sprite / (float) LEAVES_TEXTURES_COUNT; |
| 299 | leaf->u2 = (sprite + 1) / (float) LEAVES_TEXTURES_COUNT; |
Mike Cleron | 70ebeb8 | 2009-11-12 07:49:08 -0800 | [diff] [blame] | 300 | leaf->altitude = 0.7f; |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 301 | leaf->rippled = -1.0f; |
Jason Sams | 756f974 | 2009-11-15 10:16:07 -0800 | [diff] [blame] | 302 | leaf->deltaX = randf2(-0.02f, 0.02f) / 2.0f; |
| 303 | leaf->deltaY = -0.08f * randf2(0.9f, 1.1f) / 2.0f; |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 304 | leaf->newLeaf = 1; |
| 305 | newLeaf = 1; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 306 | } |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 307 | return newLeaf; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 308 | } |
| 309 | |
| 310 | void drawLeaves() { |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 311 | bindProgramFragment(NAMED_PFSky); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 312 | bindProgramFragmentStore(NAMED_PFSLeaf); |
| 313 | bindProgramVertex(NAMED_PVSky); |
Romain Guy | 59014c6 | 2009-10-09 12:27:18 -0700 | [diff] [blame] | 314 | bindTexture(NAMED_PFSky, 0, NAMED_TLeaves); |
| 315 | |
| 316 | color(1.0f, 1.0f, 1.0f, 1.0f); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 317 | |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 318 | int newLeaves = 0; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 319 | int i = 0; |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 320 | for ( ; i < LEAVES_COUNT; i += 1) { |
| 321 | if (drawLeaf(gLeaves[i])) { |
| 322 | newLeaves = 1; |
| 323 | |
| 324 | } |
| 325 | } |
| 326 | |
| 327 | if (newLeaves > 0) { |
| 328 | int index = 0; |
| 329 | |
| 330 | // Copy all the old leaves to the beginning of gNextLeaves |
| 331 | for (i=0; i < LEAVES_COUNT; i++) { |
| 332 | if (gLeaves[i]->newLeaf == 0) { |
| 333 | gNextLeaves[index] = gLeaves[i]; |
| 334 | index++; |
| 335 | } |
| 336 | } |
| 337 | |
| 338 | // Now copy all the newly falling leaves to the end of gNextLeaves |
| 339 | for (i=0; i < LEAVES_COUNT; i++) { |
| 340 | if (gLeaves[i]->newLeaf > 0) { |
| 341 | gNextLeaves[index] = gLeaves[i]; |
| 342 | gNextLeaves[index]->newLeaf = 0; |
| 343 | index++; |
| 344 | } |
| 345 | } |
| 346 | |
| 347 | // And move everything in gNextLeaves back to gLeaves |
| 348 | for (i=0; i < LEAVES_COUNT; i++) { |
| 349 | gLeaves[i] = gNextLeaves[i]; |
| 350 | } |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 351 | } |
| 352 | |
| 353 | float matrix[16]; |
| 354 | matrixLoadIdentity(matrix); |
| 355 | vpLoadModelMatrix(matrix); |
| 356 | } |
| 357 | |
| 358 | void drawRiverbed() { |
| 359 | bindTexture(NAMED_PFBackground, 0, NAMED_TRiverbed); |
| 360 | |
Jason Sams | 873e993 | 2009-10-22 14:03:52 -0700 | [diff] [blame] | 361 | float matrix[16]; |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 362 | matrixLoadScale(matrix, 0.5f * 960.0f / 1024.0f, -1.0f * 800.0f / 1024.0f, 1.0f); |
Jason Sams | b1cafe5 | 2009-10-27 18:20:55 -0700 | [diff] [blame] | 363 | matrixTranslate(matrix, State->xOffset, 0.0f, 0.0f); |
Jason Sams | 873e993 | 2009-10-22 14:03:52 -0700 | [diff] [blame] | 364 | vpLoadTextureMatrix(matrix); |
Jason Sams | b1cafe5 | 2009-10-27 18:20:55 -0700 | [diff] [blame] | 365 | |
Jason Sams | 2430b67 | 2009-09-24 13:01:52 -0700 | [diff] [blame] | 366 | drawSimpleMesh(NAMED_WaterMesh); |
Jason Sams | b1cafe5 | 2009-10-27 18:20:55 -0700 | [diff] [blame] | 367 | |
| 368 | matrixLoadIdentity(matrix); |
| 369 | vpLoadTextureMatrix(matrix); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 370 | } |
| 371 | |
Mike Cleron | fc6bdef | 2009-11-10 13:31:30 -0800 | [diff] [blame] | 372 | /* |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 373 | void drawSky() { |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 374 | color(1.0f, 1.0f, 1.0f, 0.5f); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 375 | |
| 376 | bindProgramFragment(NAMED_PFSky); |
| 377 | bindProgramFragmentStore(NAMED_PFSLeaf); |
| 378 | bindTexture(NAMED_PFSky, 0, NAMED_TSky); |
| 379 | |
Romain Guy | f0bb956 | 2009-10-07 12:25:24 -0700 | [diff] [blame] | 380 | float x = skyOffsetX + State->skySpeedX; |
| 381 | float y = skyOffsetY + State->skySpeedY; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 382 | |
| 383 | if (x > 1.0f) x = 0.0f; |
| 384 | if (x < -1.0f) x = 0.0f; |
| 385 | if (y > 1.0f) y = 0.0f; |
| 386 | |
Romain Guy | f0bb956 | 2009-10-07 12:25:24 -0700 | [diff] [blame] | 387 | skyOffsetX = x; |
| 388 | skyOffsetY = y; |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 389 | |
| 390 | float matrix[16]; |
Jason Sams | 873e993 | 2009-10-22 14:03:52 -0700 | [diff] [blame] | 391 | matrixLoadTranslate(matrix, x + State->xOffset, y, 0.0f); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 392 | vpLoadTextureMatrix(matrix); |
| 393 | |
Jason Sams | 2430b67 | 2009-09-24 13:01:52 -0700 | [diff] [blame] | 394 | drawSimpleMesh(NAMED_WaterMesh); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 395 | |
| 396 | matrixLoadIdentity(matrix); |
| 397 | vpLoadTextureMatrix(matrix); |
| 398 | } |
Mike Cleron | fc6bdef | 2009-11-10 13:31:30 -0800 | [diff] [blame] | 399 | */ |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 400 | |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 401 | int main(int index) { |
Jason Sams | 756f974 | 2009-11-15 10:16:07 -0800 | [diff] [blame] | 402 | // Compute dt in seconds. |
| 403 | int newTime = uptimeMillis(); |
| 404 | g_DT = (newTime - g_LastTime) / 1000.f; |
| 405 | g_LastTime = newTime; |
| 406 | g_DT = minf(g_DT, 0.2f); |
| 407 | |
| 408 | |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 409 | if (Drop->dropX != -1) { |
Jason Sams | 73f2f5f | 2009-11-10 16:13:23 -0800 | [diff] [blame] | 410 | drop(Drop->dropX, Drop->dropY, 2); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 411 | Drop->dropX = -1; |
| 412 | Drop->dropY = -1; |
| 413 | } |
Romain Guy | 2d42794 | 2009-10-14 15:43:27 -0700 | [diff] [blame] | 414 | |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 415 | int ct; |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 416 | int add = 0; |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 417 | for (ct = 0; ct < gMaxDrops; ct++) { |
Jason Sams | b344cf4 | 2009-11-06 11:50:42 -0800 | [diff] [blame] | 418 | if (gDrops[ct].ampE < 0.005f) { |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 419 | add = 1; |
| 420 | } |
Jason Sams | 2cfcc6d | 2009-10-21 17:51:46 -0700 | [diff] [blame] | 421 | } |
Romain Guy | 2d42794 | 2009-10-14 15:43:27 -0700 | [diff] [blame] | 422 | |
Jason Sams | 6eec598 | 2009-10-23 17:47:12 -0700 | [diff] [blame] | 423 | if (add) { |
Mike Cleron | 5b219fc | 2009-11-19 23:23:13 -0800 | [diff] [blame^] | 424 | int i = (int)randf(LEAVES_COUNT); |
| 425 | genLeafDrop(gLeaves[i], randf(0.3f) + 0.1f); |
Romain Guy | a454eca | 2009-10-14 18:22:20 -0700 | [diff] [blame] | 426 | } |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 427 | |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 428 | generateRipples(); |
Jason Sams | 2430b67 | 2009-09-24 13:01:52 -0700 | [diff] [blame] | 429 | updateSimpleMesh(NAMED_WaterMesh); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 430 | |
Romain Guy | a6d4d98 | 2009-10-15 12:37:13 -0700 | [diff] [blame] | 431 | if (State->rotate) { |
| 432 | float matrix[16]; |
| 433 | matrixLoadRotate(matrix, 90.0f, 0.0f, 0.0f, 1.0f); |
| 434 | vpLoadModelMatrix(matrix); |
| 435 | } |
| 436 | |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 437 | drawRiverbed(); |
Mike Cleron | 701a47f | 2009-11-10 12:55:26 -0800 | [diff] [blame] | 438 | // drawSky(); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 439 | drawLeaves(); |
Romain Guy | 59206df | 2009-09-09 13:07:58 -0700 | [diff] [blame] | 440 | |
| 441 | return 1; |
| 442 | } |