void DXPointLight::DrawShadowMap(LPDIRECT3DDEVICE9 device, LPD3DXEFFECT effect, void (*drawcallback)(LPD3DXEFFECT)) { if( !shadowmap || !needsredraw ) return; LPDIRECT3DSURFACE9 surface = NULL; D3DXMATRIX vp; effect->SetVector("lightPos", (D3DXVECTOR4*)&position); for( int j = 0; j < 6; ++j ) { GetViewProjMatrix(vp, j); effect->SetMatrix("matViewProj", &vp); shadowmap->GetCubeMapSurface((D3DCUBEMAP_FACES)j, 0, &surface); device->SetRenderTarget(0, surface); device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0xff000000, 1.0f, 0); drawcallback(effect); surface->Release(); } if( shadowtype == Static ) needsredraw = false; }
void DXDirectionalLight::DrawShadowMap(LPDIRECT3DDEVICE9 device, LPD3DXEFFECT effect, void (*drawcallback)(LPD3DXEFFECT)) { if( !shadowmap || !needsredraw ) return; LPDIRECT3DSURFACE9 surface = NULL; D3DXMATRIX vp; GetViewProjMatrix(vp, D3DXVECTOR3(0, 0, 0)); effect->SetVector("lightPos", &direction); effect->SetMatrix("matViewProj", &vp); shadowmap->GetSurfaceLevel(0, &surface); device->SetRenderTarget(0, surface); device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0xff000000, 1.0f, 0); drawcallback(effect); surface->Release(); if( shadowtype == Static ) needsredraw = false; }
Export int PathFind_Vector(FPoint *start, FPoint *end, FLine *obstructions, int obstructioncount, FPoint *pathbuffer, int pathbuffersize, Image* drawbuffer, drawcbk* drawcallback) { if (!start) return Failure; if (!end) return Failure; if (!obstructions) return Failure; //if (!pathbuffer) return Failure; //if (pathbuffersize < 2) return Failure; if (obstructioncount < 1) { pathbuffer[0] = *start; pathbuffer[1] = *end; return Trivial_Success; } treeNode *root = new treeNode(*start); treeNode *tail = new treeNode(*end); treeNode *current, *newnode; root->pushLeft(tail); FLine currentLine; FPoint where, newpoint; FPoint vector, newvector; float vector_length, vector_angle; int leaf = 0, closest_obstruction; float closest_obstruction_distance; stateStack stack; stack.push_front(buildState(root, Null)); drawbuffer->clear(); drawTree(drawbuffer, root); drawcallback(); while (stack.size() > 0) { leaf = stack.front().leaf; switch (leaf) { case 0: current = stack.front().node->left; stack.front().leaf++; break; case 1: current = stack.front().node->right; stack.front().leaf++; break; case 2: stack.pop_front(); continue; break; } if (current) { currentLine.Start = current->up->point; currentLine.End = current->point; closest_obstruction = -1; closest_obstruction_distance = 999999; for (int o = 0; o < obstructioncount; o++) { bool skip = false; if (currentLine.intersect(obstructions[o], where)) { for (stateStack::iterator iter = stack.begin(); iter != stack.end(); iter++) { if (iter->obstruction == &(obstructions[o])) { skip = true; break; } } if (!skip) { vector = FLine(current->up->point, where).vector(); if (vector.length() < closest_obstruction_distance) { closest_obstruction = o; closest_obstruction_distance = vector.length(); } } } } if (closest_obstruction > -1) { if (stack.front().node->depth < max_tree_depth) { vector = FLine(obstructions[closest_obstruction].Start, obstructions[closest_obstruction].End).vector(); vector_length = vector.length(); vector_angle = AngleBetween(obstructions[closest_obstruction].Start, obstructions[closest_obstruction].End); vector.X = sin(vector_angle * Radian); vector.Y = -cos(vector_angle * Radian); newvector = vector; newvector *= (-1); newpoint = obstructions[closest_obstruction].Start; newpoint += FPoint(newvector.X, newvector.Y); newnode = new treeNode(newpoint); newnode->pushLeft(new treeNode(*end)); current->up->pushLeft(newnode); newvector = vector; newvector *= (vector_length + 1); newpoint = obstructions[closest_obstruction].Start; newpoint += FPoint(newvector.X, newvector.Y); newnode = new treeNode(newpoint); newnode->pushLeft(new treeNode(*end)); current->up->pushRight(newnode); if (leaf == 0) { if (current->up->left) stack.push_front(buildState(current->up->left, &(obstructions[closest_obstruction]))); } else { if (current->up->right) stack.push_front(buildState(current->up->right, &(obstructions[closest_obstruction]))); } } } } drawbuffer->clear(); drawTree(drawbuffer, root); if (current) drawbuffer->setPixelAA(current->point.X, current->point.Y, Pixel(0,0,255,255)); drawcallback(); } return Success; }